From 1524d07d0997f784fde54612b5c2611b9a9a14f7 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: Tue, 15 Dec 2020 13:43:00 +0300 Subject: [PATCH] 3_1_4_96 --- .../Задание/ManagerModule.bsl | 8 +- .../Задание/ObjectModule.bsl | 2 - .../Forms/ПараметрыПрописиВалюты_en/Form.form | 797 ++++ .../ПараметрыПрописиВалюты_en}/Help/ru.html | 0 .../ПараметрыПрописиВалюты_en/Module.bsl | 138 + .../Form.form | 512 +++ .../Module.bsl | 530 +++ .../Валюты/Forms/ФормаЭлемента/Form.form | 279 +- .../Валюты/Forms/ФормаЭлемента/Module.bsl | 159 +- SSL/src/Catalogs/Валюты/ManagerModule.bsl | 2 +- SSL/src/Catalogs/Валюты/Валюты.mdo | 82 + .../ВариантыОтветовАнкет/ManagerModule.bsl | 2 +- .../Forms/РазмещениеВРазделах/Module.bsl | 3 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 41 +- .../ВариантыОтчетов/ManagerModule.bsl | 18 +- .../Catalogs/ВариантыОтчетов/ObjectModule.bsl | 5 +- .../ВерсииРасширений/ManagerModule.bsl | 5 +- .../ВерсииФайлов/Forms/ВерсииФайла/Module.bsl | 2 +- .../Catalogs/ВерсииФайлов/ManagerModule.bsl | 6 +- .../Catalogs/ВерсииФайлов/ObjectModule.bsl | 4 +- .../Forms/ФормаЭлемента/Module.bsl | 31 +- .../ManagerModule.bsl | 43 +- .../ВидыКонтактнойИнформации/ObjectModule.bsl | 7 +- .../Catalogs/ВидыПроверок/ManagerModule.bsl | 6 +- .../Form.form | 17 +- .../Module.bsl | 2 +- .../ПоискКомпонентыНаПортале1СИТС/Form.form | 8 - .../ВнешниеКомпоненты/ManagerModule.bsl | 4 +- .../Forms/ФормаСписка/Module.bsl | 18 +- .../Forms/ФормаЭлемента/Form.form | 155 + .../Forms/ФормаЭлемента/Module.bsl | 533 ++- .../ВнешниеПользователи/ManagerModule.bsl | 68 +- .../ВопросыШаблонаАнкеты/ManagerModule.bsl | 2 +- .../ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 45 +- .../Catalogs/ГруппыДоступа/ManagerModule.bsl | 62 +- .../ГруппыИсполнителейЗадач/ManagerModule.bsl | 2 +- .../ГруппыПользователей/ManagerModule.bsl | 42 + .../Forms/ФормаЭлемента/Module.bsl | 4 +- .../ManagerModule.bsl | 6 +- .../ЗакладкиВзаимодействий/ManagerModule.bsl | 2 +- SSL/src/Catalogs/Заметки/ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 6 +- .../Forms/ФормаГруппы/Module.bsl | 32 +- .../Forms/ФормаЭлемента/Module.bsl | 32 +- .../ЗначенияСвойствОбъектов/ManagerModule.bsl | 18 +- .../ЗначенияСвойствОбъектов/ObjectModule.bsl | 7 +- .../Forms/ФормаЭлемента/Module.bsl | 32 +- .../ManagerModule.bsl | 18 +- .../ObjectModule.bsl | 7 +- .../ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 4 +- .../КлассификаторБанков/ManagerModule.bsl | 2 +- .../Forms/ФормаСписка/Module.bsl | 2 - .../ManagerModule.bsl | 16 +- .../ОбщиеВнешниеКомпоненты/ManagerModule.bsl | 4 +- .../Catalogs/ПапкиФайлов/ManagerModule.bsl | 30 +- .../Forms/ФормаВыбора/Module.bsl | 3 - .../ПапкиЭлектронныхПисем/ManagerModule.bsl | 6 +- .../Пользователи/Forms/ВводПароля/Form.form | 197 + .../Пользователи/Forms/ВводПароля/Module.bsl | 27 + .../Пользователи/Forms/ФормаСписка/Form.form | 493 ++- .../Forms/ФормаЭлемента/Form.form | 206 + .../Forms/ФормаЭлемента/Module.bsl | 253 +- .../Catalogs/Пользователи/ManagerModule.bsl | 78 +- .../Catalogs/Пользователи/ObjectModule.bsl | 2 +- .../Catalogs/Пользователи/Пользователи.mdo | 9 + .../ManagerModule.bsl | 6 +- .../Forms/ПрименениеПравил/Module.bsl | 4 +- .../ManagerModule.bsl | 6 +- .../ПравилаПроверкиУчета/ObjectModule.bsl | 2 + .../ManagerModule.bsl | 16 +- .../ManagerModule.bsl | 16 +- .../ОшибкаОбращенияКПрограмме/Module.bsl | 6 +- .../Forms/ФормаЭлемента/Form.form | 2 +- .../ManagerModule.bsl | 2 +- .../ManagerModule.bsl | 152 +- .../ПрофилиГруппДоступа/ManagerModule.bsl | 110 +- .../Forms/ФормаЭлемента/Module.bsl | 4 +- .../Forms/ПолучателиРассылки/Module.bsl | 3 +- .../Forms/Предупреждение/Form.form | 12 - .../Forms/Предупреждение/Module.bsl | 25 +- .../Forms/ФормаСписка/Form.form | 7 +- .../РассылкиОтчетов/ManagerModule.bsl | 39 +- .../Forms/ФормаВыбора/Module.bsl | 5 +- .../Forms/ФормаСписка/Module.bsl | 5 +- .../Forms/ФормаЭлемента/Module.bsl | 33 +- .../РолиИсполнителей/ManagerModule.bsl | 92 +- .../РолиИсполнителей/ObjectModule.bsl | 5 +- .../Module.bsl | 14 +- .../Module.bsl | 8 +- .../Forms/ПроверкаСертификата/Module.bsl | 2 +- .../ManagerModule.bsl | 2 +- .../Templates/Штамп/Template.mxlx | 89 +- .../ManagerModule.bsl | 7 +- .../Forms/ФормаСписка/Module.bsl | 22 +- .../ManagerModule.bsl | 15 +- SSL/src/Catalogs/СтраныМира/ManagerModule.bsl | 48 +- SSL/src/Catalogs/СтраныМира/ObjectModule.bsl | 149 +- .../ManagerModule.bsl | 2 +- .../СценарииОбменовДанными/ManagerModule.bsl | 2 +- .../ManagerModule.bsl | 6 +- .../УдалениеЛишнихФайловИзТома/Form.form | 12 - .../УдалениеЛишнихФайловИзТома/Module.bsl | 19 +- .../Forms/ФормаЭлемента/Form.form | 6 +- .../Forms/ФормаЭлемента/Help/ru.html | 37 +- .../Catalogs/ТомаХраненияФайлов/Help/ru.html | 51 +- .../ТомаХраненияФайлов/ManagerModule.bsl | 6 +- .../ТомаХраненияФайлов/ObjectModule.bsl | 6 +- .../ManagerModule.bsl | 4 +- .../Forms/ФормаЭлемента/Module.bsl | 4 +- .../ManagerModule.bsl | 28 +- .../ObjectModule.bsl | 40 + .../Файлы/Forms/ФормаНового/Form.form | 4 - .../Файлы/Forms/ФормаПеретаскивания/Form.form | 28 - SSL/src/Catalogs/Файлы/ManagerModule.bsl | 8 +- .../Catalogs/ШаблоныАнкет/ManagerModule.bsl | 2 +- .../ЗаполнитьПроизвольныеПараметры/Module.bsl | 1 + .../Forms/ФормаСписка/Module.bsl | 60 +- .../Forms/ФормаЭлемента/Module.bsl | 1 - .../ШаблоныСообщений/ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 6 +- .../ПодборЯзыкаИзСпискаДоступных/Form.form | 579 +++ .../ПодборЯзыкаИзСпискаДоступных/Module.bsl | 166 + .../Список/ExtInfo/ListSettings.dcss | 21 + .../Forms/ФормаСписка/Form.form | 580 +++ .../Forms/ФормаСписка/Module.bsl | 233 + .../Forms/ФормаЭлемента/Form.form | 157 + .../Forms/ФормаЭлемента/Module.bsl | 54 + .../ЯзыкиПечатныхФорм/ManagerModule.bsl | 105 + .../ЯзыкиПечатныхФорм/ObjectModule.bsl | 0 .../ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo | 167 + .../ВопросыДляАнкетирования/ManagerModule.bsl | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 86 +- .../ManagerModule.bsl | 36 +- .../ObjectModule.bsl | 10 +- .../Forms/ФормаСписка/Module.bsl | 5 +- .../Forms/ФормаЭлемента/Module.bsl | 33 +- .../ОбъектыАдресацииЗадач/ManagerModule.bsl | 82 +- .../ОбъектыАдресацииЗадач/ObjectModule.bsl | 5 +- .../ManagerModule.bsl | 2 +- .../CommandModule.bsl | 16 +- .../CommonForms/АвтономнаяРабота/Form.form | 8 - .../АвтономнаяРаботаВМоделиСервиса/Form.form | 24 - .../АвтономнаяРаботаВМоделиСервиса/Module.bsl | 4 +- .../АутентификацияВСервисе/Module.bsl | 36 +- .../Form.form | 12 - .../CommonForms/ВводНаРазныхЯзыках/Form.form | 104 +- .../CommonForms/ВводНаРазныхЯзыках/Module.bsl | 91 +- SSL/src/CommonForms/Вопрос/Form.form | 9 - .../Form.form | 4 - .../ВосстановлениеПаролей/Form.form | 2386 +++++++++++ .../ВосстановлениеПаролей/Module.bsl | 535 +++ .../ВосстановлениеПаролей.mdo | 11 + .../Form.form | 12 - .../ВыборОбъектовМетаданных/Module.bsl | 55 +- .../ВыборРолиИсполнителя/Form.form | 8 - .../ГруппыПользователей/Module.bsl | 2 +- .../CommonForms/ДлительнаяОперация/Form.form | 4 - .../Form.form | 8 - .../Module.bsl | 8 +- .../КонтрольДинамическогоОбновления/Form.form | 12 + .../НастройкаКолонтитулов/Module.bsl | 2 +- .../НастройкаКомандПечати/Module.bsl | 2 +- .../НастройкаПереводаТекста/Form.form | 275 ++ .../НастройкаПереводаТекста/Module.bsl | 132 + .../НастройкаПереводаТекста.mdo | 11 + .../НастройкаРабочегоКаталога/Form.form | 4 - .../Form.form | 2 +- .../Form.form | 8 - .../Module.bsl | 19 - .../CommonForms/ОтправкаСообщения/Module.bsl | 4 +- SSL/src/CommonForms/ПанельОтчетов/Module.bsl | 17 +- .../ПараметрыПроксиСервера/Module.bsl | 2 +- .../CommonForms/ПечатьДокументов/Form.form | 83 + .../CommonForms/ПечатьДокументов/Module.bsl | 96 +- .../Form.form | 16 - .../Module.bsl | 7 +- .../CommonForms/ПустойРабочийСтол/Form.form | 4 - SSL/src/CommonForms/Расширения/Module.bsl | 5 +- .../РегиональныеНастройки/Module.bsl | 21 - .../Form.form | 386 +- .../Module.bsl | 242 +- .../CommonForms/СвязанныеДокументы/Module.bsl | 98 +- SSL/src/CommonForms/Сертификат/Form.form | 20 - .../Form.form | 8 - .../Form.form | 4 - .../CommonForms/ФормаНастроекОтчета/Form.form | 516 ++- .../ФормаНастроекОтчета/Module.bsl | 200 +- SSL/src/CommonForms/ФормаОтчета/Form.form | 2391 ++++++++++- SSL/src/CommonForms/ФормаОтчета/Module.bsl | 347 +- SSL/src/CommonForms/ФормаПоиска/Form.form | 20 - .../GoogleПереводчик/GoogleПереводчик.mdo | 11 + .../CommonModules/GoogleПереводчик/Module.bsl | 211 + .../CommonModules/АвтономнаяРабота/Module.bsl | 4 +- .../АвтономнаяРаботаСлужебный/Module.bsl | 50 +- .../АдминистрированиеКластера/Module.bsl | 188 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../АдресныйКлассификаторКлиент/Module.bsl | 14 +- .../АдресныйКлассификаторСлужебный/Module.bsl | 154 +- .../CommonModules/Анкетирование/Module.bsl | 95 +- .../Module.bsl | 77 +- .../БизнесПроцессыИЗадачиКлиент/Module.bsl | 56 +- .../Module.bsl | 6 +- .../Module.bsl | 4 +- .../Module.bsl | 22 +- .../БизнесПроцессыИЗадачиСервер/Module.bsl | 173 +- .../Module.bsl | 95 +- .../CommonModules/ВариантыОтчетов/Module.bsl | 342 +- .../ВариантыОтчетовКлиентСервер/Module.bsl | 2 +- .../Module.bsl | 47 +- .../ВариантыОтчетовСлужебный/Module.bsl | 1480 +++++++ .../ВариантыОтчетовСлужебный.mdo | 10 + .../ВариантыОтчетовСлужебныйКлиент/Module.bsl | 3358 +++++++++++++++ .../ВариантыОтчетовСлужебныйКлиент.mdo | 10 + .../Module.bsl | 174 + .../ВариантыОтчетовСлужебныйКлиентСервер.mdo | 12 + .../ВерсионированиеОбъектов/Module.bsl | 78 +- .../CommonModules/Взаимодействия/Module.bsl | 141 +- .../ВзаимодействияВызовСервера/Module.bsl | 6 +- .../ВзаимодействияКлиент/Module.bsl | 21 +- .../ВзаимодействияКлиентСервер/Module.bsl | 6 +- .../ВнешниеКомпонентыКлиент/Module.bsl | 20 +- .../ВнешниеКомпонентыСервер/Module.bsl | 45 +- .../ВнешниеКомпонентыСлужебный/Module.bsl | 4 - .../Module.bsl | 4 +- .../ВнешниеПользователи/Module.bsl | 2 +- .../ВызовОнлайнПоддержки/Module.bsl | 20 +- .../Module.bsl | 8 +- .../ВызовОнлайнПоддержкиКлиент/Module.bsl | 6 - .../ГенерацияШтрихкода/Module.bsl | 405 ++ .../ГенерацияШтрихкода/ГенерацияШтрихкода.mdo | 11 + .../Module.bsl | 26 + .../ГенерацияШтрихкодаСерверПовтИсп.mdo | 12 + .../CommonModules/ГрафикиРаботы/Module.bsl | 101 +- .../ГрафикиРаботыКлиент/Module.bsl | 10 +- .../Module.bsl | 6 +- .../Module.bsl | 4 +- .../ДатыЗапретаИзменения/Module.bsl | 46 +- .../Module.bsl | 6 +- .../ДатыЗапретаИзмененияСлужебный/Module.bsl | 271 +- .../Module.bsl | 2 +- .../ДлительныеОперации/Module.bsl | 51 +- .../ДлительныеОперацииКлиент/Module.bsl | 12 +- .../ДополнительныеОтчетыИОбработки/Module.bsl | 145 +- .../Module.bsl | 4 +- .../Module.bsl | 24 +- .../Module.bsl | 72 +- .../Module.bsl | 2 +- .../Module.bsl | 8 +- .../Module.bsl | 6 +- .../ЖурналРегистрации/Module.bsl | 10 +- .../ЗаметкиПользователяСлужебный/Module.bsl | 10 +- .../ЗаполнениеОбъектов/Module.bsl | 8 +- .../Module.bsl | 36 +- .../Module.bsl | 14 +- .../Module.bsl | 18 +- .../Module.bsl | 46 +- .../ЗащитаПерсональныхДанных/Module.bsl | 99 +- .../ЗащитаПерсональныхДанныхКлиент/Module.bsl | 9 +- .../Module.bsl | 22 +- .../Module.bsl | 24 +- .../Module.bsl | 16 +- .../ИнтеграцияПодсистемБСП/Module.bsl | 450 +- .../ИнтеграцияПодсистемБСПКлиент/Module.bsl | 18 +- .../ИнтерфейсODataСлужебный/Module.bsl | 10 +- .../ИнформацияПриЗапуске/Module.bsl | 6 +- .../КалендарныеГрафики/Module.bsl | 223 +- .../Module.bsl | 16 +- .../КонтрольВеденияУчета/Module.bsl | 49 +- .../Module.bsl | 2 +- .../КонтрольВеденияУчетаКлиент/Module.bsl | 4 +- .../Module.bsl | 8 +- .../КонтрольВеденияУчетаСлужебный/Module.bsl | 136 +- .../Module.bsl | 8 +- .../МультиязычностьКлиент/Module.bsl | 21 +- .../МультиязычностьКлиентСервер/Module.bsl | 8 +- .../МультиязычностьПовтИсп/Module.bsl | 2 +- .../МультиязычностьСервер/Module.bsl | 366 +- .../НапоминанияПользователя/Module.bsl | 2 +- .../Module.bsl | 2 +- .../НастройкаПорядкаЭлементов/Module.bsl | 12 +- .../Module.bsl | 8 +- .../Module.bsl | 5 +- .../ОбменДаннымиXDTOСервер/Module.bsl | 132 +- .../ОбменДаннымиВМоделиСервиса/Module.bsl | 84 +- .../Module.bsl | 2 +- .../ОбменДаннымиВызовСервера/Module.bsl | 7 +- .../ОбменДаннымиКлиент/Module.bsl | 35 +- .../ОбменДаннымиПереопределяемый/Module.bsl | 4 +- .../ОбменДаннымиПовтИсп/Module.bsl | 51 +- .../ОбменДаннымиСервер/Module.bsl | 528 ++- .../ОбменДаннымиСлужебный/Module.bsl | 25 +- .../ОбменДаннымиСобытия/Module.bsl | 166 +- .../ОбновлениеИнформационнойБазы/Module.bsl | 133 +- .../Module.bsl | 4 +- .../Module.bsl | 45 + .../Module.bsl | 907 ++-- .../Module.bsl | 6 +- .../ОбновлениеКонфигурации/Module.bsl | 34 +- .../ОбновлениеКонфигурацииКлиент/Module.bsl | 2 +- SSL/src/CommonModules/Обсуждения/Module.bsl | 165 +- .../CommonModules/ОбсужденияКлиент/Module.bsl | 4 +- .../ОбсужденияСлужебный/Module.bsl | 78 +- .../CommonModules/ОбщегоНазначения/Module.bsl | 552 ++- .../ОбщегоНазначенияКлиент/Module.bsl | 24 +- .../Module.bsl | 5 +- .../ОбщегоНазначенияКлиентСервер/Module.bsl | 22 +- .../Module.bsl | 29 +- .../Module.bsl | 4 +- .../Module.bsl | 2 +- .../ОрганизацииПереопределяемый/Module.bsl | 51 +- .../ОрганизацииСервер/Module.bsl | 169 +- SSL/src/CommonModules/ОтправкаSMS/Module.bsl | 4 - .../Module.bsl | 4 +- SSL/src/CommonModules/ОтчетыКлиент/Module.bsl | 77 +- .../ОтчетыКлиентПереопределяемый/Module.bsl | 42 +- .../ОтчетыКлиентСервер/Module.bsl | 43 +- .../ОтчетыПереопределяемый/Module.bsl | 18 +- SSL/src/CommonModules/ОтчетыСервер/Module.bsl | 343 +- .../ОценкаПроизводительности/Module.bsl | 72 +- .../Module.bsl | 6 +- .../ОценкаПроизводительностиКлиент/Module.bsl | 80 +- .../Module.bsl | 6 +- .../Module.bsl | 6 +- .../Module.bsl | 39 +- .../ПереводТекстаНаДругиеЯзыки/Module.bsl | 388 ++ .../ПереводТекстаНаДругиеЯзыки.mdo | 11 + .../ПодключаемыеКоманды/Module.bsl | 19 +- .../ПодключаемыеКомандыКлиент/Module.bsl | 4 +- .../Module.bsl | 13 +- .../ПоискИУдалениеДублей/Module.bsl | 156 +- .../ПоискИУдалениеДублейКлиент/Module.bsl | 14 +- .../Module.bsl | 21 +- .../ПолнотекстовыйПоискСервер/Module.bsl | 10 +- .../ПолучениеФайловИзИнтернета/Module.bsl | 28 +- .../Module.bsl | 18 +- .../Module.bsl | 39 +- SSL/src/CommonModules/Пользователи/Module.bsl | 35 +- .../ПользователиПереопределяемый/Module.bsl | 32 +- .../ПользователиСлужебный/Module.bsl | 1078 +++-- .../Module.bsl | 104 +- .../Module.bsl | 2 +- .../ПользователиСлужебныйКлиент/Module.bsl | 20 +- .../Module.bsl | 31 +- .../ПользователиСлужебныйПовтИсп/Module.bsl | 14 +- .../ПрефиксацияОбъектовСлужебный/Module.bsl | 21 +- .../ПрефиксацияОбъектовСобытия/Module.bsl | 14 +- .../РаботаВБезопасномРежиме/Module.bsl | 78 +- .../Module.bsl | 31 +- .../CommonModules/РаботаСАдресами/Module.bsl | 67 +- .../РаботаСАдресамиКлиентСервер/Module.bsl | 4 +- .../CommonModules/РаботаСБанками/Module.bsl | 5 +- .../РаботаСКурсамиВалют/Module.bsl | 42 +- .../РаботаСКурсамиВалютСлужебный/Module.bsl | 72 +- .../РаботаСПочтовымиСообщениями/Module.bsl | 8 +- .../Module.bsl | 4 +- .../Module.bsl | 8 +- .../Module.bsl | 181 +- .../CommonModules/РаботаСФайлами/Module.bsl | 86 +- .../РаботаСФайламиВТомахСлужебный/Module.bsl | 49 +- .../РаботаСФайламиКлиент/Module.bsl | 25 +- .../Module.bsl | 5 - .../РаботаСФайламиКлиентСервер/Module.bsl | 5 - .../РаботаСФайламиПереопределяемый/Module.bsl | 5 - .../РаботаСФайламиСлужебный/Module.bsl | 265 +- .../Module.bsl | 285 +- .../Module.bsl | 33 +- .../РаботаСФайламиСлужебныйКлиент/Module.bsl | 237 +- .../Module.bsl | 5 - .../РаботаСФайламиСлужебныйПовтИсп/Module.bsl | 5 - .../CommonModules/РассылкаОтчетов/Module.bsl | 579 ++- .../РассылкаОтчетовКлиент/Module.bsl | 2 +- .../Module.bsl | 2 +- .../РегламентныеЗаданияСервер/Module.bsl | 259 +- .../РегламентныеЗаданияСлужебный/Module.bsl | 18 +- .../РезервноеКопированиеИБКлиент/Module.bsl | 38 +- .../РезервноеКопированиеИБСервер/Module.bsl | 52 +- .../СклонениеПредставленийОбъектов/Module.bsl | 46 +- .../Module.bsl | 4 +- .../Module.bsl | 14 +- SSL/src/CommonModules/СоединенияИБ/Module.bsl | 54 +- .../СоединенияИБКлиент/Module.bsl | 12 +- .../СоединенияИБКлиентСервер/Module.bsl | 6 +- .../СоединенияИБПереопределяемый/Module.bsl | 2 +- .../СозданиеНаОсновании/Module.bsl | 12 +- .../Module.bsl | 1 - .../Module.bsl | 9 +- .../СтандартныеПодсистемыКлиент/Module.bsl | 218 +- .../Module.bsl | 4 +- .../СтандартныеПодсистемыПовтИсп/Module.bsl | 32 +- .../СтандартныеПодсистемыСервер/Module.bsl | 193 +- .../СтроковыеФункцииКлиентСервер/Module.bsl | 4 +- .../Module.bsl | 8 +- .../Module.bsl | 8 +- .../ТекущиеДелаПереопределяемый/Module.bsl | 27 +- .../ТекущиеДелаСервер/Module.bsl | 45 + .../ТекущиеДелаСлужебный/Module.bsl | 55 +- .../ТекущиеДелаСлужебныйПовтИсп/Module.bsl | 6 +- .../УдалениеПомеченныхОбъектов/Module.bsl | 98 +- .../Module.bsl | 48 +- .../Module.bsl | 3 +- .../Module.bsl | 222 +- .../Module.bsl | 10 +- .../Module.bsl | 6 +- .../УправлениеДоступом/Module.bsl | 88 +- .../Module.bsl | 65 +- .../УправлениеДоступомСлужебный/Module.bsl | 3753 +++++++++++++---- .../Module.bsl | 4 +- .../Module.bsl | 26 +- .../Module.bsl | 12 +- .../Module.bsl | 92 +- .../Module.bsl | 12 +- .../Module.bsl | 518 ++- .../Module.bsl | 62 +- .../Module.bsl | 23 + .../Module.bsl | 2 +- .../Module.bsl | 100 +- .../Module.bsl | 2 +- .../УправлениеПечатью/Module.bsl | 254 +- .../УправлениеПечатьюMSWordКлиент/Module.bsl | 12 +- .../Module.bsl | 8 +- .../УправлениеПечатьюВызовСервера/Module.bsl | 2 +- .../УправлениеПечатьюКлиент/Module.bsl | 50 +- .../УправлениеПечатьюКлиентСервер/Module.bsl | 1 + .../Module.bsl | 253 ++ .../УправлениеПечатьюМультиязычность.mdo | 11 + .../Module.bsl | 13 +- .../УправлениеПечатьюСлужебный/Module.bsl | 10 +- .../Module.bsl | 6 +- .../УправлениеСвойствами/Module.bsl | 187 +- .../Module.bsl | 4 +- .../УправлениеСвойствамиПовтИсп/Module.bsl | 2 +- .../УправлениеСвойствамиСлужебный/Module.bsl | 67 +- .../УправлениеЭлектроннойПочтой/Module.bsl | 26 +- .../Module.bsl | 347 +- .../Module.bsl | 55 +- .../Module.bsl | 60 +- .../Module.bsl | 3 +- .../Module.bsl | 2 +- .../CommonModules/ФайловаяСистема/Module.bsl | 17 +- .../ФайловаяСистемаКлиент/Module.bsl | 21 +- .../Module.bsl | 28 + .../ФайловаяСистемаСлужебныйКлиентСервер.mdo | 12 + .../CommonModules/ЦентрМониторинга/Module.bsl | 8 +- .../ЦентрМониторингаСлужебный/Module.bsl | 273 +- .../CommonModules/ШаблоныСообщений/Module.bsl | 12 +- .../ШаблоныСообщенийКлиентСервер/Module.bsl | 8 + .../Module.bsl | 27 +- .../ШаблоныСообщенийСлужебный/Module.bsl | 32 +- .../ЭлектроннаяПодпись/Module.bsl | 71 +- .../ЭлектроннаяПодписьКлиент/Module.bsl | 74 +- .../ЭлектроннаяПодписьСлужебный/Module.bsl | 93 +- .../Module.bsl | 6 +- .../Module.bsl | 306 +- .../Module.bsl | 340 +- .../Module.bsl | 22 +- .../CommonModules/ЯндексПереводчик/Module.bsl | 282 ++ .../ЯндексПереводчик/ЯндексПереводчик.mdo | 11 + .../CommonPictures/ВидыСравнения/Picture.zip | Bin 0 -> 7243 bytes .../ВидыСравнения/ВидыСравнения.mdo | 8 + .../ВставитьГруппировкуВыше/Picture.zip | Bin 0 -> 6701 bytes .../ВставитьГруппировкуВыше.mdo | 8 + .../ВставитьГруппировкуНиже/Picture.zip | Bin 0 -> 6783 bytes .../ВставитьГруппировкуНиже.mdo | 8 + .../ВставитьКолонкуСлева/Picture.zip | Bin 0 -> 6637 bytes .../ВставитьКолонкуСлева.mdo | 8 + .../ВставитьКолонкуСправа/Picture.zip | Bin 0 -> 6647 bytes .../ВставитьКолонкуСправа.mdo | 8 + .../CommonPictures/ВысотаСтроки/Picture.zip | Bin 0 -> 5837 bytes .../ВысотаСтроки/ВысотаСтроки.mdo | 8 + .../CommonPictures/Группировка/Picture.zip | Bin 0 -> 5059 bytes .../Группировка/Группировка.mdo | 8 + .../ДобавитьЭлементНастроек/Picture.zip | Bin 0 -> 6289 bytes .../ДобавитьЭлементНастроек.mdo | 8 + SSL/src/CommonPictures/Закрепить/Picture.zip | Bin 0 -> 10349 bytes .../CommonPictures/Закрепить/Закрепить.mdo | 8 + .../CommonPictures/КроссТаблица/Picture.zip | Bin 0 -> 5664 bytes .../КроссТаблица/КроссТаблица.mdo | 8 + SSL/src/CommonPictures/Открепить/Picture.zip | Bin 0 -> 12598 bytes .../CommonPictures/Открепить/Открепить.mdo | 8 + .../ПерейтиВПолноэкранныйРежим/Picture.zip | Bin 0 -> 3300 bytes .../ПерейтиВПолноэкранныйРежим.mdo | 8 + .../ПереместитьГруппировкуВыше/Picture.zip | Bin 0 -> 5281 bytes .../ПереместитьГруппировкуВыше.mdo | 8 + .../ПереместитьГруппировкуНиже/Picture.zip | Bin 0 -> 5388 bytes .../ПереместитьГруппировкуНиже.mdo | 8 + .../ПереместитьКолонкуВлево/Picture.zip | Bin 0 -> 5522 bytes .../ПереместитьКолонкуВлево.mdo | 8 + .../ПереместитьКолонкуВправо/Picture.zip | Bin 0 -> 5532 bytes .../ПереместитьКолонкуВправо.mdo | 8 + .../CommonPictures/СдвинутьВверх/Picture.zip | Bin 0 -> 6734 bytes .../СдвинутьВверх/СдвинутьВверх.mdo | 8 + .../CommonPictures/СдвинутьВниз/Picture.zip | Bin 0 -> 6894 bytes .../СдвинутьВниз/СдвинутьВниз.mdo | 8 + .../Picture.zip | Bin 0 -> 4214 bytes .../СортироватьСтрокиПоВозрастанию.mdo | 8 + .../СортироватьСтрокиПоУбыванию/Picture.zip | Bin 0 -> 4138 bytes .../СортироватьСтрокиПоУбыванию.mdo | 8 + .../СтрелкаВправоЗеленая/Picture.zip | Bin 0 -> 7432 bytes .../СтрелкаВправоЗеленая.mdo | 8 + SSL/src/CommonPictures/Таблица/Picture.zip | Bin 0 -> 5104 bytes SSL/src/CommonPictures/Таблица/Таблица.mdo | 8 + SSL/src/CommonPictures/ТипБулево/Picture.zip | Bin 0 -> 8464 bytes .../CommonPictures/ТипБулево/ТипБулево.mdo | 8 + SSL/src/CommonPictures/ТипГруппа/Picture.zip | Bin 0 -> 6523 bytes .../CommonPictures/ТипГруппа/ТипГруппа.mdo | 8 + SSL/src/CommonPictures/ТипДата/Picture.zip | Bin 0 -> 8138 bytes SSL/src/CommonPictures/ТипДата/ТипДата.mdo | 8 + SSL/src/CommonPictures/ТипДерево/Picture.zip | Bin 0 -> 6886 bytes .../CommonPictures/ТипДерево/ТипДерево.mdo | 8 + .../ТипИдентификатор/Picture.zip | Bin 0 -> 7661 bytes .../ТипИдентификатор/ТипИдентификатор.mdo | 8 + .../CommonPictures/ТипКонстанта/Picture.zip | Bin 0 -> 8989 bytes .../ТипКонстанта/ТипКонстанта.mdo | 8 + SSL/src/CommonPictures/ТипМакрос/Picture.zip | Bin 0 -> 10015 bytes .../CommonPictures/ТипМакрос/ТипМакрос.mdo | 8 + .../CommonPictures/ТипОшибка/ТипОшибка.mdo | 8 + .../CommonPictures/ТипСоставной/Picture.zip | Bin 0 -> 7539 bytes .../ТипСоставной/ТипСоставной.mdo | 8 + SSL/src/CommonPictures/ТипСписок/Picture.zip | Bin 0 -> 7753 bytes .../CommonPictures/ТипСписок/ТипСписок.mdo | 8 + SSL/src/CommonPictures/ТипСсылка/Picture.zip | Bin 0 -> 9317 bytes .../CommonPictures/ТипСсылка/ТипСсылка.mdo | 8 + SSL/src/CommonPictures/ТипСтрока/Picture.zip | Bin 0 -> 6445 bytes .../CommonPictures/ТипСтрока/ТипСтрока.mdo | 8 + SSL/src/CommonPictures/ТипФильтр/Picture.zip | Bin 0 -> 8125 bytes .../CommonPictures/ТипФильтр/ТипФильтр.mdo | 8 + SSL/src/CommonPictures/ТипФункция/Picture.zip | Bin 0 -> 9895 bytes .../CommonPictures/ТипФункция/ТипФункция.mdo | 8 + SSL/src/CommonPictures/ТипЧисло/Picture.zip | Bin 0 -> 8626 bytes SSL/src/CommonPictures/ТипЧисло/ТипЧисло.mdo | 8 + .../CommonPictures/ШиринаКолонки/Picture.zip | Bin 0 -> 5918 bytes .../ШиринаКолонки/ШиринаКолонки.mdo | 8 + .../КомпонентаПечатиШтрихкодов/Template.addin | Bin 0 -> 7578587 bytes .../КомпонентаПечатиШтрихкодов.mdo | 10 + SSL/src/Configuration/Configuration.mdo | 90 +- .../Configuration/ParentConfigurations.bin | 2 +- .../ValueManagerModule.bsl | 8 +- .../ИспользоватьСервисПереводаТекста.mdo | 20 + .../ValueManagerModule.bsl | 9 +- .../СервисПереводаТекста.mdo | 20 + .../УчетнаяЗаписьДляВосстановленияПароля.mdo | 20 + .../Forms/Форма/Form.form | 8 - .../Forms/Форма/Module.bsl | 12 +- .../Forms/АктивныеПользователи/Module.bsl | 7 +- .../Form.form | 32 - .../ВводАдресаВСвободнойФорме/Module.bsl | 22 +- .../ИсторияКонтактнойИнформации/Module.bsl | 14 + .../ManagerModule.bsl | 3 +- .../ObjectModule.bsl | 70 +- .../ManagerModule.bsl | 90 +- .../ObjectModule.bsl | 32 +- .../Forms/Форма/Form.form | 56 - .../Forms/Форма/Module.bsl | 12 - .../Forms/ВыборВидаОбъектов/Module.bsl | 4 +- .../Forms/Форма/Module.bsl | 66 +- .../ObjectModule.bsl | 26 +- .../ДоступныеАнкеты/Forms/Форма/Module.bsl | 39 +- .../ЖурналРегистрации/Forms/Событие/Form.form | 36 - .../ЖурналРегистрации/ManagerModule.bsl | 10 +- .../Forms/ЗагрузкаДанныхИзФайла/Module.bsl | 57 +- .../Forms/РедактированиеБланка/Form.form | 208 +- .../ЗагрузкаДанныхИзФайла/ManagerModule.bsl | 35 +- .../ManagerModule.bsl | 64 +- .../Forms/ПараметрыПрописиВалюты/Module.bsl | 290 -- .../Form.form | 247 +- .../ПараметрыПрописиВалюты_ru/Help/ru.html | 10 + .../ПараметрыПрописиВалюты_ru/Module.bsl | 185 + .../ЗагрузкаКурсовВалют/ManagerModule.bsl | 48 +- .../ЗагрузкаКурсовВалют.mdo | 3 +- .../Forms/ЗаменаЭлементов/Module.bsl | 10 +- .../ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 13 +- .../Template.txt | 1 + .../Forms/Форма/Module.bsl | 138 +- .../ObjectModule.bsl | 113 +- .../ObjectModule.bsl | 271 +- .../Module.bsl | 2 +- .../Form.form | 56 - .../ManagerModule.bsl | 9 +- .../ObjectModule.bsl | 36 +- .../НастройкаРезервногоКопирования/Form.form | 44 - .../ManagerModule.bsl | 32 +- .../Forms/ВыборПользователей/Form.form | 21 + .../Forms/ВыборПользователей/Module.bsl | 4 +- .../Module.bsl | 5 + .../Forms/НастройкиПользователей/Module.bsl | 29 +- .../ОчисткаНастроекПользователей/Module.bsl | 4 + .../НастройкиПользователей/ManagerModule.bsl | 26 +- .../НастройкиЦентраМониторинга/Form.form | 12 - .../Forms/ФормаОбработчика/Module.bsl | 2 +- .../ManagerModule.bsl | 2 +- .../ObjectModule.bsl | 2 +- .../Module.bsl | 2 +- .../Forms/ИсторияВыполнения/Form.form | 8 - .../Forms/Форма/Form.form | 16 - .../Forms/Форма/Module.bsl | 4 +- .../ОценкаПроизводительности/ObjectModule.bsl | 38 +- .../Forms/ИнтернетПоддержкаИСервисы/Form.form | 164 - .../ИнтернетПоддержкаИСервисы/Module.bsl | 24 +- .../НастройкиПользователейИПрав/Form.form | 120 +- .../НастройкиПользователейИПрав/Module.bsl | 7 +- .../Forms/НастройкиРаботыСФайлами/Form.form | 116 - .../Forms/Обслуживание/Form.form | 152 - .../Forms/Обслуживание/Module.bsl | 7 - .../Forms/ОбщиеНастройки/Form.form | 68 - .../Forms/ОбщиеНастройки/Module.bsl | 10 +- .../Forms/Органайзер/Form.form | 104 - .../ПечатныеФормыОтчетыИОбработки/Form.form | 118 +- .../Forms/СинхронизацияДанных/Form.form | 52 - .../Form.form | 44 - .../ПереносФайлов/Forms/Форма/Form.form | 28 - .../ПереносФайлов/Forms/Форма/Module.bsl | 6 +- .../Form.form | 4 - .../Forms/Форма/Form.form | 24 - .../Forms/ПоискДублей/Form.form | 17 - .../Forms/ПоискДублей/Module.bsl | 32 +- .../ПоискИУдалениеДублей/ObjectModule.bsl | 34 +- .../Form.form | 32 - .../Forms/Форма/Form.form | 220 - .../Forms/НастройкаНаСторонеСервиса/Form.form | 56 - .../НастройкаНаСторонеСервиса/Module.bsl | 2 +- .../ObjectModule.bsl | 10 +- .../Template.htmldoc | 0 .../ru.html | 0 ...мощникСозданияАвтономногоРабочегоМеста.mdo | 4 +- .../Forms/НастройкаСинхронизации/Form.form | 13 + .../Forms/НастройкаСинхронизации/Module.bsl | 12 +- .../ВерсияПрисоединенногоФайла/Module.bsl | 3 - .../Forms/ВыборКодировки/Form.form | 4 - .../Forms/ПрисоединенныеФайлы/Module.bsl | 10 +- .../Forms/РедактируемыеФайлы/Module.bsl | 29 +- .../Form.form | 12 - .../Forms/ФайлСуществует/Form.form | 4 - .../ФормаЗавершениеРедактирования/Form.form | 16 - .../Forms/ФормаИмпортаПапки/Form.form | 12 - .../Forms/ФормаИмпортаФайлов/Form.form | 24 - .../Forms/ФормаЭкспортаПапки/Form.form | 4 - .../Forms/ФормаЭкспортаПапки/Module.bsl | 28 +- .../Forms/ВводАдреса/Module.bsl | 27 +- .../ManagerModule.bsl | 52 +- .../Forms/ВыборОбъектовОтбором/Module.bsl | 11 +- .../Forms/Настройки/Form.form | 16 - .../Forms/Форма/Form.form | 12 + .../Forms/Форма/Module.bsl | 153 +- .../ObjectModule.bsl | 318 +- .../Forms/РегламентноеЗадание/Module.bsl | 25 +- .../РегламентныеИФоновыеЗадания/Module.bsl | 12 +- .../Form.form | 209 +- .../Module.bsl | 109 +- .../РезервноеКопированиеДанных/Form.form | 205 +- .../РезервноеКопированиеДанных/Module.bsl | 42 +- .../ИндикацияХодаОбновленияИБ/Module.bsl | 17 +- .../Forms/ОтложенныеОбработчики/Module.bsl | 2 - .../Forms/НастройкаСканирования/Form.form | 24 - .../НастройкаСканированияНаСеанс/Form.form | 16 - .../Forms/РезультатСканирования/Form.form | 16 - .../ObjectModule.bsl | 97 +- .../Form.form | 80 - .../Forms/Форма/Form.form | 100 - .../ObjectModule.bsl | 347 +- .../ТекущиеДела/Forms/Форма/Module.bsl | 2 +- .../НастройкиУдаленияОбъектов/Module.bsl | 8 +- .../Forms/ОсновнаяФорма/Form.form | 125 +- .../Forms/ОсновнаяФорма/Module.bsl | 72 +- .../ManagerModule.bsl | 208 +- .../ObjectModule.bsl | 297 +- .../Forms/ОсновнаяФорма/Form.form | 56 - .../БизнесПроцессОбъект.mdo | 14 + .../ОбъектСНастраиваемымПорядком.mdo | 1 + .../ПараметрыЭлектронногоПисьма/Form.form | 16 - .../Forms/ПечатьЭлектронногоПисьма/Form.form | 16 - .../Forms/ФормаСписка/Module.bsl | 17 +- .../ФормаСпискаПараметрическая/Module.bsl | 2 +- .../Взаимодействия/ManagerModule.bsl | 4 +- SSL/src/Documents/Анкета/ManagerModule.bsl | 2 +- SSL/src/Documents/Встреча/ManagerModule.bsl | 6 +- SSL/src/Documents/Встреча/ObjectModule.bsl | 4 +- .../ManagerModule.bsl | 6 +- .../ObjectModule.bsl | 2 - .../Forms/ФормаПодбораРеспондентов/Form.form | 8 - .../НазначениеОпросов/ManagerModule.bsl | 8 +- .../ManagerModule.bsl | 32 +- .../Documents/СообщениеSMS/ManagerModule.bsl | 6 +- .../Documents/СообщениеSMS/ObjectModule.bsl | 4 +- .../ТелефонныйЗвонок/ManagerModule.bsl | 6 +- .../ТелефонныйЗвонок/ObjectModule.bsl | 2 - .../ManagerModule.bsl | 6 +- .../ObjectModule.bsl | 4 +- .../Forms/ФормаДокумента/Module.bsl | 7 +- .../ManagerModule.bsl | 6 +- .../ObjectModule.bsl | 10 +- .../СервисыПереводаТекста.mdo | 45 + .../ЗаписатьВСписокБизнесПроцессов.mdo | 2 +- .../ОбновитьСостояниеБизнесПроцесса.mdo | 2 +- ...рмуПрисоединенногоФайлаВзаимодействия.mdo} | 4 +- ...уПрисоединенногоФайлаШаблоныСообщений.mdo} | 4 +- .../УстановитьПометкуУдаленияЗадач.mdo | 2 +- .../ManagerModule.bsl | 4 +- .../ОбновлениеИнформационнойБазы.mdo | 6 + .../ИспользоватьСервисПереводаТекста.mdo | 10 + .../ВерсииОбъектов/ManagerModule.bsl | 52 +- .../ДампыПлатформы/ManagerModule.bsl | 11 +- .../ДанныеБизнесПроцессов/ManagerModule.bsl | 4 +- .../RecordSetModule.bsl | 2 +- .../Forms/ДатыЗапретаИзменения/Form.form | 14 + .../Forms/ДатыЗапретаИзменения/Module.bsl | 55 +- .../ДатыЗапретаИзменения/Help/ru.html | 66 +- .../ДатыЗапретаИзменения/ManagerModule.bsl | 4 +- .../ДополнительныеСведения/ManagerModule.bsl | 4 +- .../ЗамерыВремени/ManagerModule.bsl | 5 +- .../ManagerModule.bsl | 5 +- .../ManagerModule.bsl | 29 +- .../ЗначенияГруппДоступа/ManagerModule.bsl | 25 +- .../ManagerModule.bsl | 25 +- .../ИсполнителиЗадач/ManagerModule.bsl | 4 +- .../Templates/Классификатор/Template.txt | 103 - .../ИсторияАдресныхОбъектов.mdo | 8 - .../КалендарныеГрафики/ManagerModule.bsl | 35 +- .../Forms/ФормаЗаписи/Form.form | 20 +- .../Forms/ФормаСписка/Form.form | 270 +- .../КлючиДоступаКРегистрам.mdo | 14 +- ...оступаКРегиструРезультатыПроверкиУчета.mdo | 14 +- .../КэшПереводов/КэшПереводов.mdo | 128 + .../ManagerModule.bsl | 4 +- .../НапоминанияПользователя/ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 48 +- .../Forms/ФормаЗаписи/Form.form | 8 - .../Forms/ФормаЗаписи/Module.bsl | 23 +- .../НастройкиОчисткиФайлов/ManagerModule.bsl | 16 +- .../НастройкиПравОбъектов/ManagerModule.bsl | 22 +- .../НастройкиСинхронизацииФайлов/Module.bsl | 9 +- .../ПростаяФормаЗаписиНастройки/Form.form | 4 - .../Forms/ФормаЗаписиНастройки/Form.form | 28 - .../Forms/ФормаЗаписиНастройки/Module.bsl | 26 +- .../ManagerModule.bsl | 20 +- .../НастройкаПодключенияКСервису/Form.form | 8 - .../ManagerModule.bsl | 20 +- .../ManagerModule.bsl | 4 +- .../НеудаленныеОбъекты/ManagerModule.bsl | 10 +- .../Module.bsl | 8 +- .../ManagerModule.bsl | 9 +- .../ПакетыДляОтправки/ManagerModule.bsl | 5 +- .../Forms/ФормаЗаписи/Form.form | 82 + .../Forms/ФормаСписка/Form.form | 218 +- .../ПараметрыОграниченияДоступа.mdo | 115 +- .../ManagerModule.bsl | 14 +- .../ManagerModule.bsl | 1 + .../Макеты/ExtInfo/ListSettings.dcss | 17 + .../Forms/МакетыПечатныхФорм/Form.form | 80 + .../Forms/МакетыПечатныхФорм/Module.bsl | 63 +- .../ManagerModule.bsl | 8 +- .../ПравилаДляОбменаДанными/ManagerModule.bsl | 40 +- .../ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 19 +- .../ManagerModule.bsl | 2 +- .../Forms/Форма/Module.bsl | 2 +- .../РезультатыОбменаДанными/ManagerModule.bsl | 42 +- .../РезультатыПроверкиУчета/ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 4 +- .../Module.bsl | 44 +- .../Forms/ФормаЗаписи/Form.form | 20 +- .../ManagerModule.bsl | 24 +- ...СостоянияОригиналовПервичныхДокументов.mdo | 4 +- .../СтатистикаКонфигурации/ManagerModule.bsl | 8 +- .../АнализВерсийОбъектов.mdo | 1 + .../СведенияОРегламентномЗадании/Module.bsl | 6 +- .../ManagerModule.bsl | 38 +- .../РасшифровкаПростыхОтветов/Module.bsl | 28 +- .../РасшифровкаТабличныхВопросов/Module.bsl | 11 +- .../Reports/АнализОпроса/ManagerModule.bsl | 4 +- SSL/src/Reports/АнализОпроса/ObjectModule.bsl | 13 +- .../АнализПравДоступа/ManagerModule.bsl | 6 +- .../АнализПравДоступа/ObjectModule.bsl | 5 + .../ManagerModule.bsl | 4 +- .../Reports/БизнесПроцессы/ManagerModule.bsl | 4 +- .../ДатыЗапретаЗагрузки/ManagerModule.bsl | 8 +- .../ДатыЗапретаИзменения/ManagerModule.bsl | 8 +- .../ДвиженияДокумента/ManagerModule.bsl | 6 +- .../ДвиженияДокумента/ObjectModule.bsl | 29 +- .../Reports/ЗависшиеЗадачи/ManagerModule.bsl | 4 +- SSL/src/Reports/Задания/ManagerModule.bsl | 4 +- SSL/src/Reports/Задачи/ManagerModule.bsl | 4 +- .../ЗадачиИстекающиеНаДату/ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 10 +- .../ManagerModule.bsl | 4 +- .../ОбъемНенужныхФайлов/ManagerModule.bsl | 4 +- .../ОбъемНенужныхФайлов/ObjectModule.bsl | 12 +- .../ManagerModule.bsl | 6 +- .../ПраваДоступа/Forms/ФормаОтчета/Module.bsl | 2 +- .../Reports/ПраваДоступа/ManagerModule.bsl | 6 +- .../ПроверкаЦелостностиТома/ManagerModule.bsl | 4 +- .../ПрогрессОбновленияОбластейДанных.mdo | 1 + .../ManagerModule.bsl | 4 +- .../ObjectModule.bsl | 13 +- .../ПросроченныеЗадачи/ManagerModule.bsl | 4 +- .../Forms/АвтоисправлениеПроблемы/Module.bsl | 14 +- .../РезультатыПроверкиУчета/ManagerModule.bsl | 11 +- .../РезультатыПроверкиУчета/ObjectModule.bsl | 38 +- .../СведенияОПользователях/ManagerModule.bsl | 4 +- .../ManagerModule.bsl | 6 +- .../ManagerModule.bsl | 6 +- .../УниверсальныйОтчет/ManagerModule.bsl | 68 +- .../УниверсальныйОтчет/ObjectModule.bsl | 4 + .../Roles/АдминистраторСистемы/Rights.rights | 185 +- SSL/src/Roles/БазовыеПраваБСП/Rights.rights | 256 +- .../Rights.rights | 256 +- .../Rights.rights | 219 +- .../Rights.rights | 196 +- .../ДобавлениеИзменениеЗаданий/Rights.rights | 23 +- .../ДобавлениеИзменениеЗаметок/Rights.rights | 23 +- .../Rights.rights | 23 +- .../Rights.rights | 23 +- .../Rights.rights | 196 +- .../Rights.rights | 23 +- .../Rights.rights | 23 +- .../Rights.rights | 37 +- .../Rights.rights | 23 +- .../ИзменениеВыполнениеЗадач/Rights.rights | 23 +- .../Rights.rights | 196 +- .../Rights.rights | 219 +- SSL/src/Roles/ПолныеПрава/Rights.rights | 112 +- .../Rights.rights | 63 + .../УдаленныйДоступOData.mdo} | 4 +- .../Rights.rights | 23 +- .../Rights.rights | 196 +- SSL/src/Roles/ЧтениеЗаданий/Rights.rights | 23 +- SSL/src/Roles/ЧтениеЗадач/Rights.rights | 23 +- .../Rights.rights | 196 +- .../Rights.rights | 23 +- .../КонтекстнаяНастройкаОтчета/Form.form | 3300 +++++++++++++++ .../КонтекстнаяНастройкаОтчета/Module.bsl | 1197 ++++++ .../Forms/ПанельДругихОтчетов/Form.form | 12 - .../Form.form | 1259 ++++++ .../Module.bsl | 670 +++ .../Forms/СохранениеВариантаОтчета/Module.bsl | 24 +- .../Module.bsl | 74 + .../ХранилищеВариантовОтчетов.mdo | 18 + .../ЦветИзмененногоПоля.mdo | 13 + .../ЦветТекстаВнимание/ЦветТекстаВнимание.mdo | 14 + .../ЦветТекстаОтрицательногоЗначения.mdo | 14 + .../ЦветТекстаПоложительногоЗначения.mdo | 15 + .../ЦветФонаВнимание/ЦветФонаВнимание.mdo | 15 + .../ЦветФонаОтрицательногоЗначения.mdo | 15 + .../ЦветФонаПоложительногоЗначения.mdo | 15 + .../Администрирование/CommandInterface.cmi | 7 + .../Администрирование/Администрирование.mdo | 1 + .../БазоваяФункциональность.mdo | 20 +- .../БизнесПроцессыИЗадачи.mdo | 1 + .../ВариантыОтчетов/ВариантыОтчетов.mdo | 46 + .../Взаимодействия/Взаимодействия.mdo | 2 +- .../ГенерацияШтрихкода/ГенерацияШтрихкода.mdo | 12 + .../ИнтерфейсOData/ИнтерфейсOData.mdo | 2 +- .../БазоваяФункциональность.mdo | 27 + .../ПереводТекста/ПереводТекста.mdo | 18 + .../Subsystems/Печать/Печать.mdo | 11 + .../Мультиязычность/Мультиязычность.mdo | 12 + .../Subsystems/Печать/Печать.mdo | 1 - .../Subsystems/Пользователи/Пользователи.mdo | 1 + .../РаботаСПочтовымиСообщениями.mdo | 1 + .../ШаблоныСообщений/ШаблоныСообщений.mdo | 2 +- .../СтандартныеПодсистемы.mdo | 2 + .../Forms/ПеренаправитьЗадачи/Form.form | 36 - .../Tasks/ЗадачаИсполнителя/ManagerModule.bsl | 6 +- .../WebServices/InterfaceVersion/Module.bsl | 2 +- 870 files changed, 48064 insertions(+), 15765 deletions(-) create mode 100644 SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form rename SSL/src/{DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты => Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en}/Help/ru.html (100%) create mode 100644 SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/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/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form create mode 100644 SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl create mode 100644 SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss 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/ЯзыкиПечатныхФорм/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ЯзыкиПечатныхФорм/ObjectModule.bsl create mode 100644 SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo 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 create mode 100644 SSL/src/CommonModules/GoogleПереводчик/GoogleПереводчик.mdo create mode 100644 SSL/src/CommonModules/GoogleПереводчик/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 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 create mode 100644 SSL/src/CommonModules/ЯндексПереводчик/Module.bsl create mode 100644 SSL/src/CommonModules/ЯндексПереводчик/ЯндексПереводчик.mdo 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 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 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 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 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 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 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 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 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 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 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 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 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 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 create mode 100644 SSL/src/CommonPictures/ТипМакрос/Picture.zip create mode 100644 SSL/src/CommonPictures/ТипМакрос/ТипМакрос.mdo 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.zip 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.zip 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.zip 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.zip create mode 100644 SSL/src/CommonPictures/ШиринаКолонки/ШиринаКолонки.mdo create mode 100644 SSL/src/CommonTemplates/КомпонентаПечатиШтрихкодов/Template.addin create mode 100644 SSL/src/CommonTemplates/КомпонентаПечатиШтрихкодов/КомпонентаПечатиШтрихкодов.mdo create mode 100644 SSL/src/Constants/ИспользоватьСервисПереводаТекста/ИспользоватьСервисПереводаТекста.mdo create mode 100644 SSL/src/Constants/СервисПереводаТекста/СервисПереводаТекста.mdo create mode 100644 SSL/src/Constants/УчетнаяЗаписьДляВосстановленияПароля/УчетнаяЗаписьДляВосстановленияПароля.mdo delete mode 100644 SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Module.bsl rename SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/{ПараметрыПрописиВалюты => ПараметрыПрописиВалюты_ru}/Form.form (84%) create mode 100644 SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Help/ru.html create mode 100644 SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты_ru/Module.bsl rename SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Templates/{ИнструкцияПоНастройкеАвтономногоРабочегоМеста => ИнструкцияПоНастройкеАРМ}/Template.htmldoc (100%) rename SSL/src/DataProcessors/ПомощникСозданияАвтономногоРабочегоМеста/Templates/{ИнструкцияПоНастройкеАвтономногоРабочегоМеста => ИнструкцияПоНастройкеАРМ}/ru.html (100%) create mode 100644 SSL/src/DefinedTypes/БизнесПроцессОбъект/БизнесПроцессОбъект.mdo create mode 100644 SSL/src/Enums/СервисыПереводаТекста/СервисыПереводаТекста.mdo rename SSL/src/EventSubscriptions/{ПереопределитьПолучаемуюФормуПрисоединенногоФайлаВзаимодействия/ПереопределитьПолучаемуюФормуПрисоединенногоФайлаВзаимодействия.mdo => ОпределитьФормуПрисоединенногоФайлаВзаимодействия/ОпределитьФормуПрисоединенногоФайлаВзаимодействия.mdo} (80%) rename SSL/src/EventSubscriptions/{ПереопределитьПолучаемуюФормуПрисоединенногоФайлаШаблоныСообщений/ПереопределитьПолучаемуюФормуПрисоединенногоФайлаШаблоныСообщений.mdo => ОпределитьФормуПрисоединенногоФайлаШаблоныСообщений/ОпределитьФормуПрисоединенногоФайлаШаблоныСообщений.mdo} (68%) create mode 100644 SSL/src/FunctionalOptions/ИспользоватьСервисПереводаТекста/ИспользоватьСервисПереводаТекста.mdo delete mode 100644 SSL/src/InformationRegisters/ИсторияАдресныхОбъектов/Templates/Классификатор/Template.txt create mode 100644 SSL/src/InformationRegisters/КэшПереводов/КэшПереводов.mdo create mode 100644 SSL/src/InformationRegisters/ПользовательскиеМакетыПечати/Forms/МакетыПечатныхФорм/Attributes/Макеты/ExtInfo/ListSettings.dcss rename SSL/src/Roles/{УдалениеДанныхOData => УдаленныйДоступOData}/Rights.rights (97%) rename SSL/src/Roles/{УдалениеДанныхOData/УдалениеДанныхOData.mdo => УдаленныйДоступOData/УдаленныйДоступOData.mdo} (82%) create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/КонтекстнаяНастройкаОтчета/Form.form create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/КонтекстнаяНастройкаОтчета/Module.bsl create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/РасширеннаяНастройкаФильтраОтчета/Form.form create mode 100644 SSL/src/SettingsStorages/ХранилищеВариантовОтчетов/Forms/РасширеннаяНастройкаФильтраОтчета/Module.bsl create mode 100644 SSL/src/StyleItems/ЦветИзмененногоПоля/ЦветИзмененногоПоля.mdo create mode 100644 SSL/src/StyleItems/ЦветТекстаВнимание/ЦветТекстаВнимание.mdo create mode 100644 SSL/src/StyleItems/ЦветТекстаОтрицательногоЗначения/ЦветТекстаОтрицательногоЗначения.mdo create mode 100644 SSL/src/StyleItems/ЦветТекстаПоложительногоЗначения/ЦветТекстаПоложительногоЗначения.mdo create mode 100644 SSL/src/StyleItems/ЦветФонаВнимание/ЦветФонаВнимание.mdo create mode 100644 SSL/src/StyleItems/ЦветФонаОтрицательногоЗначения/ЦветФонаОтрицательногоЗначения.mdo create mode 100644 SSL/src/StyleItems/ЦветФонаПоложительногоЗначения/ЦветФонаПоложительногоЗначения.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГенерацияШтрихкода/ГенерацияШтрихкода.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Мультиязычность/Subsystems/БазоваяФункциональность/БазоваяФункциональность.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Мультиязычность/Subsystems/ПереводТекста/ПереводТекста.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Мультиязычность/Subsystems/Печать/Печать.mdo create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/Мультиязычность/Мультиязычность.mdo diff --git a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl index 13498810f..a307c5edb 100644 --- a/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -43,7 +43,7 @@ // // Параметры: // ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. -// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка - точка маршрута. +// ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка.Задание - точка маршрута. // // Возвращаемое значение: // Структура - структуру с описанием формы выполнения задачи. @@ -123,7 +123,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl index 61e947060..9ab26cfd7 100644 --- a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl @@ -14,8 +14,6 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа. -// // Параметры: // Таблица - см. УправлениеДоступом.ТаблицаНаборыЗначенийДоступа // diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form new file mode 100644 index 000000000..9a6960a83 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Form.form @@ -0,0 +1,797 @@ + + + + ЦелаяЧасть + 100 + + ЦелаяЧастьЕдинственноеЧисло + 104 + + <key>ru</key> + <value>Один</value> + + true + true + + true + + + ЦелаяЧастьЕдинственноеЧисло + + + OnChange + ПолеВводаПриИзменении + + + ЦелаяЧастьЕдинственноеЧислоРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ЦелаяЧастьЕдинственноеЧислоКонтекстноеМеню + 105 + true + + InputField + Enter + true + Left + true + + + EditTextChange + ПолеВводаИзменениеТекстаРедактирования + + true + true + false + true + true + true + true + Normal + + + + ЦелаяЧастьМножественноеЧисло + 107 + + <key>ru</key> + <value>Два</value> + + true + true + + true + + + ЦелаяЧастьМножественноеЧисло + + + OnChange + ПолеВводаПриИзменении + + + ЦелаяЧастьМножественноеЧислоРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + ЦелаяЧастьМножественноеЧислоКонтекстноеМеню + 108 + true + + InputField + Enter + true + Left + true + + + EditTextChange + ПолеВводаИзменениеТекстаРедактирования + + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Целая часть</value> + + + ЦелаяЧастьРасширеннаяПодсказка + 101 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ДробнаяЧасть + 102 + + ДробнаяЧастьЕдинственноеЧисло + 110 + + <key>ru</key> + <value>Один</value> + + true + true + + true + + + ДробнаяЧастьЕдинственноеЧисло + + + OnChange + ПолеВводаПриИзменении + + + ДробнаяЧастьЕдинственноеЧислоРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + + ДробнаяЧастьЕдинственноеЧислоКонтекстноеМеню + 111 + true + + InputField + Enter + true + Left + true + + + EditTextChange + ПолеВводаИзменениеТекстаРедактирования + + true + true + false + true + true + true + true + Normal + + + + ДробнаяЧастьМножественноеЧисло + 113 + + <key>ru</key> + <value>Два</value> + + true + true + + true + + + ДробнаяЧастьМножественноеЧисло + + + OnChange + ПолеВводаПриИзменении + + + ДробнаяЧастьМножественноеЧислоРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ДробнаяЧастьМножественноеЧислоКонтекстноеМеню + 114 + true + + InputField + Enter + true + Left + true + + + EditTextChange + ПолеВводаИзменениеТекстаРедактирования + + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Дробная часть</value> + + + ДробнаяЧастьРасширеннаяПодсказка + 103 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + ГруппаЧислоРазрядовДробнойЧасти + 56 + + ДлинаДробнойЧасти + 20 + true + true + + true + + + ДлинаДробнойЧасти + + + OnChange + ПолеВводаПриИзменении + + + ДлинаДробнойЧастиExtendedTooltip + 96 + Label + true + true + + Left + + + + ДлинаДробнойЧастиКонтекстноеМеню + 33 + true + + InputField + Enter + true + Left + true + Left + + 15 + true + true + false + true + + + ru + 2 знака + + + 2 + + + + + ru + 1 знак + + + 1 + + + + + ru + 3 знака + + + 3 + + + + Style.BorderColor + + Normal + + + true + true + + true + + + ГруппаЧислоРазрядовДробнойЧастиExtendedTooltip + 95 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ГруппаПримерПрописи + 61 + + СуммаЧисло + 59 + + <key>ru</key> + <value>Сумма</value> + + true + true + + true + + + СуммаЧисло + + + OnChange + ПолеВводаПриИзменении + + + СуммаЧислоExtendedTooltip + 98 + Label + true + true + + Left + + + + СуммаЧислоКонтекстноеМеню + 60 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СуммаПрописью + 62 + true + true + + true + + + СуммаПрописью + + + СуммаПрописьюExtendedTooltip + 99 + Label + true + true + + Left + + + + СуммаПрописьюКонтекстноеМеню + 63 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пример прописи суммы</value> + + + ГруппаПримерПрописиExtendedTooltip + 97 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + + ФормаЗаписатьИЗакрыть + 116 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписать + 118 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + Auto + + Left + 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> + + 11 + + String + + + + true + + + true + + true + + + СуммаЧисло + + <key>ru</key> + <value>Сумма число</value> + + 12 + + Number + + 10 + 2 + true + + + + true + + + true + + + + СуммаПрописью + + <key>ru</key> + <value>Сумма прописью</value> + + 13 + + String + + + + 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> + + 3 + + String + + + + true + + + true + + + + ДробнаяЧастьМножественноеЧисло + + <key>ru</key> + <value>Дробная часть множественное число</value> + + 4 + + String + + + + true + + + true + + + + Записать + + <key>ru</key> + <value>Записать</value> + + 1 + + ru + Записать + + + true + + + + Записать + + + Auto + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 2 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + ПараметрыПрописи + + String + + + + + КодЯзыка + + String + + + true + + + + + + diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Help/ru.html similarity index 100% rename from SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/ПараметрыПрописиВалюты/Help/ru.html rename to SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Help/ru.html diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Module.bsl new file mode 100644 index 000000000..82e2b52a6 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалюты_en/Module.bsl @@ -0,0 +1,138 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПрочитатьПараметрыПрописи(); + + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда + Элементы.ГруппаПримерПрописи.ВыравниваниеЭлементовИЗаголовков = ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево; + Элементы.СуммаПрописью.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + Элементы.СуммаПрописью.Высота = 2; + Элементы.СуммаПрописью.МногострочныйРежим = Истина; + ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиФормы.Авто; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СуммаЧисло = 123.45; + УстановитьСуммуПрописью(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПолеВводаПриИзменении(Элемент) + + Модифицированность = Истина; + УстановитьСуммуПрописью(); + ОповеститьВладельца(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + + Модифицированность = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + ОповеститьВладельца(Истина, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + ОповеститьВладельца(Истина); + Модифицированность = ВладелецФормы.Модифицированность; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиентеНаСервереБезКонтекста +Функция ПараметрыПрописи(Форма) + + ПараметрыПрописи = Новый Массив; + ПараметрыПрописи.Добавить(Форма.ЦелаяЧастьЕдинственноеЧисло); + ПараметрыПрописи.Добавить(Форма.ЦелаяЧастьМножественноеЧисло); + ПараметрыПрописи.Добавить(Форма.ДробнаяЧастьЕдинственноеЧисло); + ПараметрыПрописи.Добавить(Форма.ДробнаяЧастьМножественноеЧисло); + ПараметрыПрописи.Добавить(Форма.ДлинаДробнойЧасти); + + Возврат СтрСоединить(ПараметрыПрописи, ", ");; + +КонецФункции + +&НаКлиенте +Процедура УстановитьСуммуПрописью() + + Если ЗначениеЗаполнено(Параметры.КодЯзыка) Тогда + СуммаПрописью = ЧислоПрописью(СуммаЧисло, "L=" + Параметры.КодЯзыка + ";ДП=Ложь", ПараметрыПрописи(ЭтотОбъект)); // АПК:1357 + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьПараметрыПрописи() + + ПараметрыПрописи = СтрРазделить(Параметры.ПараметрыПрописи, ",", Истина); + Если ПараметрыПрописи.Количество() <> 5 Тогда + Возврат; + КонецЕсли; + + ЦелаяЧастьЕдинственноеЧисло = СокрЛП(ПараметрыПрописи[0]); + ЦелаяЧастьМножественноеЧисло = СокрЛП(ПараметрыПрописи[1]); + ДробнаяЧастьЕдинственноеЧисло = СокрЛП(ПараметрыПрописи[2]); + ДробнаяЧастьМножественноеЧисло = СокрЛП(ПараметрыПрописи[3]); + ДлинаДробнойЧасти = ОчиститьСтрокуСЧисломОтПостороннихСимволов(ПараметрыПрописи[4]); + +КонецПроцедуры + +&НаСервере +Функция ОчиститьСтрокуСЧисломОтПостороннихСимволов(СтрокаСЧислом) + + ПосторонниеСимволы = СтрСоединить(СтрРазделить(СтрокаСЧислом, "0123456789", Ложь), ""); + Возврат СтрСоединить(СтрРазделить(СтрокаСЧислом, ПосторонниеСимволы, Ложь), ""); + +КонецФункции + +&НаКлиенте +Процедура ОповеститьВладельца(Записать = Ложь, Закрыть = Ложь) + + ПараметрыПрописи = Новый Структура; + ПараметрыПрописи.Вставить("КодЯзыка", Параметры.КодЯзыка); + ПараметрыПрописи.Вставить("ПараметрыПрописи", ПараметрыПрописи(ЭтотОбъект)); + ПараметрыПрописи.Вставить("Записать", Записать); + ПараметрыПрописи.Вставить("Закрыть", Закрыть); + + Оповестить("ПараметрыПрописиВалюты", ПараметрыПрописи, ВладелецФормы); + +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form new file mode 100644 index 000000000..bea48a229 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Form.form @@ -0,0 +1,512 @@ + + + + <key>ru</key> + <value>Параметры прописи</value> + + + ГруппаЯзыки + 5 + true + true + + true + + + <key>ru</key> + <value>Языки</value> + + + ГруппаЯзыкиРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Страницы + 17 + true + true + + true + + + <key>ru</key> + <value>Страницы</value> + + + СтраницыРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Pages + + + OnCurrentPageChange + СтраницыПриСменеСтраницы + + TabsOnLeftHorizontal + Auto + + + + ГруппаПримерПрописи + 19 + + СуммаЧисло + 21 + + <key>ru</key> + <value>Сумма</value> + + true + true + + true + + + СуммаЧисло + + + OnChange + СуммаЧислоПриИзменении + + + СуммаЧислоExtendedTooltip + 23 + Label + true + true + + Left + + + + СуммаЧислоКонтекстноеМеню + 22 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + СуммаПрописью + 24 + true + true + + true + + + СуммаПрописью + + Left + + СуммаПрописьюExtendedTooltip + 26 + Label + true + true + + Left + + + + СуммаПрописьюКонтекстноеМеню + 25 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пример прописи суммы</value> + + + ГруппаПримерПрописиExtendedTooltip + 20 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + NormalSeparation + true + true + auto + Auto + Auto + + + None + false + + ФормаКоманднаяПанель + -1 + + ФормаЗаписатьИЗакрыть + 27 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписать + 29 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + 15 + LockOwner + true + true + Vertical + true + true + true + auto + true + + ОсновнойЯзык + 1 + + + true + + + true + + + + Языки + 3 + + ValueTable + + + true + + + true + + + КодЯзыка + 1 + + String + + 10 + + + + true + + + true + + + + Представление + 2 + + String + + + + true + + + true + + + + Имя + 3 + + String + + 32 + + + + true + + + true + + + + Суффикс + 4 + + String + + 10 + + + + true + + + true + + + + ФормаРедактирования + 5 + + String + + + + true + + + true + + + + Страница + 6 + + String + + + + true + + + true + + + + + МультиязычныеСтрокиВРеквизитах + 2 + + Boolean + + + true + + + true + + + + СуммаПрописью + + <key>ru</key> + <value>Сумма прописью</value> + + 4 + + String + + + + true + + + true + + + + СуммаЧисло + + <key>ru</key> + <value>Сумма число</value> + + 5 + + Number + + 10 + 2 + true + + + + true + + + true + + + + Записать + + <key>ru</key> + <value>Записать</value> + + 2 + + ru + Записать + + + true + + + + Записать + + + Auto + Auto + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 3 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + ИмяРеквизита + + String + + + + + Представления + + + + ТекущееЗначение + + String + + + + + ТолькоПросмотр + + Boolean + + + + + + + diff --git a/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl new file mode 100644 index 000000000..25193dde8 --- /dev/null +++ b/SSL/src/Catalogs/Валюты/Forms/ПараметрыПрописиВалютыНаДругихЯзыках/Module.bsl @@ -0,0 +1,530 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + НаборЯзыков = Новый ТаблицаЗначений; + НаборЯзыков.Колонки.Добавить("КодЯзыка", ОбщегоНазначения.ОписаниеТипаСтрока(10)); + НаборЯзыков.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(150)); + + ДоступныеЯзыки = Новый Массив; + Для Каждого Язык Из Метаданные.Языки Цикл + ДоступныеЯзыки.Добавить(Язык.КодЯзыка); + КонецЦикла; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ДоступныеЯзыки = МодульУправлениеПечатьюМультиязычность.ДоступныеЯзыки(); + КонецЕсли; + + Для Каждого КодЯзыка Из ДоступныеЯзыки Цикл + НовыйЯзык = НаборЯзыков.Добавить(); + НовыйЯзык.КодЯзыка = КодЯзыка; + НовыйЯзык.Представление = РаботаСКурсамиВалютСлужебный.ПредставлениеЯзыка(КодЯзыка); + КонецЦикла; + + ИмеющиесяЯзыкиВводаПрописей = ИмеющиесяЯзыкиВводаПрописей(); + + Для Каждого ЯзыкКонфигурации Из НаборЯзыков Цикл + Если ИмеющиесяЯзыкиВводаПрописей.Найти(ЯзыкКонфигурации.КодЯзыка) <> Неопределено Тогда + Продолжить; + КонецЕсли; + НоваяСтрока = Языки.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЯзыкКонфигурации); + НоваяСтрока.Имя = "_" + СтрЗаменить(Новый УникальныйИдентификатор, "-", ""); + КонецЦикла; + + СформироватьПоляВводаНаРазныхЯзыках(Ложь, Параметры.ТолькоПросмотр); + + ОписаниеЯзыка = ОписаниеЯзыка(ТекущийЯзык().КодЯзыка); + Если ОписаниеЯзыка <> Неопределено Тогда + ЭтотОбъект[ОписаниеЯзыка.Имя] = Параметры.ТекущееЗначение; + КонецЕсли; + + ОсновнойЯзык = Метаданные.ОсновнойЯзык.КодЯзыка; + + Для каждого Представление Из Параметры.Представления Цикл + + ОписаниеЯзыка = ОписаниеЯзыка(Представление.КодЯзыка); + Если ОписаниеЯзыка <> Неопределено Тогда + Если СтрСравнить(ОписаниеЯзыка.КодЯзыка, ТекущийЯзык().КодЯзыка) = 0 Тогда + ЭтотОбъект[ОписаниеЯзыка.Имя] = ?(ЗначениеЗаполнено(Параметры.ТекущееЗначение), Параметры.ТекущееЗначение, Представление[Параметры.ИмяРеквизита]); + Иначе + ЭтотОбъект[ОписаниеЯзыка.Имя] = Представление[Параметры.ИмяРеквизита]; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + СуммаЧисло = 123.45; + УстановитьСуммуПрописью(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиЭлементовШапкиФормы + +&НаКлиенте +Процедура СтраницыПриСменеСтраницы(Элемент, ТекущаяСтраница) + + УстановитьСуммуПрописью(); + +КонецПроцедуры + +&НаКлиенте +Процедура СуммаЧислоПриИзменении(Элемент) + + УстановитьСуммуПрописью(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПолеВводаПриИзменении(Элемент) + + Модифицированность = Истина; + УстановитьСуммуПрописью(); + ОповеститьВладельца(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПолеВводаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + + Модифицированность = Истина; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + ОповеститьВладельца(Истина, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + ОповеститьВладельца(Истина); + Модифицированность = ВладелецФормы.Модифицированность; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура СформироватьПоляВводаНаРазныхЯзыках(МногострочныйРежим, ТолькоПросмотр) + + Добавлять = Новый Массив; + ТипСтрока = Новый ОписаниеТипов("Строка"); + Для Каждого ЯзыкКонфигурации Из Языки Цикл + Добавлять.Добавить(Новый РеквизитФормы(ЯзыкКонфигурации.Имя, ТипСтрока,, ЯзыкКонфигурации.Представление)); + Добавлять.Добавить(Новый РеквизитФормы("ПодсказкаВвода" + ЯзыкКонфигурации.Имя, ТипСтрока,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подсказка ввода для языка %1'"), ЯзыкКонфигурации.Представление))); + КонецЦикла; + + ИзменитьРеквизиты(Добавлять); + РодительЭлементов = Элементы.Страницы; + + Для Каждого ЯзыкКонфигурации Из Языки Цикл + + Если СтрСравнить(ЯзыкКонфигурации.КодЯзыка, ТекущийЯзык().КодЯзыка) = 0 И РодительЭлементов.ПодчиненныеЭлементы.Количество() > 0 Тогда + Страница = Элементы.Вставить("Страница" + ЯзыкКонфигурации.Имя, Тип("ГруппаФормы"), РодительЭлементов, + РодительЭлементов.ПодчиненныеЭлементы.Получить(0)); + Иначе + Страница = Элементы.Добавить("Страница" + ЯзыкКонфигурации.Имя, Тип("ГруппаФормы"), РодительЭлементов); + КонецЕсли; + + ЯзыкКонфигурации.Страница = Страница.Имя; + + Страница.Вид = ВидГруппыФормы.Страница; + Страница.Заголовок = ЯзыкКонфигурации.Представление; + + ПолеВвода = Элементы.Добавить(ЯзыкКонфигурации.Имя, Тип("ПолеФормы"), Страница); + ПолеВвода.ПутьКДанным = ЯзыкКонфигурации.Имя; + + Если ЗначениеЗаполнено(ЯзыкКонфигурации.ФормаРедактирования) Тогда + ПолеВвода.Вид = ВидПоляФормы.ПолеНадписи; + ПолеВвода.Гиперссылка = Истина; + ПолеВвода.УстановитьДействие("Нажатие", "Подключаемый_Нажатие"); + Иначе + ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; + ПолеВвода.Ширина = 40; + ПолеВвода.МногострочныйРежим = МногострочныйРежим; + ПолеВвода.ТолькоПросмотр = ТолькоПросмотр; + ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПолеВводаПриИзменении"); + ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "Подключаемый_ПолеВводаИзменениеТекстаРедактирования"); + + Подсказка = ПодсказкаЗаполненияПараметровПрописей(ЯзыкКонфигурации.КодЯзыка); + ПолеВвода.ПодсказкаВвода = Подсказка.ПодсказкаВвода; + + ПодсказкаВвода = Элементы.Добавить("ПодсказкаВвода" + ЯзыкКонфигурации.Имя, Тип("ПолеФормы"), Страница); + ПодсказкаВвода.ПутьКДанным = "ПодсказкаВвода" + ЯзыкКонфигурации.Имя; + ПодсказкаВвода.Вид = ВидПоляФормы.ПолеВвода; + ПодсказкаВвода.ТолькоПросмотр = Истина; + ПодсказкаВвода.ЦветТекста = ЦветаСтиля.ПоясняющийТекст; + ПодсказкаВвода.РастягиватьПоВертикали = Истина; + ПодсказкаВвода.АвтоМаксимальнаяВысота = Ложь; + ПодсказкаВвода.МногострочныйРежим = Истина; + ПодсказкаВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ПодсказкаВвода.ЦветРамки = ЦветаСтиля.ЦветФонаФормы; + + Если Не ЗначениеЗаполнено(Подсказка.Инструкция) Тогда + Подсказка.Инструкция = НСтр("ru = 'Для данного языка настройка прописи не предусмотрена.'") + КонецЕсли; + ЭтотОбъект["ПодсказкаВвода" + ЯзыкКонфигурации.Имя] = Подсказка.Инструкция; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ОписаниеЯзыка(КодЯзыка) + + Отбор = Новый Структура("КодЯзыка", КодЯзыка); + НайденныеЭлементы = Языки.НайтиСтроки(Отбор); + Если НайденныеЭлементы.Количество() > 0 Тогда + Возврат НайденныеЭлементы[0]; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +&НаКлиенте +Процедура УстановитьСуммуПрописью() + + ТекущийЯзык = ОписаниеТекущегоЯзыка(); + Если ТекущийЯзык = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыПрописи = ЭтотОбъект[ТекущийЯзык.Имя]; + СуммаПрописью = ЧислоПрописью(СуммаЧисло, "L=" + ТекущийЯзык.КодЯзыка + ";ДП=Ложь", ПараметрыПрописи); // АПК:1357 + +КонецПроцедуры + +&НаКлиенте +Функция ОписаниеТекущегоЯзыка() + + ТекущаяСтраница = Элементы.Страницы.ТекущаяСтраница; + Если ТекущаяСтраница = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Языки.НайтиСтроки(Новый Структура("Страница", ТекущаяСтраница.Имя))[0]; + +КонецФункции + +&НаКлиенте +Процедура ОповеститьВладельца(Записать = Ложь, Закрыть = Ложь) + + ТекущийЯзык = ОписаниеТекущегоЯзыка(); + + ПараметрыПрописи = Новый Структура; + ПараметрыПрописи.Вставить("КодЯзыка", ТекущийЯзык.КодЯзыка); + ПараметрыПрописи.Вставить("ПараметрыПрописи", ЭтотОбъект[ТекущийЯзык.Имя]); + ПараметрыПрописи.Вставить("Записать", Записать); + ПараметрыПрописи.Вставить("Закрыть", Закрыть); + + Оповестить("ПараметрыПрописиВалюты", ПараметрыПрописи, ВладелецФормы); + +КонецПроцедуры + +&НаСервере +Функция ИмеющиесяЯзыкиВводаПрописей() + + Возврат РаботаСКурсамиВалютСлужебный.ФормыВводаПрописей().ВыгрузитьЗначения(); + +КонецФункции + +&НаСервере +Функция ПодсказкаЗаполненияПараметровПрописей(Знач КодЯзыка) + + Результат = Новый Структура; + Результат.Вставить("Инструкция", ""); + Результат.Вставить("ПодсказкаВвода", ""); + + Если Не ЗначениеЗаполнено(КодЯзыка) Тогда + Возврат Результат; + КонецЕсли; + + КодЯзыка = СтрРазделить(КодЯзыка, "_", Истина)[0]; + + Если КодЯзыка = "ru" Или КодЯзыка = "be" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для русского и белорусского языков (ru_RU, be_BY): + | + |рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2 + | + |""рубль, рубля, рублей, м"" – предмет исчисления: + |рубль – единственное число именительный падеж; + |рубля – единственное число родительный падеж; + |рублей – множественное число родительный падеж; + |м – мужской род (ж – женский род, с - средний род); + |""копейка, копейки, копеек, ж"" – дробная часть, аналогично предмету исчисления (может отсутствовать); + |""2"" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2'"); + + ИначеЕсли КодЯзыка = "uk" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для украинского языка (uk_UA): + | + |гривна, гривны, гривен, м, копейка, копейки, копеек, ж, 2 + | + |""гривна, гривны, гривен, м"" – предмет исчисления: + |""гривна – единственное число именительный падеж; + |гривны – единственное число родительный падеж; + |гривен – множественное число родительный падеж; + |м – мужской род (ж – женский род, с - средний род); + |""копейка, копейки, копеек, ж"" – дробная часть, аналогично предмету исчисления (может отсутствовать); + |""2"" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'гривна, гривны, гривен, м, копейка, копейки, копеек, ж, 2'"); + + ИначеЕсли КодЯзыка = "pl" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для польского языка (pl_PL): + | + |złoty, złote, złotych, m, grosz, grosze, groszy, m, 2 + | + |""złoty, złote, złotych, m "" - предмет исчисления (m - мужской род, ż - женский род, ń - средний род, mo – личностный мужской род). + |złoty - единственное число именительный падеж; + |złote - единственное число винительный падеж; + |złotych - множественное число винительный падеж; + |m - мужской род (ż - женский род, ń - средний род, mo – личностный мужской род); + |""grosz, grosze, groszy, m "" - дробная часть (может отсутствовать) (аналогично целой части); + |2 - количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'złoty, złote, złotych, m, grosz, grosze, groszy, m, 2'"); + + ИначеЕсли КодЯзыка = "en" Или КодЯзыка = "fr" Или КодЯзыка = "fi" Или КодЯзыка = "kk" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для английского, французского, финского и казахского языков (en_US, fr_CA,fi_FI, kk_KZ): + | + |dollar, dollars, cent, cents, 2 + | + |""dollar, dollars"" – предмет исчисления в единственном и множественном числе; + |""cent, cents"" – дробная часть в единственном и множественном числе (может отсутствовать); + |""2"" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'dollar, dollars, cent, cents, 2'"); + + ИначеЕсли КодЯзыка = "de" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для немецкого языка (de_DE): + | + |EURO, EURO, М, Cent, Cent, M, 2 + | + |""EURO, EURO, М"" – предмет исчисления: + |EURO, EURO – предмет исчисления в единственном и множественном числе; + |М – мужской род (F – женский род, N - средний род); + |""Cent, Cent, M"" – дробная часть, аналогично предмету исчисления (может отсутствовать); + |""2"" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'EURO, EURO, М, Cent, Cent, M, 2'"); + + ИначеЕсли КодЯзыка = "lv" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для латышского языка (lv_LV): + | + |lats, lati, latu, V, santīms, santīmi, santīmu, V, 2, J, J + | + |""lats, lati, latu, v"" – предмет исчисления: + |lats – для чисел заканчивающихся на 1, кроме 11; + |lati – для чисел заканчивающихся на 2-9 и 11; + |latu – множественное число (родительный падеж) используется после числительных 0, 10, 20,..., 90, 100, 200, ..., 1000, ..., 100000; + |v – мужской род (s – женский род); + |""santīms, santīmi, santīmu, V"" – дробная часть, аналогично предмету исчисления (может отсутствовать); + |""2"" – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2); + |""J"" - число 100 выводится как ""Одна сотня"" для предмета исчисления (N - как ""Сто""); + |может отсутствовать, по умолчанию равно ""J""; + |""J"" - число 100 выводится как ""Одна сотня"" для дробной части (N - как ""Сто""); + |может отсутствовать, по умолчанию равно ""J"".'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'lats, lati, latu, V, santīms, santīmi, santīmu, V, 2, J, J'"); + + ИначеЕсли КодЯзыка = "lt" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для литовского языка (lt_LT): + | + |litas, litai, litų, М, centas, centai, centų, М, 2 + | + |""litas, litai, litų, М"" – предмет исчисления: + |litas - единственное число целой части; + |litai - множественное число целой части от 2 до 9; + |litų - множественное число целой части прочие; + |m - род целой части (f - женский род), + |""centas, centai, centų, М"" – дробная часть, аналогично предмету исчисления (может отсутствовать); + |""2"" - количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'litas, litai, litų, М, centas, centai, centų, М, 2'"); + + ИначеЕсли КодЯзыка = "et" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для эстонского языка (et_EE): + | + |kroon, krooni, sent, senti, 2 + | + |""kroon, krooni"" – – предмет исчисления в единственном и множественном числе; + |""sent, senti"" – дробная часть в единственном и множественном числе (может отсутствовать); + |2 – количество разрядов дробной части (может отсутствовать, по умолчанию равно 2).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'kroon, krooni, sent, senti, 2'"); + + ИначеЕсли КодЯзыка = "bg" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для болгарского языка (bg_BG): + | + |лев, лева, м, стотинка, стотинки, ж, 2 + | + |""лев, лева, м"" – предмет исчисления: + |лев - единственное число целой части; + |лева - множественное число целой части; + |м - род целой части, + |""стотинка, стотинки, ж"" - дробная часть: + |стотинка - единственное число дробной части; + |стотинки - множественное число дробной части; + |ж - род дробной части, + |""2"" - количество разрядов дробной части.'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'лев, лева, м, стотинка, стотинки, ж, 2'"); + + ИначеЕсли КодЯзыка = "ro" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для румынского языка (ro_RO): + | + |leu, lei, M, ban, bani, W, 2 + | + |""leu, lei, M"" – предмет исчисления: + |leu - единственное число целой части; + |lei - множественное число целой части; + |M - род целой части; + |""ban, bani, W"" - дробная часть: + |ban - единственное число дробной части; + |bani - множественное число дробной части; + |W - род дробной части; + |""2"" - количество разрядов дробной части.'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'leu, lei, M, ban, bani, W, 2'"); + + ИначеЕсли КодЯзыка = "ka" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для грузинского языка (ka_GE): + | + |ლარი, თეთრი, 2 + | + |ლარი - целая часть; + |თეთრი - дробная часть; + |""2"" - количество разрядов дробной части.'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'ლარი, თეთრი, 2'"); + + ИначеЕсли КодЯзыка = "az" Или КодЯзыка = "tk" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для азербайджанского(az) и туркменского языков(tk): + | + |TL,Kr,2 + | + |""TL"" - предмет исчисления; + |""Kr"" - дробная часть (может отсутствовать); + |2 - количество разрядов дробной части (может отсутствовать, по умолчанию - 2)'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'TL,Kr,2'"); + + ИначеЕсли КодЯзыка = "vi" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для вьетнамского языка (vi_VN): + | + |dong, xu, 2 + | + |dong, - целая часть; + |xu, - дробная часть; + |2 - количество разрядов дробной части.'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'dong, xu, 2'"); + + ИначеЕсли КодЯзыка = "tr" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для турецкого языка (tr_TR): + | + |TL,Kr,2,Separate + | + |TL - целая часть; + |Kr - дробная часть (может отсутствовать); + |2 - количество разрядов дробной части (может отсутствовать, значение по умолчанию - 2); + |""Separate"" - признак написания прописи раздельно, ""Solid"" - слитно (может отсутствовать, по умолчанию слитно).'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'TL,Kr,2,Separate'"); + + ИначеЕсли КодЯзыка = "hu" Тогда + + Результат.Инструкция = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Параметры прописи необходимо перечислить через запятую. + |Образец заполнения для венгерского языка (hu): + | + |Forint, fillér, 2 + | + |Forint - целая часть; + |fillér - дробная часть; + |""2"" - количество разрядов дробной части.'")); + + Результат.ПодсказкаВвода = НСтр("ru = 'Forint, fillér, 2'"); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form index 64b5ed1b2..963f22b37 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form @@ -785,7 +785,7 @@ - ПараметрыПрописиВалюты + ГиперссылкаПараметрыПрописиВалюты 145 <key>ru</key> @@ -797,7 +797,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПараметрыПрописиВалютыРасширеннаяПодсказка</name> + <name>ГиперссылкаПараметрыПрописиВалютыРасширеннаяПодсказка</name> <id>147</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -807,7 +807,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПараметрыПрописиВалютыКонтекстноеМеню</name> + <name>ГиперссылкаПараметрыПрописиВалютыКонтекстноеМеню</name> <id>146</id> <autoFill>true</autoFill> </contextMenu> @@ -823,14 +823,44 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </items> - <commandBarLocation>Top</commandBarLocation> - <showCommandBar>true</showCommandBar> <autoCommandBar> <name>ФормаКоманднаяПанель</name> <id>-1</id> + <items xsi:type="form:FormGroup"> + <name>ГруппаПараметрыПрописиВалюты</name> + <id>154</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Параметры прописи</value> + + + ГруппаПараметрыПрописиВалютыРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Popup + + Auto + Normal + + Left true + + NotificationProcessing + ОбработкаОповещения + OnCreateAtServer ПриСозданииНаСервере @@ -861,13 +891,10 @@ true - ПолеПрописи1наРусском - 2 + ФормыВводаПрописей + 14 - String - - 25 - + ValueList true @@ -875,201 +902,47 @@ true - true + + + - - ПолеПрописи2наРусском - 3 - - String - - 25 - - - + + ПараметрыПрописиВалютыНаДругихЯзыках + + <key>ru</key> + <value>На других языках...</value> + + 1 + + ru + Параметры прописи валюты на других языках + + true - - - true - - true - - - ПолеПрописи3наРусском - 4 - - String - - 25 - - - - true - - - true - - true - - - ПолеПрописи4наРусском - 5 - - String - - - - true - - - true - - true - - - ПолеПрописи5наРусском - 6 - - String - - 25 - - - - true - - - true - - true - - - ПолеПрописи6наРусском - 7 - - String - - 25 - - - - true - - - true - - true - - - ПолеПрописи7наРусском - 8 - - String - - 25 - - - - true - - - true - - true - - - ПолеПрописи8наРусском - 9 - - String - - 25 - - - - true - - - true - - true - - - ДлинаДробнойЧасти - 11 - - String - - - - true - - - true - - true - - - ЗависимыйКурсВалют - 10 - - Boolean - - - true - - - true - - true - - - СуммаЧисло - 12 - - Number - - 10 - 2 - true - - - - true - - - true - - - - СуммаПрописью - 13 - - String - - - - true - - - true - - - - ЕстьФормаПараметрыПрописиВалюты - 16 - - Boolean - - - true - - - true - - + + + + ПараметрыПрописиВалютыНаДругихЯзыках + + + Auto + Auto + - + + + 0 + + + + 0 + + + + 0 + + + diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl index a8aa82cc0..f02d601f1 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl @@ -38,13 +38,13 @@ КонецЕсли; ОбработкаЗагрузкаКурсовВалют = Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют"); - Если ОбработкаЗагрузкаКурсовВалют <> Неопределено Тогда - ЕстьФормаПараметрыПрописиВалюты = ОбработкаЗагрузкаКурсовВалют.Формы.Найти("ПараметрыПрописиВалюты") <> Неопределено; - КонецЕсли; - Элементы.КурсВалютыЗагружаетсяИзИнтернета.Видимость = ОбработкаЗагрузкаКурсовВалют <> Неопределено; УстановитьДоступностьЭлементов(ЭтотОбъект); + ЗаполнитьПодменюПараметрыПрописиВалюты(); + Элементы.ГиперссылкаПараметрыПрописиВалюты.Видимость = ФормыВводаПрописей.Количество() = 1; + Элементы.ГруппаПараметрыПрописиВалюты.Видимость = ФормыВводаПрописей.Количество() > 1; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда Элементы.ФормулаРасчетаКурса.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСнизу; Элементы.ОсновнаяВалюта.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; @@ -54,6 +54,23 @@ КонецПроцедуры +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + + Если Источник = ЭтотОбъект И ИмяСобытия = "ПараметрыПрописиВалюты" Тогда + УстановитьПрописиНаЯзыке(Параметр.ПараметрыПрописи, Параметр.КодЯзыка); + Если Параметр.Записать Тогда + Записать(); + Иначе + Модифицированность = Истина; + КонецЕсли; + Если Параметр.Закрыть Тогда + Закрыть(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область ОбработчикиСобытийЭлементовШапкиФормы @@ -77,16 +94,7 @@ &НаКлиенте Процедура ПараметрыПрописиВалютыНажатие(Элемент) - ОписаниеОповещения = Новый ОписаниеОповещения("ПриИзмененииПараметровПрописиВалюты", ЭтотОбъект); - Если ЕстьФормаПараметрыПрописиВалюты Тогда - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("ТолькоПросмотр", ТолькоПросмотр); - ПараметрыОткрытия.Вставить("ПараметрыПрописи", Объект.ПараметрыПрописи); - ИмяФормыРедактированияПрописей = "Обработка.ЗагрузкаКурсовВалют.Форма.ПараметрыПрописиВалюты"; - ОткрытьФорму(ИмяФормыРедактированияПрописей, ПараметрыОткрытия, ЭтотОбъект, , , , ОписаниеОповещения); - Иначе - ПоказатьВводСтроки(ОписаниеОповещения, Объект.ПараметрыПрописи, НСтр("ru = 'Параметры прописи валюты'")); - КонецЕсли; + ОткрытьПараметрыПрописиВалюты(0); КонецПроцедуры @@ -137,13 +145,128 @@ КонецПроцедуры &НаКлиенте -Процедура ПриИзмененииПараметровПрописиВалюты(Результат, ДополнительныеПараметры) Экспорт - Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Отмена Тогда +Процедура УстановитьПрописиНаЯзыке(ПараметрыПрописи, КодЯзыка) + + Если КодЯзыка = ОбщегоНазначенияКлиент.КодОсновногоЯзыка() Тогда + Объект.ПараметрыПрописи = ПараметрыПрописи; Возврат; КонецЕсли; - Объект.ПараметрыПрописи = Результат; - Модифицированность = Истина; + НайденнаяСтрока = Неопределено; + Для Каждого СтрокаТаблицы Из Объект.Представления Цикл + Если СтрокаТаблицы.КодЯзыка = КодЯзыка Тогда + НайденнаяСтрока = СтрокаТаблицы; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НайденнаяСтрока = Неопределено Тогда + НайденнаяСтрока = Объект.Представления.Добавить(); + НайденнаяСтрока.КодЯзыка = КодЯзыка; + КонецЕсли; + + НайденнаяСтрока.ПараметрыПрописи = ПараметрыПрописи; + +КонецПроцедуры + +&НаКлиенте +Функция ПараметрыПрописиВалютыНаЯзыке(КодЯзыка) + + Если КодЯзыка = ОбщегоНазначенияКлиент.КодОсновногоЯзыка() Тогда + Возврат Объект.ПараметрыПрописи; + КонецЕсли; + + НайденнаяСтрока = Неопределено; + Для Каждого СтрокаТаблицы Из Объект.Представления Цикл + Если СтрокаТаблицы.КодЯзыка = КодЯзыка Тогда + НайденнаяСтрока = СтрокаТаблицы; + КонецЕсли; + КонецЦикла; + + Если НайденнаяСтрока = Неопределено Тогда + Возврат ""; + КонецЕсли; + + Возврат НайденнаяСтрока.ПараметрыПрописи; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьПодменюПараметрыПрописиВалюты() + + Кнопка = Неопределено; + ФормыВводаПрописей = РаботаСКурсамиВалютСлужебный.ФормыВводаПрописей(); + Для Индекс = 0 По ФормыВводаПрописей.Количество() - 1 Цикл + ИмяКоманды = "ПараметрыПрописиВалюты_" + XMLСтрока(Индекс); + + КодЯзыка = ФормыВводаПрописей[Индекс].Значение; + Команда = Команды.Добавить(ИмяКоманды); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Команда.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1...'"), + РаботаСКурсамиВалютСлужебный.ПредставлениеЯзыка(КодЯзыка));; + Иначе + Команда.Заголовок = НСтр("ru = 'На других языках...'"); + КонецЕсли; + + Команда.Действие = "Подключаемый_ОткрытьФормуПараметрыПрописиВалюты"; + + Кнопка = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.ГруппаПараметрыПрописиВалюты); + Кнопка.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + Кнопка.ИмяКоманды = ИмяКоманды; + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// Команда - КомандаФормы +// +&НаКлиенте +Процедура Подключаемый_ОткрытьФормуПараметрыПрописиВалюты(Команда) + + Индекс = Число(Сред(Команда.Имя, СтрДлина("ПараметрыПрописиВалюты_") + 1)); + ОткрытьПараметрыПрописиВалюты(Индекс); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьПараметрыПрописиВалюты(Индекс) + + ИмяФормыПрописей = ФормыВводаПрописей[Индекс].Представление; + КодЯзыка = ФормыВводаПрописей[Индекс].Значение; + + Если ИмяФормыПрописей = "ПараметрыПрописиВалютыНаДругихЯзыках" Тогда + ПараметрыПрописиВалютыНаДругихЯзыках(); + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПараметрыПрописи", ПараметрыПрописиВалютыНаЯзыке(КодЯзыка)); + ПараметрыФормы.Вставить("КодЯзыка", КодЯзыка); + + ОткрытьФорму(ИмяФормыПрописей, ПараметрыФормы, ЭтотОбъект, , , НавигационнаяСсылка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПараметрыПрописиВалютыНаДругихЯзыках(Команда) + + ПараметрыПрописиВалютыНаДругихЯзыках(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыПрописиВалютыНаДругихЯзыках() + + ИмяРеквизита = "ПараметрыПрописи"; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ИмяРеквизита", ИмяРеквизита); + ПараметрыФормы.Вставить("ТекущееЗначение", Объект.ПараметрыПрописи); + ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); + ПараметрыФормы.Вставить("Представления", Объект.Представления); + + ОткрытьФорму("Справочник.Валюты.Форма.ПараметрыПрописиВалютыНаДругихЯзыках", ПараметрыФормы, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/Валюты/ManagerModule.bsl b/SSL/src/Catalogs/Валюты/ManagerModule.bsl index 37800e1d8..3f1d6d737 100644 --- a/SSL/src/Catalogs/Валюты/ManagerModule.bsl +++ b/SSL/src/Catalogs/Валюты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/Валюты/Валюты.mdo b/SSL/src/Catalogs/Валюты/Валюты.mdo index 5a1c43cf9..84275885f 100644 --- a/SSL/src/Catalogs/Валюты/Валюты.mdo +++ b/SSL/src/Catalogs/Валюты/Валюты.mdo @@ -302,6 +302,64 @@ Use Use + + + + + + Представления + + ru + Представления + + + Use + LineNumber + + Use + + + + + КодЯзыка + + ru + Код языка + + + String + + 10 + + + + + Use + Index + Use + + + ПараметрыПрописи + + ru + Параметры прописи + + + String + + 200 + + + + ru + Настройки представления суммы прописью + + + + Use + Use + + ФормаСписка @@ -325,4 +383,28 @@ PersonalComputer MobileDevice + + ПараметрыПрописиВалюты_en + + ru + Параметры прописи валюты на английском языке + + АПК:58 + + + ru + + + PersonalComputer + MobileDevice + + + ПараметрыПрописиВалютыНаДругихЯзыках + + ru + Параметры прописи + + PersonalComputer + MobileDevice + diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl b/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl index 4ba53c400..153f6ef3e 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl index d5d235720..c41644bf6 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl @@ -347,8 +347,7 @@ // Добавляет рекурсивно строку в дерево подсистем. // // Параметры: -// ПриемникРодитель - СтрокаДереваЗначений -// - ДеревоЗначений: +// ПриемникРодитель - ДеревоЗначений: // * Ссылка - СправочникСсылка.ИдентификаторыОбъектовРасширений // - СправочникСсылка.ИдентификаторыОбъектовМетаданных // * Имя - Строка diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl index 6a3fd1469..a41f763b0 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -94,7 +94,7 @@ Список.Параметры.УстановитьЗначениеПараметра("ДоступныеОтчеты", ВариантыОтчетов.ОтчетыТекущегоПользователя()); Список.Параметры.УстановитьЗначениеПараметра("ОтключенныеВариантыПрограммы", Новый Массив(ВариантыОтчетовПовтИсп.ОтключенныеВариантыПрограммы())); - Список.Параметры.УстановитьЗначениеПараметра("ЭтоОсновнойЯзык", ВариантыОтчетов.ЭтоОсновнойЯзык()); + Список.Параметры.УстановитьЗначениеПараметра("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); Список.Параметры.УстановитьЗначениеПараметра("КодЯзыка", ТекущийЯзык().КодЯзыка); Список.Параметры.УстановитьЗначениеПараметра("ВерсияРасширений", ПараметрыСеанса.ВерсияРасширений); diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl index 79f51c909..24abf915e 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -59,7 +59,10 @@ ПерезаполнитьДерево(Ложь); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; ВариантыОтчетов.ОпределитьПоведениеСпискаПользователейВариантаОтчета(ЭтотОбъект); @@ -95,7 +98,11 @@ Если ЭтоПредопределенный Тогда ПредопределенныйВариант = ТекущийОбъект.ПредопределенныйВариант.ПолучитьОбъект(); - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ПредопределенныйВариант); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ПредопределенныйВариант); + КонецЕсли; ОписаниеИзменено = Не ПустаяСтрока(Объект.Описание) И НРег(СокрЛП(Объект.Описание)) <> НРег(СокрЛП(ПредопределенныйВариант.Описание)); Если Не ОписаниеИзменено Тогда @@ -115,7 +122,11 @@ КонецЕсли; ВариантыОтчетов.ДеревоПодсистемЗаписать(ТекущийОбъект, ИзмененныеРазделы); - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + Если ЭтоПредопределенный И Не ОписаниеИзменено Тогда ТекущийОбъект.Представления.Очистить(); КонецЕсли; @@ -126,17 +137,22 @@ &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) - + // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - + ПерезаполнитьДерево(Ложь); ЗаполнитьИзПредопределенного(ТекущийОбъект); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -156,7 +172,11 @@ // Конец СтандартныеПодсистемы.УправлениеДоступом ЗаполнитьИзПредопределенного(ТекущийОбъект); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; РегистрыСведений.НастройкиВариантовОтчетов.ПрочитатьНастройкиДоступностиВариантаОтчета( ТекущийОбъект.Ссылка, ПользователиВарианта, ИспользоватьГруппыПользователей, ИспользоватьВнешнихПользователей); @@ -183,7 +203,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl index 4037d5e13..26676adfe 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -35,7 +35,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -132,7 +134,17 @@ Данные.Ссылка = Данные.ПредопределенныйВариант; КонецЕсли; - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl index acdb0c002..babbd5c53 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/ObjectModule.bsl @@ -193,7 +193,10 @@ Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl index 30ba26869..7eb035085 100644 --- a/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВерсииРасширений/ManagerModule.bsl @@ -379,7 +379,8 @@ // Для общих форм Расширения, УстановленныеИсправления. // // Возвращаемое значение: -// РасширениеКонфигурации, Неопределено +// РасширениеКонфигурации +// Неопределено // Функция НайтиРасширение(ИдентификаторРасширения) Экспорт @@ -511,7 +512,7 @@ // Для общих форм Расширения, УстановленныеИсправления. // // Возвращаемое значение: -// Массив Из УникальныйИдентификатор +// Массив из УникальныйИдентификатор // Функция ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(ИдентификаторыРасширений) Экспорт diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl index db5f0ca3f..53f2ca34f 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ВерсииФайла/Module.bsl @@ -317,7 +317,7 @@ | ВерсииФайлов.Расширение КАК Расширение, | ВерсииФайлов.НомерВерсии КАК НомерВерсии |ИЗ - | Справочник." + ИмяСправочникаХранилищаВерсийФайлов + " КАК ВерсииФайлов + | &ИмяСправочника КАК ВерсииФайлов |ГДЕ | ВерсииФайлов.Владелец = &Владелец"; diff --git a/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl index a4f097806..9b16e6517 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -33,7 +33,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl index e990daf40..11c1a5cb7 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl @@ -51,10 +51,12 @@ "ВЫБРАТЬ | ВерсииФайлов.Ссылка КАК Ссылка |ИЗ - | Справочник." + Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя + " КАК ВерсииФайлов + | &ИмяСправочникаВерсииФайлов КАК ВерсииФайлов |ГДЕ | ВерсииФайлов.РодительскаяВерсия = &РодительскаяВерсия"; + ИмяСправочникаВерсииФайлов = "Справочник." + Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)).Имя; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяСправочникаВерсииФайлов", ИмяСправочникаВерсииФайлов); Запрос.УстановитьПараметр("РодительскаяВерсия", Ссылка); Результат = Запрос.Выполнить(); diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl index 357ba3a26..7f243b8fc 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -83,7 +83,10 @@ ДоступныДополнительныеНастройкиАдреса = (Метаданные.Обработки.Найти("РасширенныйВводКонтактнойИнформации") <> Неопределено И Метаданные.Обработки["РасширенныйВводКонтактнойИнформации"].Формы.Найти("НастройкиАдреса") <> Неопределено); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; Элементы.ЗаполнитьИдентификаторДляФормул.Доступность = НЕ Элементы.ИдентификаторДляФормул.ТолькоПросмотр; @@ -102,7 +105,10 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -135,9 +141,7 @@ Новый ОписаниеОповещения("ПослеОтветаНаВопросКогдаИдентификаторДляФормулУжеИспользуется", ЭтотОбъект, ПараметрыЗаписи), ТекстВопроса, Кнопки, , "ПродолжитьЗапись"); - ОтказПриЗаписи = Истина; Отказ = Истина; - Возврат; Иначе ПараметрыЗаписи.Вставить("ПроверкаИдентификатораДляФормулВыполнена"); @@ -166,7 +170,10 @@ ТекущийОбъект.ДополнительныеСвойства.Вставить("ПроверкаИдентификатораДляФормулВыполнена"); КонецЕсли; - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -183,7 +190,10 @@ Элементы.ЗаполнитьИдентификаторДляФормул.Доступность = НЕ Элементы.ИдентификаторДляФормул.ТолькоПросмотр; - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -271,7 +281,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -427,7 +442,7 @@ &НаСервереБезКонтекста Функция НаименованиеДляФормированияИдентификатора(Знач Наименование, Знач Представления) - Если ТекущийЯзык() <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда + Если ТекущийЯзык().КодЯзыка <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда Отбор = Новый Структура(); Отбор.Вставить("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка()); НайденныеСтроки = Представления.НайтиСтроки(Отбор); diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl index 9ad692ec0..14c87bb12 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -32,7 +32,9 @@ // СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов -// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +// Возвращаемое значение: +// см. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов.ЗаблокированныеРеквизиты. +// Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт БлокируемыеРеквизиты = Новый Массив; @@ -54,7 +56,9 @@ // Проверки на запрет замены групп и ссылок разных типов производятся автоматически при начале замены. // // Параметры: -// ПарыЗамен - Соответствие - Ключ - что будет заменено, значение - на что будет заменено. +// ПарыЗамен - Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - что будет заменено +// * Значение - ЛюбаяСсылка - на что будет заменено // Параметры - Структура - набор флагов, описывающих действие с заменяемыми элементами. // Содержит необязательные реквизиты: // * СпособУдаления - Строка - может принимать значения: @@ -65,8 +69,9 @@ // Любые другие значения говорят о том, что заменяемая ссылка не будет изменена. // // Возвращаемое значение: -// Соответствие - Ключ - исходная ссылка, значение - строка - описание, почему замена недопустима. -// Если все замены допустимы, то возвращается пустое соответствие; +// Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - исходная ссылка +// * Значение - Строка - описание, почему замена недопустима. Если все замены допустимы, то возвращается пустое соответствие // Функция ВозможностьЗаменыЭлементов(Знач ПарыЗамен, Знач Параметры = Неопределено) Экспорт @@ -173,7 +178,17 @@ #Область ОбработчикиСобытий Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры #КонецОбласти @@ -188,10 +203,10 @@ // информации (родитель) а также соответствие идентификатора правилам написания. // // Параметры: -// ИдентификаторДляФормул - Строка - идентификатор для формул. -// Ссылка - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на текущий объект. -// Родитель - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на родитель текущего объекта. -// Отказ - Булево - флаг отказа при наличии ошибки. +// ИдентификаторДляФормул - Строка - идентификатор для формул. +// Ссылка - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на текущий объект. +// Родитель - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на родитель текущего объекта. +// Отказ - Булево - флаг отказа при наличии ошибки. // Процедура ПроверитьУникальностьИдентификатора(ИдентификаторДляФормул, Ссылка, Родитель, Отказ) Экспорт @@ -276,11 +291,11 @@ // Возвращает уникальный идентификатора для формул (после проверки на уникальность) // // Параметры: -// ПредставлениеОбъекта - Строка - представление, из которого будет сформирован идентификатор для формул. -// СсылкаНаТекущийОбъект - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на текущий элемент. -// Родитель - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на родитель текущего объекта. +// ПредставлениеОбъекта - Строка - представление, из которого будет сформирован идентификатор для формул. +// СсылкаНаТекущийОбъект - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на текущий элемент. +// Родитель - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на родитель текущего объекта. // Возвращаемое значение: -// Строка - уникальное значение идентификатора для формул. +// Строка - уникальное значение идентификатора для формул. // Функция УникальныйИдентификаторДляФормул(ПредставлениеОбъекта, СсылкаНаТекущийОбъект, Родитель) Экспорт diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl index 736b13b77..52295a7fa 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ObjectModule.bsl @@ -90,7 +90,7 @@ Функция НаименованиеДляФормированияИдентификатора() НаименованиеДляИдентификатора = Наименование; - Если ТекущийЯзык() <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда + Если ТекущийЯзык().КодЯзыка <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда Отбор = Новый Структура(); Отбор.Вставить("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка()); НайденныеСтроки = Представления.НайтиСтроки(Отбор); @@ -104,7 +104,10 @@ Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/ВидыПроверок/ManagerModule.bsl b/SSL/src/Catalogs/ВидыПроверок/ManagerModule.bsl index 3de8f8906..9974d705d 100644 --- a/SSL/src/Catalogs/ВидыПроверок/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыПроверок/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -32,7 +32,9 @@ // СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов -// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +// Возвращаемое значение: +// см. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов.ЗаблокированныеРеквизиты. +// Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт БлокируемыеРеквизиты = Новый Массив; diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form index 6c875138e..622e13405 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Form.form @@ -41,7 +41,7 @@ false - CommonPicture.Предупреждение32 + CommonPicture.Вопрос32 @@ -53,7 +53,7 @@ %1 -Проверить обновление компоненты? +Проверить и загрузить обновление компоненты? true true @@ -91,10 +91,6 @@ true - - <key>ru</key> - <value>Шапка</value> - ШапкаРасширеннаяПодсказка 12 @@ -127,10 +123,6 @@ ПодключитьИнтернетПоддержкуРасширеннаяПодсказка 23 - - <key>ru</key> - <value>Для использования веб-сервиса 1С и загрузки внешних компонент необходимо выполнить подключение к Интернет-поддержке пользователей.</value> - Label true true @@ -145,7 +137,6 @@ true true UserCmds - Button Auto true @@ -482,10 +473,6 @@ true - - <key>ru</key> - <value>Страницы</value> - СтраницыРасширеннаяПодсказка 2 diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl index c1716a58a..b9d035790 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ОбновлениеКомпонентСПортала1СИТС/Module.bsl @@ -39,7 +39,7 @@ Элементы.ДекорацияПояснение.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1 - |Проверить обновление компоненты?'"), + |Проверить и загрузить обновление компоненты?'"), ТекстПояснения); Элементы.ПодключитьИнтернетПоддержку.Видимость = Не ДанныеАутентификацииПорталаСохранены; diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form index 165265ca0..c4b74ec4f 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/Forms/ПоискКомпонентыНаПортале1СИТС/Form.form @@ -92,10 +92,6 @@ true - - <key>ru</key> - <value>Шапка</value> - ШапкаРасширеннаяПодсказка 12 @@ -381,10 +377,6 @@ true - - <key>ru</key> - <value>Страницы</value> - СтраницыРасширеннаяПодсказка 2 diff --git a/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl index a06b13796..79697d09b 100644 --- a/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеКомпоненты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -39,7 +39,7 @@ // // Параметры: // Идентификатор - Строка - идентификатор объекта внешнего компонента. -// Версия - Строка - (необязательный) версия компоненты. +// Версия - Строка - версия компоненты. // // Возвращаемое значение: // СправочникСсылка.ВнешниеКомпоненты - ссылка на контейнер внешней компоненты в информационной базе. diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl index 7efbf83ec..ac9fddff1 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -661,14 +661,14 @@ #Область СлужебныеПроцедурыИФункции // Возвращаемое значение: -// Структура: -// * ВыборГруппВнешнихПользователей - Булево -// * ОтборОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь -// * РасширенныйПодбор - Булево -// * ГруппаВсеПользователи - СправочникСсылка.ГруппыВнешнихПользователей -// * ТекущаяСтрока - Число -// * ЗаголовокФормыПодбора - Строка -// * ИспользоватьГруппы - Булево +// Структура: +// * ВыборГруппВнешнихПользователей - Булево +// * ОтборОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь +// * РасширенныйПодбор - Булево +// * ГруппаВсеПользователи - СправочникСсылка.ГруппыВнешнихПользователей +// * ТекущаяСтрока - Число +// * ЗаголовокФормыПодбора - Строка +// * ИспользоватьГруппы - Булево // &НаСервере Функция НовыйХранимыеПараметры() @@ -1180,7 +1180,7 @@ // Параметры: // Ответ - КодВозвратаДиалога // ДополнительныеПараметры - Структура: -// * ПараметрыПеретаскивания - ПараметрыПеретаскивания +// * ПараметрыПеретаскивания - Массив из СправочникСсылка.ВнешниеПользователи // * Строка - СправочникСсылка.ГруппыВнешнихПользователей // * Перемещение - ДействиеПеретаскивания // diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form index 936228c91..b30b11622 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form @@ -1025,6 +1025,40 @@ true + + ПользовательИБЗапрещеноВосстанавливатьПароль + 361 + true + true + + true + + + ПользовательИБЗапрещеноВосстанавливатьПароль + + Right + + ПользовательИБЗапрещеноВосстанавливатьПарольРасширеннаяПодсказка + 363 + Label + true + true + + Left + + + + ПользовательИБЗапрещеноВосстанавливатьПарольКонтекстноеМеню + 362 + true + + CheckBoxField + Enter + true + Left + true + + true true @@ -1846,6 +1880,68 @@ false + + СтраницаКонтактнаяИнформация + 357 + + ГруппаКонтактнаяИнформация + 359 + true + true + + true + + + <key>ru</key> + <value>Контактная информация</value> + + + ГруппаКонтактнаяИнформацияРасширеннаяПодсказка + 360 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Адреса, телефоны</value> + + + СтраницаКонтактнаяИнформацияРасширеннаяПодсказка + 358 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + СтраницаДополнительныеРеквизиты 300 @@ -2759,6 +2855,65 @@ true + + ПользовательИБАдресЭлектроннойПочты + 4 + + String + + 256 + + + + true + + + true + + + + ИмяРеквизитаСПочтойДляВосстановленияПароля + 7 + + String + + + + true + + + true + + + + ПарольДляПодтвержденияИзмененияПочты + 32 + + + true + + + true + + + + ПользовательИБЗапрещеноВосстанавливатьПароль + + <key>ru</key> + <value>Пользователю запрещено восстанавливать пароль</value> + + 41 + + Boolean + + + true + + + true + + true + ПоказатьТолькоВыбранныеРоли diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl index fa0c6c3a0..43cd0b846 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -48,6 +48,7 @@ ЗначениеКопирования = Параметры.ЗначениеКопирования; Объект.Наименование = ""; Объект.ОбъектАвторизации = Неопределено; + ПользовательИБАдресЭлектроннойПочты = ""; Если Не ПользователиСлужебный.УровеньДоступаПользователяВыше(ЗначениеКопирования, УровеньДоступа) Тогда ПрочитатьПользователяИБ(ЗначениеЗаполнено(ЗначениеКопирования.ИдентификаторПользователяИБ)); @@ -131,10 +132,44 @@ МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры); КонецЕсли; + ПарольДляПодтвержденияИзмененияПочты = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + + МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]); + + Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + + Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда + ПарольДляПодтвержденияИзмененияПочты = ""; + КонецЕсли; + + ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля( + ЭтотОбъект, + ПользовательИБАдресЭлектроннойПочты, + ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект), + Истина); + + КонецЕсли; + + Элементы.ГруппаКонтактнаяИнформация.Доступность = Пользователи.ЭтоПолноправныйПользователь(); + + КонецЕсли; + КонецЕсли; + Если Не ПользователиСлужебныйПовтИсп.Настройки().ОбщиеНастройкиВхода Тогда Элементы.ГруппаИзменитьОграничение.Видимость = Ложь; КонецЕсли; + Если Не ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() + Или ОбщегоНазначения.РазделениеВключено() Тогда + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; + КонецЕсли; + Элементы.ПотребоватьСменуПароляПриВходе.РасширеннаяПодсказка.Заголовок = ПользователиСлужебный.ПодсказкаПотребоватьСменуПароляПриВходе(Истина); @@ -185,86 +220,24 @@ МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - -КонецПроцедуры - -&НаСервере -Процедура ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект = Неопределено) - Если ТекущийОбъект = Неопределено Тогда - ТекущийОбъект = Объект; + // СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]); + + Если ТипЗнч(УровеньДоступа) = Тип("Структура") И ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля( + ЭтотОбъект, + ПользовательИБАдресЭлектроннойПочты, + ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект.ОбъектАвторизации), Истина); + КонецЕсли; + + КонецЕсли; КонецЕсли; - - ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", - ЗапретРедактированияРолей - Или ДействияВФорме.Роли <> "Редактирование" - Или Не УровеньДоступа.НастройкиДляВхода - Или Не ТекущийОбъект.УстановитьРолиНепосредственно); - -КонецПроцедуры - -&НаСервере -Процедура НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) - - Если НачальноеОписаниеПользователяИБ = Неопределено Тогда - Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере. - КонецЕсли; - - Если Не ПриСозданииНаСервере Тогда - ПрочитатьПользователяИБ(); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); - УстановитьПривилегированныйРежим(Ложь); - - УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); - - ОпределитьДействияВФорме(); - - ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи); - - ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект); - - // Установка постоянной доступности свойств. - Элементы.СвойстваПользователяИБ.Видимость = - ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); - - Элементы.ОтображениеРолей.Видимость = - ЗначениеЗаполнено(ДействияВФорме.Роли); - - Элементы.УстановитьРолиНепосредственно.Видимость = - ЗначениеЗаполнено(ДействияВФорме.Роли) И НЕ ПользователиСлужебный.ЗапретРедактированияРолей(); - - ОбновитьОтображаемыйТипПользователя(); - - ТолькоПросмотр = ТолькоПросмотр - ИЛИ ДействияВФорме.Роли <> "Редактирование" - И ДействияВФорме.СвойстваЭлемента <> "Редактирование" - И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование"; - - - ДоступностьКнопки = Не ТолькоПросмотр И ПравоДоступа("Редактирование", - Метаданные.Справочники.ВнешниеПользователи); - - Если Элементы.ФормаЗаписатьИЗакрыть.Доступность <> ДоступностьКнопки Тогда - Элементы.ФормаЗаписатьИЗакрыть.Доступность = ДоступностьКнопки; - КонецЕсли; - - Если Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность <> ДоступностьКнопки Тогда - Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность = ДоступностьКнопки; - КонецЕсли; - - Если Элементы.СменитьПароль.Доступность <> ДоступностьКнопки Тогда - Элементы.СменитьПароль.Доступность = ДоступностьКнопки; - КонецЕсли; - - Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = - УровеньДоступа.ИзменениеРазрешенияНаВход - И ТекущийОбъект.Подготовлен - И Не ПриЧтенииВходВПрограммуРазрешен; - - УстановитьДоступностьСвойств(ЭтотОбъект); + // Конец СтандартныеПодсистемы.КонтактнаяИнформация КонецПроцедуры @@ -310,6 +283,26 @@ КонецЕсли; КонецЕсли; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) + И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда + + Если ПарольДляПодтвержденияИзмененияПочты = Неопределено Тогда + + Отказ = Истина; + + ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи); + Оповещение = Новый ОписаниеОповещения("ПослеЗапросаПароляДляИзмененияПочты", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("Справочник.Пользователи.Форма.ВводПароля",, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + + Возврат; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + КонецПроцедуры &НаСервере @@ -327,6 +320,52 @@ Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда + Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + + Если ПользовательИБЗапрещеноИзменятьПароль Тогда + ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + Если ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект) Тогда + + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) + И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда + + Если ЗначениеЗаполнено(ТекущийОбъект.Ссылка) Тогда + Подготовлен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Ссылка, "Подготовлен"); + Иначе + Подготовлен = УровеньДоступа.УправлениеСписком; + КонецЕсли; + + ИзменятьПочтуБезПодтвержденияПаролем = Пользователи.ЭтоПолноправныйПользователь() Или Подготовлен; + + Если Не ИзменятьПочтуБезПодтвержденияПаролем Тогда + + ПарольСовпадаетССохраненным = Ложь; + + Если ТипЗнч(ПарольДляПодтвержденияИзмененияПочты) = Тип("Строка") Тогда + УстановитьПривилегированныйРежим(Истина); + ПарольСовпадаетССохраненным = ПользователиСлужебный.СтарыйПарольСовпадаетССохраненным( + ПарольДляПодтвержденияИзмененияПочты, Объект.ИдентификаторПользователяИБ); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + // проверка пароля + Если Не ПарольСовпадаетССохраненным Тогда + ПарольДляПодтвержденияИзмененияПочты = Неопределено; + ВызватьИсключение НСтр("ru = 'Пароль указан неверно'"); + КонецЕсли; + КонецЕсли; + + ПользовательИБАдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]; + + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + ОписаниеПользователяИБ = ОписаниеПользователяИБ(); Если ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ) Тогда @@ -350,11 +389,33 @@ МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); КонецЕсли; + // СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульУправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]); + КонецЕсли; + // Конец СтандартныеПодсистемы.КонтактнаяИнформация + КонецПроцедуры &НаСервере Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + // СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") + И Пользователи.ЭтоПолноправныйПользователь() Тогда + + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + + ОбъектАвторизацииОбъект = РеквизитФормыВЗначение(ИмяРеквизитаОбъектАвторизации); + Если Не ОбъектАвторизацииОбъект.Ссылка.Пустая() Тогда + ОбъектАвторизацииОбъект.Записать(); + ЗначениеВРеквизитФормы(ОбъектАвторизацииОбъект, ИмяРеквизитаОбъектАвторизации); + КонецЕсли; + КонецЕсли; + // Конец СтандартныеПодсистемы.КонтактнаяИнформация + УстановитьПривилегированныйРежим(Истина); ПользователиСлужебный.ЗаписатьСведенияОПользователе(ЭтотОбъект, ТекущийОбъект); @@ -490,6 +551,17 @@ МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); КонецЕсли; + // СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + ОбъектАвторизацииОбъект = РеквизитФормыВЗначение(ИмяРеквизитаОбъектАвторизации); + МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, ОбъектАвторизацииОбъект, Отказ); + КонецЕсли; + КонецЕсли; + // Конец СтандартныеПодсистемы.КонтактнаяИнформация + КонецПроцедуры &НаСервере @@ -507,6 +579,7 @@ Процедура ОбъектАвторизацииПриИзменении(Элемент) ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтотОбъект, Объект); + ИзменитьРеквизитОбъектАвторизации(); КонецПроцедуры @@ -614,6 +687,7 @@ Если ПользовательИБЗапрещеноИзменятьПароль Тогда ПотребоватьСменуПароляПриВходе = Ложь; + ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; КонецЕсли; УстановитьДоступностьСвойств(ЭтотОбъект); @@ -670,6 +744,93 @@ ОткрытьФорму("ОбщаяФорма.НастройкиВходаПользователей", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры +// СтандартныеПодсистемы.КонтактнаяИнформация + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьИзменение(ЭтотОбъект, Элемент); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент, , СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияПриНажатии(Элемент, СтандартнаяОбработка) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыбор(ЭтотОбъект, Элемент, , СтандартнаяОбработка); +КонецПроцедуры + +// Параметры: +// Элемент - ПолеФормы +// СтандартнаяОбработка - Булево +// +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьОчистку(ЭтотОбъект, Элемент.Имя); +КонецПроцедуры + +// Параметры: +// Команда - КомандаФормы +// +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда.Имя); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.АвтоПодборАдреса(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка); + +КонецПроцедуры + +// Параметры: +// Элемент - ПолеФормы +// ВыбранноеЗначение - Произвольный +// СтандартнаяОбработка -Булево +// +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.ОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, Элемент.Имя, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_КонтактнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка) + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + МодульУправлениеКонтактнойИнформациейКлиент.НачатьОбработкуНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьОбновлениеКонтактнойИнформации(Результат, ДополнительныеПараметры) Экспорт + ОбновитьКонтактнуюИнформацию(Результат); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьКонтактнуюИнформацию(Результат) + МодульУправлениеКонтактнойИнформацией = + ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульУправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект, Результат); +КонецПроцедуры + +// Конец СтандартныеПодсистемы.КонтактнаяИнформация + #КонецОбласти #Область ОбработчикиСобытийЭлементовТаблицыФормыРоли @@ -761,6 +922,200 @@ #Область СлужебныеПроцедурыИФункции +&НаСервере +Процедура СоздатьРеквизитОбъектАвторизации() + + ЗначениеОбъектаАвторизации = ОбъектАвторизации("ОбъектАвторизации"); + + Если ЗначениеОбъектаАвторизации = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущийТипОбъектАвторизации = ТипЗнч(ЗначениеОбъектаАвторизации); + + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТекущийТипОбъектАвторизации); + + ОписаниеТипаНаФорме = Неопределено; + РеквизитыФормы = ПолучитьРеквизиты(); + Для каждого РеквизитФормы Из РеквизитыФормы Цикл + Если РеквизитФормы.Имя = ИмяРеквизитаОбъектАвторизации Тогда + ОписаниеТипаНаФорме = РеквизитФормы.ТипЗначения.Типы()[0]; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ТекущийТипОбъектАвторизации <> ОписаниеТипаНаФорме Тогда + + ДобавляемыеРеквизиты = Новый Массив; + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТекущийТипОбъектАвторизации); + + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизитаОбъектАвторизации, ОписаниеТипа)); + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + КонецЕсли; + + ЗначениеВРеквизитФормы(ЗначениеОбъектаАвторизации, ИмяРеквизитаОбъектАвторизации); + +КонецПроцедуры + +&НаСервере +Функция ОбъектАвторизации(ИмяРеквизитаОбъектАвторизации) + + Если ТипЗнч(Объект[ИмяРеквизитаОбъектАвторизации])= Тип("Строка") + Или Не ЗначениеЗаполнено(Объект[ИмяРеквизитаОбъектАвторизации]) Тогда + Возврат Неопределено; + КонецЕсли; + + ЗначениеОбъектаАвторизации = Объект[ИмяРеквизитаОбъектАвторизации].ПолучитьОбъект(); + + Возврат ЗначениеОбъектаАвторизации; + +КонецФункции + +&НаСервереБезКонтекста +Функция ИмяРеквизитаОбъектАвторизации(ТипОбъектАвторизации) + Префикс = Метаданные.НайтиПоТипу(ТипОбъектАвторизации).Имя; + Возврат "ОбъектАвторизацииВнешнегоПользователя" + Префикс; +КонецФункции + +&НаСервере +Процедура ИзменитьРеквизитОбъектАвторизации() + + // СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + СоздатьРеквизитОбъектАвторизации(); + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + Если Не ЗначениеЗаполнено(Объект.ОбъектАвторизации) + Или Не МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда + Возврат; + КонецЕсли; + + ИмяРеквизитаОбъектАвторизации = ИмяРеквизитаОбъектАвторизации(ТипЗнч(Объект.ОбъектАвторизации)); + + Если Элементы.ГруппаКонтактнаяИнформация.ПодчиненныеЭлементы.Количество() = 0 Тогда + + Если МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(Объект.ОбъектАвторизации) Тогда + МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]); + КонецЕсли; + + Иначе + + МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ЭтотОбъект[ИмяРеквизитаОбъектАвторизации]); + + КонецЕсли; + + ПарольДляПодтвержденияИзмененияПочты = Неопределено; + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + + Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда + ПарольДляПодтвержденияИзмененияПочты = ""; + КонецЕсли; + + ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля( + ЭтотОбъект, + ПользовательИБАдресЭлектроннойПочты, + ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект), + Истина); + + Элементы.ГруппаКонтактнаяИнформация.Доступность = Истина; + + Иначе + + Элементы.ГруппаКонтактнаяИнформация.Доступность = Ложь; + + КонецЕсли; + + + КонецЕсли; + // Конец СтандартныеПодсистемы.КонтактнаяИнформация + +КонецПроцедуры + +&НаСервере +Процедура ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект = Неопределено) + + Если ТекущийОбъект = Неопределено Тогда + ТекущийОбъект = Объект; + КонецЕсли; + + ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", + ЗапретРедактированияРолей + Или ДействияВФорме.Роли <> "Редактирование" + Или Не УровеньДоступа.НастройкиДляВхода + Или Не ТекущийОбъект.УстановитьРолиНепосредственно); + +КонецПроцедуры + +&НаСервере +Процедура НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере = Ложь, ПараметрыЗаписи = Неопределено) + + СоздатьРеквизитОбъектАвторизации(); + + Если НачальноеОписаниеПользователяИБ = Неопределено Тогда + Возврат; // Вызов ПриЧтенииНаСервере до вызова ПриСозданииНаСервере. + КонецЕсли; + + Если Не ПриСозданииНаСервере Тогда + ПрочитатьПользователяИБ(); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + ПользователиСлужебный.ПрочитатьСведенияОПользователе(ЭтотОбъект); + УстановитьПривилегированныйРежим(Ложь); + + УровеньДоступа = ПользователиСлужебный.УровеньДоступаКСвойствамПользователя(ТекущийОбъект); + + ОпределитьДействияВФорме(); + + ОпределитьНесоответствияПользователяСПользователемИБ(ПараметрыЗаписи); + + ОбработатьИнтерфейсРолейУстановитьТолькоПросмотрРолей(ТекущийОбъект); + + // Установка постоянной доступности свойств. + Элементы.СвойстваПользователяИБ.Видимость = + ЗначениеЗаполнено(ДействияВФорме.СвойстваПользователяИБ); + + Элементы.ОтображениеРолей.Видимость = + ЗначениеЗаполнено(ДействияВФорме.Роли); + + Элементы.УстановитьРолиНепосредственно.Видимость = + ЗначениеЗаполнено(ДействияВФорме.Роли) И НЕ ПользователиСлужебный.ЗапретРедактированияРолей(); + + ОбновитьОтображаемыйТипПользователя(); + + ТолькоПросмотр = ТолькоПросмотр + ИЛИ ДействияВФорме.Роли <> "Редактирование" + И ДействияВФорме.СвойстваЭлемента <> "Редактирование" + И ДействияВФорме.СвойстваПользователяИБ <> "Редактирование"; + + + ДоступностьКнопки = Не ТолькоПросмотр И ПравоДоступа("Редактирование", + Метаданные.Справочники.ВнешниеПользователи); + + Если Элементы.ФормаЗаписатьИЗакрыть.Доступность <> ДоступностьКнопки Тогда + Элементы.ФормаЗаписатьИЗакрыть.Доступность = ДоступностьКнопки; + КонецЕсли; + + Если Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность <> ДоступностьКнопки Тогда + Элементы.ИзменитьОграничениеНаВходВПрограмму.Доступность = ДоступностьКнопки; + КонецЕсли; + + Если Элементы.СменитьПароль.Доступность <> ДоступностьКнопки Тогда + Элементы.СменитьПароль.Доступность = ДоступностьКнопки; + КонецЕсли; + + Элементы.РекомендуетсяПроверитьНастройкиДляВхода.Видимость = + УровеньДоступа.ИзменениеРазрешенияНаВход + И ТекущийОбъект.Подготовлен + И Не ПриЧтенииВходВПрограммуРазрешен; + + УстановитьДоступностьСвойств(ЭтотОбъект); + +КонецПроцедуры + &НаКлиентеНаСервереБезКонтекста Процедура ОбновитьИмяДляВхода(Форма, ПриИзмененииНаименования = Ложь) @@ -1072,6 +1427,17 @@ КонецПроцедуры +// Продолжение обработчика события ПередЗаписью. +&НаКлиенте +Процедура ПослеЗапросаПароляДляИзмененияПочты(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПарольДляПодтвержденияИзмененияПочты = Результат; + Записать(ДополнительныеПараметры.ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработка пользователя ИБ @@ -1192,7 +1558,7 @@ |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", - |Роли")); + |Роли") + ПользователиСлужебный.ПоляВосстановленияПаролей()); КонецЕсли; Если ПрочитанныеСвойства = Неопределено Тогда @@ -1393,8 +1759,11 @@ Элементы.ПользовательИБАутентификацияOpenID.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; Элементы.УстановитьРолиНепосредственно.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; - Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Доступность = Не Форма.ПользовательИБЗапрещеноИзменятьПароль; Элементы.СменитьПароль.Доступность = ( УровеньДоступа.НастройкиДляВхода @@ -1480,4 +1849,4 @@ КонецПроцедуры -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl index 684fdb9e0..6d1d36ca5 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -37,7 +37,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.ТекстДляВнешнихПользователей = @@ -104,4 +106,66 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + СписокВнешнихПользователей = ПользователиСлужебный.ВнешниеПользователиДляВключенияВосстановленияПароля(); + + Если СписокВнешнихПользователей.Количество() > 0 Тогда + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, СписокВнешнихПользователей); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Параметры.ОбработкаЗавершена = Истина; + Возврат; + КонецЕсли; + + ВнешнийПользовательСсылка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.ВнешниеПользователи"); + + ПроблемныхОбъектов = 0; + ОбъектовОбработано = 0; + + Пока ВнешнийПользовательСсылка.Следующий() Цикл + + ОбъектАвторизации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВнешнийПользовательСсылка.Ссылка, "ОбъектАвторизации"); + Результат = ПользователиСлужебный.ОбновитьПочтуДляВосстановленияПароля(ВнешнийПользовательСсылка.Ссылка, ОбъектАвторизации); + + Если Результат = "Ошибка" Тогда + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + Иначе + ОбъектовОбработано = ОбъектовОбработано + 1; + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ВнешнийПользовательСсылка.Ссылка); + КонецЕсли; + + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.ВнешниеПользователи"); + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре ОбработатьДанныеДляПереходаНаНовуюВерсию не удалось обработать некоторых внешних пользователей (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.ВнешниеПользователи,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию внешних пользователей: %1'"), + ОбъектовОбработано)); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + + #КонецЕсли diff --git a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl index cf29d1f39..3be988703 100644 --- a/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВопросыШаблонаАнкеты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl index 7e7761afd..994b663cc 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.ТекстДляВнешнихПользователей = @@ -50,4 +52,43 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "ВсеВнешниеПользователи"; + Элемент.Наименование = НСтр("ru = 'Все внешние пользователи'", ОбщегоНазначения.КодОсновногоЯзыка()); + + ПустыеСсылки = ПользователиСлужебныйПовтИсп.ПустыеСсылкиТиповОбъектовАвторизации(); + Для Каждого ПустаяСсылка Из ПустыеСсылки Цикл + ТаблицаНазначение = ТабличныеЧасти.Назначение; // ТаблицаЗначений + НоваяСтрока = ТаблицаНазначение.Добавить(); + НоваяСтрока.ТипПользователей = ПустаяСсылка; + КонецЦикла; + Элемент.Назначение = ТабличныеЧасти.Назначение; + +КонецПроцедуры + +#КонецОбласти + + #КонецЕсли diff --git a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl index 7b04475eb..f81aa3eac 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -37,7 +37,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -53,7 +55,30 @@ // ТехнологияСервиса.ВыгрузкаЗагрузкаДанных -// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +// Подключается в ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +// +// Параметры: +// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера +// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы +// Сериализатор - СериализаторXDTO +// Объект - КонстантаМенеджерЗначения +// - СправочникОбъект +// - ДокументОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланСчетовОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланВидовРасчетаОбъект +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей +// - ПоследовательностьНаборЗаписей +// - ПерерасчетНаборЗаписей +// Артефакты - Массив из ОбъектXDTO +// Отказ - Булево +// Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт УправлениеДоступомСлужебный.ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ); @@ -818,6 +843,37 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Начальное заполнение + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "Администраторы"; + Элемент.Наименование = НСтр("ru = 'Администраторы'", ОбщегоНазначения.КодОсновногоЯзыка()); + Элемент.Профиль = Справочники.ПрофилиГруппДоступа.Администратор; + +КонецПроцедуры + + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl index 363a488fa..944d95552 100644 --- a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ГруппыПользователей/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыПользователей/ManagerModule.bsl index e69de29bb..95407273d 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/ManagerModule.bsl @@ -0,0 +1,42 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "ВсеПользователи"; + Элемент.Наименование = НСтр("ru = 'Все пользователи'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецПроцедуры + +#КонецОбласти + + +#КонецЕсли diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl index 5b7ec54fb..1461780ad 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl @@ -904,8 +904,8 @@ КонецПроцедуры // Параметры: -// Ответ - КодВозвратаДиалога -// ДополнительныеПараметры - Структура +// Ответ - КодВозвратаДиалога +// ДополнительныеПараметры - Структура // &НаКлиенте Процедура ВариантыДополнительногоОтчетаПередУдалениемЗавершение(Ответ, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl index d7d199fe3..83badec4b 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -36,7 +36,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl index a7705d0b2..5d753878d 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/Заметки/ManagerModule.bsl b/SSL/src/Catalogs/Заметки/ManagerModule.bsl index 4b6443cd6..b162462ed 100644 --- a/SSL/src/Catalogs/Заметки/ManagerModule.bsl +++ b/SSL/src/Catalogs/Заметки/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Module.bsl index f8e4c6df8..a9a44b7d0 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Module.bsl @@ -23,13 +23,21 @@ УстановитьЗаголовок(); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -43,7 +51,12 @@ // Конец СтандартныеПодсистемы.УправлениеДоступом УстановитьЗаголовок(); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -55,7 +68,11 @@ КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -64,7 +81,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl index 2ebc4596d..f185db816 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl @@ -38,7 +38,10 @@ УстановитьЗаголовок(); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; КонецПроцедуры @@ -60,7 +63,12 @@ &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -74,7 +82,11 @@ // Конец СтандартныеПодсистемы.УправлениеДоступом УстановитьЗаголовок(); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -88,6 +100,7 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) + // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); @@ -95,7 +108,11 @@ КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -104,7 +121,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl index 9369a691d..59893edd0 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -56,7 +58,17 @@ #Область ОбработчикиСобытий Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ObjectModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ObjectModule.bsl index ae1aa847b..bc0439833 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ObjectModule.bsl @@ -42,7 +42,12 @@ #Область СлужебныйПрограммныйИнтерфейс Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl index c4b718e43..90928f100 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl @@ -38,7 +38,10 @@ УстановитьЗаголовок(); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; КонецПроцедуры @@ -60,7 +63,12 @@ &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -74,7 +82,11 @@ // Конец СтандартныеПодсистемы.УправлениеДоступом УстановитьЗаголовок(); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -88,6 +100,7 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) + // СтандартныеПодсистемы.УправлениеДоступом Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); @@ -95,7 +108,11 @@ КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -104,7 +121,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl index 012483383..4c811dfd0 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -56,7 +58,17 @@ #Область ОбработчикиСобытий Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ObjectModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ObjectModule.bsl index ae1aa847b..bc0439833 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ObjectModule.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ObjectModule.bsl @@ -42,7 +42,12 @@ #Область СлужебныйПрограммныйИнтерфейс Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl index f2aa4a103..d21b871fc 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -35,7 +35,7 @@ // Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. // // Возвращаемое значение: -// Массив Из Строка - массив имен реквизитов, образующих естественный ключ. +// Массив из Строка - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl index 3ae5bb329..1eadd4cd0 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовРасширений/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -33,7 +33,7 @@ // Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. // // Возвращаемое значение: -// Массив Из Строка - массив имен реквизитов, образующих естественный ключ. +// Массив из Строка - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт diff --git a/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl b/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl index b2d9209ea..7a58c3706 100644 --- a/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl +++ b/SSL/src/Catalogs/КлассификаторБанков/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl index 2a8b91a62..20e53ae82 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl @@ -134,8 +134,6 @@ &НаСервереБезКонтекста Процедура НаборыСвойствПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) - ЭтоОсновнойЯзык = (ТекущийЯзык() = Метаданные.ОсновнойЯзык); - Для Каждого СтрокаДинамическогоСписка Из Строки Цикл Данные = СтрокаДинамическогоСписка.Значение.Данные; Если Данные.ЭтоГруппа Тогда diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl index 1b5f0d2af..dc472f217 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -53,7 +53,17 @@ КонецЕсли; Если ЗначениеЗаполнено(Данные.Родитель) Тогда - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли Возврат; КонецЕсли; @@ -300,7 +310,7 @@ // * Используется - Булево // * Ссылка - СправочникСсылка.НаборыДополнительныхРеквизитовИСведений // * Родитель - СправочникСсылка.НаборыДополнительныхРеквизитовИСведений -// * ДочерниеНаборы - Соответствие: +// * ДочерниеНаборы - Соответствие из КлючИЗначение: // ** Ключ - Строка // ** Значение - см. СвойстваНабора // * Наименование - Строка diff --git a/SSL/src/Catalogs/ОбщиеВнешниеКомпоненты/ManagerModule.bsl b/SSL/src/Catalogs/ОбщиеВнешниеКомпоненты/ManagerModule.bsl index 7fb0b0a9c..3e28cfbad 100644 --- a/SSL/src/Catalogs/ОбщиеВнешниеКомпоненты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ОбщиеВнешниеКомпоненты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -39,7 +39,7 @@ // // Параметры: // Идентификатор - Строка - идентификатор объекта внешнего компонента. -// Версия - Строка - (необязательный) версия компоненты. +// Версия - Строка - версия компоненты. // // Возвращаемое значение: // СправочникСсылка.ВнешниеКомпоненты - ссылка на контейнер внешней компоненты в информационной базе. diff --git a/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl index 1cd9b7f0c..a001f3de4 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -35,7 +35,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -75,27 +77,23 @@ #Область СлужебныйПрограммныйИнтерфейс -// Начальное заполнение - +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Ложь; КонецПроцедуры -// Вызывается при начальном заполнении справочника ПапкиФайлов. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника ПапкиФайлов. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Module.bsl index fb8bffac9..1aa7c2862 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Module.bsl @@ -41,13 +41,10 @@ &НаСервере Процедура ОбработатьПереданныеПараметры() - - УчетнаяЗаписьУказана = Ложь; Если Параметры.Отбор.Свойство("Владелец") И ЗначениеЗаполнено(Параметры.Отбор.Владелец) Тогда - УчетнаяЗаписьУказана = Истина; Владелец = Параметры.Отбор.Владелец; Элементы.Владелец.Видимость = Ложь; diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl index 326ce048a..44c39bb79 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/Пользователи/Forms/ВводПароля/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ВводПароля/Form.form new file mode 100644 index 000000000..7fca219c1 --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ВводПароля/Form.form @@ -0,0 +1,197 @@ +<?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:Decoration"> + <name>ПояснениеПриВходе</name> + <id>10</id> + <title> + <key>ru</key> + <value>Для изменения электронной почты, используемой для восстановления пароля, необходимо ввести пароль</value> + + true + true + + true + + + ПояснениеПриВходеРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + ПояснениеПриВходеКонтекстноеМеню + 11 + true + + Label + true + + Left + 2 + + + + Пароль + 1 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Пароль + + None + + ПарольРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ПарольКонтекстноеМеню + 2 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаОК + 8 + true + true + + true + + true + + ФормаОКРасширеннаяПодсказка + 9 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 6 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + Пароль + 1 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + 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..6678cc38f --- /dev/null +++ b/SSL/src/Catalogs/Пользователи/Forms/ВводПароля/Module.bsl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Заголовок = НСтр("ru='Введите текущий пароль'"); + АвтоЗаголовок = Ложь; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ОК(Команда) + Закрыть(Пароль); +КонецПроцедуры + +#КонецОбласти + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form index 8d5e6077f..5fd60f950 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form @@ -35,6 +35,90 @@ КоманднаяПанель 158 + + ПодменюСоздать + 299 + + СоздатьПользователя + 54 + + <key>ru</key> + <value>Создать</value> + + true + true + + true + + false + + СоздатьПользователяExtendedTooltip + 101 + Label + true + true + + Left + + + Form.Item.ПользователиСписок.StandardCommand.Create + Normal + PictureAndText + true + true + UserCmds + Auto + + + СоздатьГруппуПользователей + 55 + true + true + + true + + false + + СоздатьГруппуПользователейExtendedTooltip + 102 + Label + true + true + + Left + + + Form.Command.СоздатьГруппуПользователей + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Создать</value> + + + ПодменюСоздатьРасширеннаяПодсказка + 300 + Label + true + true + + Left + + + + Compact + + ЗавершитьИЗакрыть 95 @@ -131,60 +215,6 @@ UserCmds Auto - - СоздатьПользователя - 54 - true - true - - true - - false - - СоздатьПользователяExtendedTooltip - 101 - Label - true - true - - Left - - - Form.Item.ПользователиСписок.StandardCommand.Create - Normal - Auto - true - true - UserCmds - Auto - - - СоздатьГруппуПользователей - 55 - true - true - - true - - false - - СоздатьГруппуПользователейExtendedTooltip - 102 - Label - true - true - - Left - - - Form.Command.СоздатьГруппуПользователей - Normal - Auto - true - true - UserCmds - Auto - НазначитьГруппы 72 @@ -264,7 +294,7 @@ true true UserCmds - Auto + OnlyInContextMenu ФормаИзменить @@ -292,33 +322,6 @@ UserCmds Auto - - ФормаУстановитьПароль - 198 - true - true - - true - - - ФормаУстановитьПарольРасширеннаяПодсказка - 199 - Label - true - true - - Left - - - Form.Command.УстановитьПароль - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - ПользователиСтандартныеКоманды 210 @@ -345,17 +348,21 @@ Form - - СведенияОПользователях - 132 + + ПодменюСоздатьНаОсновании + 311 true true true + + <key>ru</key> + <value>Создать на основании</value> + - СведенияОПользователяхРасширеннаяПодсказка - 133 + ПодменюСоздатьНаОснованииРасширеннаяПодсказка + 312 Label true true @@ -363,26 +370,137 @@ Left - Form.Command.СведенияОПользователях - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu + Popup + + + StdPicture.InputOnBasis + + Picture + Normal + - - ПользователиИБ - 6 + + ПодменюОтчеты + 303 + + ПодменюОтчетыВажное + 305 + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты важное</value> + + + ПодменюОтчетыВажноеРасширеннаяПодсказка + 306 + Label + true + true + + Left + + + + + + ПодменюОтчетыПерейти + 307 + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты перейти</value> + + + ru + Подменю отчеты важное + + + ПодменюОтчетыПерейтиРасширеннаяПодсказка + 308 + Label + true + true + + Left + + + + + + ПодменюОтчетыСмТакже + 309 + + СведенияОПользователях + 132 + true + true + + true + + + СведенияОПользователяхРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + Form.Command.СведенияОПользователях + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты см также</value> + + + ru + Подменю отчеты важное + + + ПодменюОтчетыСмТакжеРасширеннаяПодсказка + 310 + Label + true + true + + Left + + + + true true true + + <key>ru</key> + <value>Отчеты</value> + - ПользователиИБExtendedTooltip - 106 + ПодменюОтчетыРасширеннаяПодсказка + 304 Label true true @@ -390,51 +508,136 @@ Left - Catalog.Пользователи.Command.ПользователиИнформационнойБазы - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu + Popup + + + CommonPicture.Отчеты + + PictureAndText + Normal + - - ФормаИзменитьВыделенные - 196 - true - true - - true - - - ФормаИзменитьВыделенныеРасширеннаяПодсказка - 197 - Label - true - true - - Left - - - Form.Command.ИзменитьВыделенные - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий + + ПодменюДополнительно 297 + + ФормаИзменитьВыделенные + 196 + true + true + + true + + + ФормаИзменитьВыделенныеРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + Form.Command.ИзменитьВыделенные + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ПользователиИБ + 6 + true + true + + true + + + ПользователиИБExtendedTooltip + 106 + Label + true + true + + Left + + + Catalog.Пользователи.Command.ПользователиИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ФормаУстановитьПароль + 198 + true + true + + true + + + ФормаУстановитьПарольРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Form.Command.УстановитьПароль + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий + 301 + true + + true + + + ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействийРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + Form.Command.ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true true true + + <key>ru</key> + <value>Дополнительно</value> + - ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействийРасширеннаяПодсказка + ПодменюДополнительноРасширеннаяПодсказка 298 Label true @@ -443,13 +646,11 @@ Left - Form.Command.ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий - Normal - Auto - true - true - UserCmds - Auto + Popup + + Auto + Normal + true true @@ -3263,7 +3464,9 @@ BeforeLoadDataFromSettingsAtServer ПередЗагрузкеДанныхИзНастроекНаСервере + Close Create + Delete DontBlock Use true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form index 80e4f4eb0..4a4e52649 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form @@ -1395,6 +1395,40 @@ true + + ПользовательИБЗапрещеноВосстанавливатьПароль + 366 + true + true + + true + + + ПользовательИБЗапрещеноВосстанавливатьПароль + + Right + + ПользовательИБЗапрещеноВосстанавливатьПарольРасширеннаяПодсказка + 368 + Label + true + true + + Left + + + + ПользовательИБЗапрещеноВосстанавливатьПарольКонтекстноеМеню + 367 + true + + CheckBoxField + Enter + true + Left + true + + ПользовательИБПоказыватьВСпискеВыбора 25 @@ -2668,6 +2702,117 @@ Auto InAdditionalSubmenu + + ПодменюОтчеты + 358 + + ПодменюОтчетыВажное + 360 + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты важное</value> + + + ПодменюОтчетыВажноеРасширеннаяПодсказка + 361 + Label + true + true + + Left + + + + + + ПодменюОтчетыПерейти + 362 + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты перейти</value> + + + ru + Подменю отчеты важное + + + ПодменюОтчетыПерейтиРасширеннаяПодсказка + 363 + Label + true + true + + Left + + + + + + ПодменюОтчетыСмТакже + 364 + true + true + + true + + + <key>ru</key> + <value>Подменю отчеты см также</value> + + + ru + Подменю отчеты важное + + + ПодменюОтчетыСмТакжеРасширеннаяПодсказка + 365 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Отчеты</value> + + + ПодменюОтчетыРасширеннаяПодсказка + 359 + Label + true + true + + Left + + + Popup + + + CommonPicture.Отчеты + + PictureAndText + Normal + + Left @@ -3465,6 +3610,67 @@ true + + ПользовательИБАдресЭлектроннойПочты + 34 + + String + + 256 + + + + true + + + true + + FunctionalOption.ИспользоватьВнешнихПользователей + true + + + ПарольДляПодтвержденияИзмененияПочты + 45 + + + true + + + true + + + + ИмяРеквизитаСПочтойДляВосстановленияПароля + 46 + + String + + + + true + + + true + + + + ПользовательИБЗапрещеноВосстанавливатьПароль + + <key>ru</key> + <value>Пользователю запрещено восстанавливать пароль</value> + + 47 + + Boolean + + + true + + + true + + true + ПоказатьТолькоВыбранныеРоли diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl index b1ab06b30..748846008 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -53,6 +53,7 @@ Элементы.ПользовательИБАутентификацияСтандартная.Видимость = Ложь; Элементы.ПотребоватьСменуПароляПриВходе.Видимость = Ложь; Элементы.ПользовательИБЗапрещеноИзменятьПароль.Видимость = Ложь; + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; Элементы.СвойстваАутентификацииОС.Видимость = Ложь; Элементы.ПользовательИБРежимЗапуска.Видимость = Ложь; КонецЕсли; @@ -107,6 +108,8 @@ ВходВПрограммуРазрешен = Ложь; ВходВПрограммуРазрешенЗначениеПрямогоИзменения = Ложь; КонецЕсли; + + ПользовательИБАдресЭлектроннойПочты = ""; Иначе // Добавление элемента. @@ -138,9 +141,28 @@ НачальноеОписаниеПользователяИБ = НачальноеОписаниеПользователяИБ(); ТребуетсяСинхронизацияССервисом = Объект.Ссылка.Пустая(); + ПарольДляПодтвержденияИзмененияПочты = Неопределено; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); - МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "КонтактнаяИнформация"); + ДополнительныеПараметры = МодульУправлениеКонтактнойИнформацией.ПараметрыКонтактнойИнформации(); + ДополнительныеПараметры.ИмяЭлементаДляРазмещения = "КонтактнаяИнформация"; + + МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, ДополнительныеПараметры); + + Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + + Если Не ПользователиСлужебный.ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Тогда + ПарольДляПодтвержденияИзмененияПочты = ""; + КонецЕсли; + + ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля( + ЭтотОбъект, + ПользовательИБАдресЭлектроннойПочты, + ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект)); + + КонецЕсли; + ПереопределитьРедактированиеКонтактнойИнформацииВСервисе(); КонецЕсли; @@ -193,6 +215,10 @@ АдресФотографии = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ПользовательБезФотографии, УникальныйИдентификатор); КонецЕсли; + Если Не ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Видимость = Ложь; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -246,6 +272,14 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект, "КонтактнаяИнформация"); + + Если ТипЗнч(УровеньДоступа) = Тип("Структура") И ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + ИмяРеквизитаСПочтойДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.ОпределитьЭлементСПочтойДляВосстановленияПароля( + ЭтотОбъект, + ПользовательИБАдресЭлектроннойПочты, + ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, ТекущийОбъект)); + КонецЕсли; + КонецЕсли; НастроитьФорму(ТекущийОбъект); @@ -276,6 +310,26 @@ Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) ОчиститьСообщения(); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) + И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда + + Если ПарольДляПодтвержденияИзмененияПочты = Неопределено Тогда + + Отказ = Истина; + + ДополнительныеПараметры = Новый Структура("ПараметрыЗаписи", ПараметрыЗаписи); + Оповещение = Новый ОписаниеОповещения("ПослеЗапросаПароляДляИзмененияПочты", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("Справочник.Пользователи.Форма.ВводПароля",, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; + + КонецЕсли; + + КонецЕсли; + КонецЕсли; + ЗаголовокВопросов = НСтр("ru = 'Запись пользователя информационной базы'"); // Копирование прав пользователя. @@ -347,6 +401,53 @@ Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда + Если ПользователиСлужебный.ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Тогда + + Если ПользовательИБЗапрещеноИзменятьПароль Тогда + ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + Если ПользователиСлужебный.ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект) Тогда + + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) + И ПользовательИБАдресЭлектроннойПочты <> ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] Тогда + + Если ЗначениеЗаполнено(ТекущийОбъект.Ссылка) Тогда + Подготовлен = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийОбъект.Ссылка, "Подготовлен"); + Иначе + Подготовлен = УровеньДоступа.УправлениеСписком; + КонецЕсли; + + ИзменятьПочтуБезПодтвержденияПаролем = Пользователи.ЭтоПолноправныйПользователь() Или Подготовлен; + + Если Не ИзменятьПочтуБезПодтвержденияПаролем Тогда + + ПарольСовпадаетССохраненным = Ложь; + + Если ТипЗнч(ПарольДляПодтвержденияИзмененияПочты) = Тип("Строка") Тогда + УстановитьПривилегированныйРежим(Истина); + ПарольСовпадаетССохраненным = ПользователиСлужебный.СтарыйПарольСовпадаетССохраненным( + ПарольДляПодтвержденияИзмененияПочты, Объект.ИдентификаторПользователяИБ); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + // проверка пароля + Если Не ПарольСовпадаетССохраненным Тогда + ПарольДляПодтвержденияИзмененияПочты = Неопределено; + ВызватьИсключение НСтр("ru = 'Пароль указан неверно'"); + КонецЕсли; + + КонецЕсли; + + ПользовательИБАдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]; + + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + ОписаниеПользователяИБ = ОписаниеПользователяИБ(); Если ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ) Тогда @@ -470,6 +571,8 @@ Возврат; КонецЕсли; + ПарольДляПодтвержденияИзмененияПочты = Неопределено; + ПослеЗаписиЗавершение(Неопределено, ПараметрыЗаписи); КонецПроцедуры @@ -480,7 +583,14 @@ Если ТребуетсяЗаписьПользователяИБ(ЭтотОбъект) Тогда ОписаниеПользователяИБ = ОписаниеПользователяИБ(); ОписаниеПользователяИБ.Вставить("ИдентификаторПользователяИБ", Объект.ИдентификаторПользователяИБ); + + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() + И ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) Тогда + ОписаниеПользователяИБ.АдресЭлектроннойПочты = ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]; + КонецЕсли; + ПользователиСлужебный.ПроверитьОписаниеПользователяИБ(ОписаниеПользователяИБ, Отказ, Ложь); + КонецЕсли; Если ВходВПрограммуРазрешен @@ -680,7 +790,8 @@ Процедура ПользовательИБЗапрещеноИзменятьПарольПриИзменении(Элемент) Если ПользовательИБЗапрещеноИзменятьПароль Тогда - ПотребоватьСменуПароляПриВходе = Ложь; + ПотребоватьСменуПароляПриВходе = Ложь; + ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; КонецЕсли; УстановитьДоступностьСвойств(ЭтотОбъект); @@ -1274,10 +1385,11 @@ Элементы.ПользовательИБАутентификацияОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; Элементы.ПользовательИБПользовательОС.ТолькоПросмотр = Не УровеньДоступа.НастройкиДляВхода; - Элементы.ПользовательИБПоказыватьВСпискеВыбора.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; - Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; - Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; - Элементы.ПользовательИБРежимЗапуска.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБПоказыватьВСпискеВыбора.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПотребоватьСменуПароляПриВходе.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБЗапрещеноИзменятьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; + Элементы.ПользовательИБРежимЗапуска.ТолькоПросмотр = Не УровеньДоступа.УправлениеСписком; Элементы.Комментарий.ТолькоПросмотр = Не (ДействияВФорме.СвойстваЭлемента = "Редактирование" И УровеньДоступа.УправлениеСписком); @@ -1331,6 +1443,17 @@ КонецПроцедуры +// Продолжение обработчика события ПередЗаписью. +&НаКлиенте +Процедура ПослеЗапросаПароляДляИзмененияПочты(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПарольДляПодтвержденияИзмененияПочты = Результат; + Записать(ДополнительныеПараметры.ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + &НаКлиентеНаСервереБезКонтекста Процедура ОбновитьИмяДляВхода(Форма, ПриИзмененииНаименования = Ложь) @@ -1378,10 +1501,17 @@ И НЕ ПользовательИБАутентификацияСтандартная И НЕ ПользовательИБАутентификацияОС Тогда - ВходВПрограммуРазрешен = Ложь; + ВходВПрограммуРазрешен = Ложь; + ПользовательИБЗапрещеноВосстанавливатьПароль = Истина; ИначеЕсли Не ВходВПрограммуРазрешен Тогда ВходВПрограммуРазрешен = ВходВПрограммуРазрешенЗначениеПрямогоИзменения; + + Если ЗначениеЗаполнено(ИмяРеквизитаСПочтойДляВосстановленияПароля) + И ЗначениеЗаполнено(ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]) Тогда + ПользовательИБЗапрещеноВосстанавливатьПароль = Ложь; + КонецЕсли; + КонецЕсли; УстановитьДоступностьСвойств(ЭтотОбъект); @@ -1564,17 +1694,25 @@ Результат = Новый Структура; Если УровеньДоступа.ИзменениеТекущего Тогда - Результат.Вставить("Пароль", ПользовательИБПароль); - Результат.Вставить("Язык", ПользовательИБЯзык); + Результат.Вставить("Пароль", ПользовательИБПароль); + Результат.Вставить("Язык", ПользовательИБЯзык); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); + КонецЕсли; КонецЕсли; Если УровеньДоступа.УправлениеСписком Тогда - Результат.Вставить("ВходВПрограммуРазрешен", ВходВПрограммуРазрешен); - Результат.Вставить("ПоказыватьВСпискеВыбора", ПользовательИБПоказыватьВСпискеВыбора + Результат.Вставить("ВходВПрограммуРазрешен", ВходВПрограммуРазрешен); + Результат.Вставить("ПоказыватьВСпискеВыбора", ПользовательИБПоказыватьВСпискеВыбора И Не ПолучитьФункциональнуюОпцию("ИспользоватьВнешнихПользователей")); - Результат.Вставить("ЗапрещеноИзменятьПароль", ПользовательИБЗапрещеноИзменятьПароль); - Результат.Вставить("Язык", ПользовательИБЯзык); - Результат.Вставить("РежимЗапуска", ПользовательИБРежимЗапуска); + Результат.Вставить("ЗапрещеноИзменятьПароль", ПользовательИБЗапрещеноИзменятьПароль); + + Результат.Вставить("Язык", ПользовательИБЯзык); + Результат.Вставить("РежимЗапуска", ПользовательИБРежимЗапуска); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Результат.Вставить("ЗапрещеноВосстанавливатьПароль", ПользовательИБЗапрещеноВосстанавливатьПароль); + Результат.Вставить("АдресЭлектроннойПочты", ПользовательИБАдресЭлектроннойПочты); + КонецЕсли; Если ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда Результат.Вставить("ПолноеИмя", ПользовательИБПолноеИмя); @@ -1961,7 +2099,7 @@ |ОсновнойИнтерфейс, |РежимЗапуска" + ?(Не Элементы.ПользовательИБЯзык.Видимость, "", ", |Язык") + ?(ПользователиСлужебный.ЗапретРедактированияРолей(), "", ", - |Роли")); + |Роли") + ПользователиСлужебный.ПоляВосстановленияПаролей()); КонецЕсли; Если ПрочитанныеСвойства = Неопределено Тогда @@ -2028,6 +2166,28 @@ УточнениеСвойств.Вставить(0, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Полное имя ""%1""'"), ПользовательИБПолноеИмя)); КонецЕсли; + + // Проверка на соответствие почты + Если УровеньДоступа.ИзменениеТекущего Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + ВидEmailПользователя = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + + СтрокаОписания = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы( + ЭтотОбъект, ВидEmailПользователя, ПользовательИБАдресЭлектроннойПочты); + + Если СтрокаОписания = Неопределено Тогда + ПоказатьКомандыУстраненияРазличий = + ПоказатьКомандыУстраненияРазличий + Или ДействияВФорме.СвойстваЭлемента = "Редактирование"; + + УточнениеСвойств.Вставить(0, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Почта для восстановления пароля ""%1""'"), + ПользовательИБАдресЭлектроннойПочты)); + КонецЕсли; + КонецЕсли; + КонецЕсли; Если УточнениеСвойств.Количество() > 0 Тогда СтрокаУточненияСвойств = ""; @@ -2111,6 +2271,8 @@ И ДействияВФорме.СвойстваЭлемента = "Редактирование" Тогда Объект.Наименование = ПользовательИБПолноеИмя; + ЗаполнитьПолеПочтыДляВосстановленияПароляИзИБ(); + КонецЕсли; ОпределитьНесоответствияПользователяСПользователемИБ(); @@ -2121,6 +2283,33 @@ КонецПроцедуры +&НаСервере +Процедура ЗаполнитьПолеПочтыДляВосстановленияПароляИзИБ() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + Если ПустаяСтрока(ИмяРеквизитаСПочтойДляВосстановленияПароля) + Или ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] <> ПользовательИБАдресЭлектроннойПочты Тогда + + ВидEmailПользователя = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + ОписаниеПочты = МодульУправлениеКонтактнойИнформацией.СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы(ЭтотОбъект, ВидEmailПользователя, ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля]); + + Если ОписаниеПочты <> Неопределено Тогда + ОписаниеПочты.Представление = ПользовательИБАдресЭлектроннойПочты; + ОписаниеПочты.Значение = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению( + ПользовательИБАдресЭлектроннойПочты, ВидEmailПользователя); + + ЭтотОбъект[ИмяРеквизитаСПочтойДляВосстановленияПароля] = ПользовательИБАдресЭлектроннойПочты; + КонецЕсли; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Начальное заполнение, проверка заполнения, доступность свойств. @@ -2155,6 +2344,8 @@ Элементы.ПараметрыАутентификации1СПредприятия.Доступность = Форма.ПользовательИБАутентификацияСтандартная; Элементы.ПользовательИБПользовательОС.Доступность = Форма.ПользовательИБАутентификацияОС; + Элементы.ПользовательИБЗапрещеноВосстанавливатьПароль.Доступность = Не Форма.ПользовательИБЗапрещеноИзменятьПароль; + // Уточнение настроек в модели сервиса. Если ДействияСПользователемСервиса <> Неопределено Тогда @@ -2202,7 +2393,7 @@ Функция ОпределитьДоступностьЭлементовКонтактнойИнформации() Результат = Новый Соответствие; - Для Каждого СтрокаКонтактнойИнформации Из ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл + Для Каждого СтрокаКонтактнойИнформации Из ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл // СтрокаТаблицыЗначений: см. УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация ДействияВидаКонтактнойИнформации = ДействияСПользователемСервиса.КонтактнаяИнформация.Получить(СтрокаКонтактнойИнформации.Вид); Если ДействияВидаКонтактнойИнформации = Неопределено Тогда // Возможность редактирования этого вида КИ не регулируется менеджером сервиса. @@ -2247,21 +2438,27 @@ Если Форма.ПользовательИБСуществует ИЛИ Форма.ВходВПрограммуРазрешен - ИЛИ Форма.ПользовательИБИмя <> ТекущееИмя - ИЛИ Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная - ИЛИ Форма.ПользовательИБПоказыватьВСпискеВыбора <> Шаблон.ПоказыватьВСпискеВыбора - ИЛИ Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль - ИЛИ Форма.ПользовательИБПароль <> Неопределено - ИЛИ Форма.ПользовательИБАутентификацияОС <> Шаблон.АутентификацияОС - ИЛИ Форма.ПользовательИБПользовательОС <> "" - ИЛИ Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID - ИЛИ Форма.ПользовательИБРежимЗапуска <> Шаблон.РежимЗапуска - ИЛИ Форма.ПользовательИБЯзык <> Шаблон.Язык - ИЛИ Форма.ПользовательИБРоли.Количество() <> 0 Тогда + ИЛИ Форма.ПользовательИБИмя <> ТекущееИмя + ИЛИ Форма.ПользовательИБАутентификацияСтандартная <> Шаблон.АутентификацияСтандартная + ИЛИ Форма.ПользовательИБПоказыватьВСпискеВыбора <> Шаблон.ПоказыватьВСпискеВыбора + ИЛИ Форма.ПользовательИБЗапрещеноИзменятьПароль <> Шаблон.ЗапрещеноИзменятьПароль + ИЛИ Форма.ПользовательИБПароль <> Неопределено + ИЛИ Форма.ПользовательИБАутентификацияОС <> Шаблон.АутентификацияОС + ИЛИ Форма.ПользовательИБПользовательОС <> "" + ИЛИ Форма.ПользовательИБАутентификацияOpenID <> Шаблон.АутентификацияOpenID + ИЛИ Форма.ПользовательИБРежимЗапуска <> Шаблон.РежимЗапуска + ИЛИ Форма.ПользовательИБЯзык <> Шаблон.Язык + ИЛИ Форма.ПользовательИБРоли.Количество() <> 0 Тогда Возврат Истина; КонецЕсли; + // Поддерживается в новых версиях платформы + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() + И Форма.ПользовательИБЗапрещеноВосстанавливатьПароль <> Шаблон.ЗапрещеноВосстанавливатьПароль Тогда + Возврат Истина; + КонецЕсли; + Возврат Ложь; КонецФункции @@ -2321,4 +2518,4 @@ // Конец СтандартныеПодсистемы.ПодключаемыеКоманды -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl index c1f8cdfa9..299b55971 100644 --- a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -36,7 +36,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -118,4 +120,76 @@ #КонецОбласти +#Область СлужебныеПроцедурыИФункции + +Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + СписокПользователей = ПользователиСлужебный.ПользователиДляВключенияВосстановленияПароля(); + + Если СписокПользователей.Количество() > 0 Тогда + ВключитьСтандартныеНастройкиВосстановленияПароля(); + ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, СписокПользователей); + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Параметры.ОбработкаЗавершена = Истина; + Возврат; + КонецЕсли; + + ПользовательСсылка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.Пользователи"); + + ПроблемныхОбъектов = 0; + ОбъектовОбработано = 0; + + Пока ПользовательСсылка.Следующий() Цикл + Результат = ПользователиСлужебный.ОбновитьПочтуДляВосстановленияПароля(ПользовательСсылка.Ссылка); + + Если Результат = "Ошибка" Тогда + ПроблемныхОбъектов = ПроблемныхОбъектов + 1; + Иначе + ОбъектовОбработано = ОбъектовОбработано + 1; + ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(ПользовательСсылка.Ссылка); + КонецЕсли; + + КонецЦикла; + + Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, "Справочник.Пользователи"); + + Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Процедуре ОбработатьДанныеДляПереходаНаНовуюВерсию не удалось обработать некоторых пользователей (пропущены): %1'"), + ПроблемныхОбъектов); + ВызватьИсключение ТекстСообщения; + Иначе + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация, + Метаданные.Справочники.Пользователи,, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию обработала очередную порцию пользователей: %1'"), + ОбъектовОбработано)); + КонецЕсли; + +КонецПроцедуры + +Процедура ВключитьСтандартныеНастройкиВосстановленияПароля() + + Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); + + Если Настройки = Неопределено Тогда + Возврат; + КонецЕсли; + + Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис"); + ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(Настройки); + +КонецПроцедуры + +#КонецОбласти + #КонецЕсли diff --git a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl index 8be786e04..0b119891e 100644 --- a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl @@ -102,7 +102,7 @@ Блокировка.Добавить("Справочник.ГруппыПользователей"); Блокировка.Заблокировать(); - ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоПользователя.ПолучитьОбъект(); + ОбъектГруппы = ДополнительныеСвойства.ГруппаНовогоПользователя.ПолучитьОбъект(); // СправочникОбъект.ГруппыПользователей ОбъектГруппы.Состав.Добавить().Пользователь = Ссылка; ОбъектГруппы.Записать(); КонецЕсли; diff --git a/SSL/src/Catalogs/Пользователи/Пользователи.mdo b/SSL/src/Catalogs/Пользователи/Пользователи.mdo index e975e3b28..3f03cab78 100644 --- a/SSL/src/Catalogs/Пользователи/Пользователи.mdo +++ b/SSL/src/Catalogs/Пользователи/Пользователи.mdo @@ -820,6 +820,15 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> + <forms uuid="cfc0adf6-87b4-4c8a-91e2-46c2616b319b"> + <name>ВводПароля</name> + <synonym> + <key>ru</key> + <value>Ввод пароля</value> + </synonym> + <usePurposes>PersonalComputer</usePurposes> + <usePurposes>MobileDevice</usePurposes> + </forms> <commands uuid="bed3f0b2-40c6-4323-9bca-cb8864e38ec0"> <name>ПользователиИнформационнойБазы</name> <synonym> diff --git a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl index 79c06de94..fa1f51769 100644 --- a/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПользовательскиеНастройкиОтчетов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -32,7 +32,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl index 893de0a52..7a2c8d289 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl @@ -185,7 +185,7 @@ КонецПроцедуры &НаСервере -Функция ЗагрузитьРезультат(АдресРезультата) +Процедура ЗагрузитьРезультат(АдресРезультата) Результат = ПолучитьИзВременногоХранилища(АдресРезультата); Если ТипЗнч(Результат) = Тип("Строка") @@ -193,6 +193,6 @@ ТекстСообщенияПользователю = Результат; КонецЕсли; -КонецФункции +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl index d218ebdfe..ff14bd217 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -37,7 +37,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ПравилаПроверкиУчета/ObjectModule.bsl b/SSL/src/Catalogs/ПравилаПроверкиУчета/ObjectModule.bsl index e9de914b7..7f5136b95 100644 --- a/SSL/src/Catalogs/ПравилаПроверкиУчета/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПравилаПроверкиУчета/ObjectModule.bsl @@ -72,6 +72,8 @@ КонецЦикла; + Возврат Ложь; + КонецФункции #КонецОбласти diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl index 0ac162e5a..930021d8c 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl @@ -17,7 +17,7 @@ // Имена реквизитов справочника, значения которых разрешено изменять массово. // // Возвращаемое значение: -// Массив Из Строка - имена реквизитов справочника. +// Массив из Строка - имена реквизитов справочника. // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,7 @@ // Имена реквизитов справочника, в разрезе которых контролируется уникальность элементов. // // Возвращаемое значение: -// Массив Из Строка - имена реквизитов справочника. +// Массив из Строка - имена реквизитов справочника. // Функция ПоляЕстественногоКлюча() Экспорт @@ -59,7 +59,17 @@ Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl index 0ac162e5a..930021d8c 100644 --- a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетовРасширений/ManagerModule.bsl @@ -17,7 +17,7 @@ // Имена реквизитов справочника, значения которых разрешено изменять массово. // // Возвращаемое значение: -// Массив Из Строка - имена реквизитов справочника. +// Массив из Строка - имена реквизитов справочника. // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -34,7 +34,7 @@ // Имена реквизитов справочника, в разрезе которых контролируется уникальность элементов. // // Возвращаемое значение: -// Массив Из Строка - имена реквизитов справочника. +// Массив из Строка - имена реквизитов справочника. // Функция ПоляЕстественногоКлюча() Экспорт @@ -59,7 +59,17 @@ Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl index e97a43458..7d53b268b 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ОшибкаОбращенияКПрограмме/Module.bsl @@ -235,9 +235,9 @@ КонецПроцедуры // Параметры: -// ОписаниеОшибки - ДанныеФормыКоллекция: -// * Ошибки - Массив из Структура -// ОшибкаНаСервере - Булево +// ОписаниеОшибки - ДанныеФормыКоллекция: +// * Ошибки - Массив из Структура +// ОшибкаНаСервере - Булево // &НаСервере Процедура ДобавитьОшибки(ОписаниеОшибок, ОшибкаНаСервере = Ложь) diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form index e1c2bd44a..58277e43a 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/Forms/ФормаЭлемента/Form.form @@ -5,7 +5,7 @@ <id>55</id> <title> <key>ru</key> - <value>Настройка программы электронной подписи и шифрования выполнена в главном узле</value> + <value>Настройка программы электронной подписи и шифрования выполнена в корневом узле</value> true true diff --git a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl index d2e579d06..aab5d8391 100644 --- a/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрограммыЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl index 371d840b7..08e9a8e82 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl @@ -70,11 +70,10 @@ #Область СлужебныйПрограммныйИнтерфейс -// Функция выявляет последний день, за который заполнены данные -// указанного производственного календаря. +// Выявляет последний день, за который заполнены данные указанного производственного календаря. // // Параметры: -// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - календарь. +// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - календарь. // // Возвращаемое значение: // Дата - дата, по которую заполнен производственный календарь, Неопределено, если календарь не заполнен. @@ -103,14 +102,14 @@ КонецФункции -// Функция читает данные производственного календаря из регистра. +// Возвращает сведения о виде дня на каждую дату производственного календаря. // // Параметры: -// ПроизводственныйКалендарь - ссылка на текущий элемент справочника. -// НомерГода - номер года, за который необходимо прочитать производственный календарь. +// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - текущий элемент справочника. +// НомерГода - Число - номер года, за который необходимо прочитать производственный календарь. // -// Возвращаемое значение -// ДанныеПроизводственногоКалендаря - таблица значений, в которой хранятся сведения о виде дня на каждую дату календаря. +// Возвращаемое значение: +// ТаблицаЗначений // Функция ДанныеПроизводственногоКалендаря(ПроизводственныйКалендарь, НомерГода) Экспорт @@ -469,8 +468,8 @@ // Преобразовывает данные производственных календарей, поставляемые в виде макета в конфигурации. // // Параметры: -// КодыКалендарей - необязательный, массив, если не задан, то будут получены все имеющиеся данные из макета. -// ФормироватьПолныйНабор - необязательный, булево, если ложь, то будут сформированы только данные по отклонениям от календаря по умолчанию. +// КодыКалендарей - Массив - если не задан, то будут получены все имеющиеся данные из макета. +// ФормироватьПолныйНабор - Булево - если ложь, то будут сформированы только данные по отклонениям от календаря по умолчанию. // // Возвращаемое значение: // см. ДанныеПроизводственныхКалендарейИзXML. @@ -481,8 +480,8 @@ Возврат НовыеДанныеПроизводственныхКалендарей(); КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - ТекстовыйДокумент = МодульКалендарныеГрафики.ПолучитьМакет("ДанныеПроизводственныхКалендарей"); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + ТекстовыйДокумент = МодульЗаполнениеКалендарныхГрафиков.ПолучитьМакет("ДанныеПроизводственныхКалендарей"); ДанныеXML = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()); @@ -495,18 +494,18 @@ // Преобразовывает данные производственных календарей, представленные в виде XML. // // Параметры: -// ДанныеXML - структура - извлеченная из файла XML методом ОбщегоНазначения.ПрочитатьXMLВТаблицу. -// ТаблицаКалендарей - таблица значений, список производственных календарей, поддерживаемых в конфигурации. -// КодыКалендарей - необязательный, массив, если не задан, то отбор не будет установлен. -// ФормироватьПолныйНабор - необязательный, булево, если ложь, то будут сформированы только данные по отклонениям от календаря по умолчанию. +// ДанныеXML - Структура - извлеченная из файла XML методом ОбщегоНазначения.ПрочитатьXMLВТаблицу. +// ТаблицаКалендарей - ТаблицаЗначений - список производственных календарей, поддерживаемых в конфигурации. +// КодыКалендарей - Массив - если не задан, то отбор не будет установлен. +// ФормироватьПолныйНабор - Булево - если ложь, то будут сформированы только данные по отклонениям от календаря по умолчанию. // // Возвращаемое значение: // ТаблицаЗначений: -// * КодПроизводственногоКалендаря -// * ВидДня -// * Год -// * Дата -// * ДатаПереноса. +// * КодПроизводственногоКалендаря +// * ВидДня +// * Год +// * Дата +// * ДатаПереноса. // Функция ДанныеПроизводственныхКалендарейИзXML(Знач ДанныеXML, ТаблицаКалендарей, КодыКалендарей = Неопределено, ФормироватьПолныйНабор = Истина) Экспорт @@ -601,8 +600,8 @@ Возврат Новый ТаблицаЗначений; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - ТекстовыйДокумент = МодульКалендарныеГрафики.ПолучитьМакет("ПериодыНерабочихДней"); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + ТекстовыйДокумент = МодульЗаполнениеКалендарныхГрафиков.ПолучитьМакет("ПериодыНерабочихДней"); ТаблицаПериодов = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()); ТаблицаКалендарей = ПроизводственныеКалендариИзМакета(); @@ -613,7 +612,7 @@ // Получает таблицу поставляемых в составе программы производственных календарей. // // Возвращаемое значение: -// ТаблицаЗначений +// ТаблицаЗначений // Функция ПроизводственныеКалендариИзМакета() Экспорт @@ -621,8 +620,8 @@ Возврат Новый ТаблицаЗначений; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - ТекстовыйДокумент = МодульКалендарныеГрафики.ПолучитьМакет("ПроизводственныеКалендари"); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + ТекстовыйДокумент = МодульЗаполнениеКалендарныхГрафиков.ПолучитьМакет("ПроизводственныеКалендари"); ТаблицаКалендарей = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ТекстовыйДокумент.ПолучитьТекст()).Данные; Возврат ТаблицаКалендарей; @@ -766,51 +765,59 @@ | И (ИзмененияЗависимыхКалендарей.Год = ИзмененияБазовыхКалендарей.Год) |ГДЕ | ИзмененияЗависимыхКалендарей.Год ЕСТЬ NULL"; - РезультатЗапроса = Запрос.Выполнить(); - Если РезультатЗапроса.Пустой() Тогда - Возврат; - КонецЕсли; + + Блокировка = Новый БлокировкаДанных(); + Блокировка.Добавить(Метаданные.Справочники.ПроизводственныеКалендари.ПолноеИмя()); - КодыЗависимых = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Код"); - ДанныеИзМакета = ДанныеПроизводственныхКалендарейПоУмолчанию(КодыЗависимых); - - ОтборСтрок = Новый Структура( - "КодПроизводственногоКалендаря, - |Год"); - - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - ОтборСтрок.КодПроизводственногоКалендаря = Выборка.Код; - ОтборСтрок.Год = Выборка.Год; - НайденныеСтроки = ДанныеИзМакета.НайтиСтроки(ОтборСтрок); - Если НайденныеСтроки.Количество() > 0 Тогда - // Если есть данные в макете, считаем, что перезаполнять не нужно. - Продолжить; + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + РезультатЗапроса = Запрос.Выполнить(); + Если Не РезультатЗапроса.Пустой() Тогда + КодыЗависимых = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Код"); + ДанныеИзМакета = ДанныеПроизводственныхКалендарейПоУмолчанию(КодыЗависимых); + ОтборСтрок = Новый Структура( + "КодПроизводственногоКалендаря, + |Год"); + Выборка = РезультатЗапроса.Выбрать(); + Пока Выборка.Следующий() Цикл + ОтборСтрок.КодПроизводственногоКалендаря = Выборка.Код; + ОтборСтрок.Год = Выборка.Год; + НайденныеСтроки = ДанныеИзМакета.НайтиСтроки(ОтборСтрок); + Если НайденныеСтроки.Количество() > 0 Тогда + // Если есть данные в макете, считаем, что перезаполнять не нужно. + Продолжить; + КонецЕсли; + ДанныеКалендаря = РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(Выборка.Код, Выборка.Год, Выборка.КодБазовогоКалендаря); + ДанныеКалендаря.Колонки.Добавить("ПроизводственныйКалендарь"); + ДанныеКалендаря.ЗаполнитьЗначения(Выборка.ПроизводственныйКалендарь, "ПроизводственныйКалендарь"); + НаборЗаписей = РегистрыСведений.ДанныеПроизводственногоКалендаря.СоздатьНаборЗаписей(); + НаборЗаписей.Загрузить(ДанныеКалендаря); + НаборЗаписей.Отбор.ПроизводственныйКалендарь.Установить(Выборка.ПроизводственныйКалендарь); + НаборЗаписей.Отбор.Год.Установить(Выборка.Год); + Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей); + Иначе + НаборЗаписей.Записать(); + КонецЕсли; + // Добавляем в таблицу изменений. + НоваяСтрока = ИзмененияКалендарей.Добавить(); + НоваяСтрока.КодПроизводственногоКалендаря = Выборка.Код; + НоваяСтрока.Год = Выборка.Год; + КонецЦикла; КонецЕсли; - ДанныеКалендаря = РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(Выборка.Код, Выборка.Год, Выборка.КодБазовогоКалендаря); - ДанныеКалендаря.Колонки.Добавить("ПроизводственныйКалендарь"); - ДанныеКалендаря.ЗаполнитьЗначения(Выборка.ПроизводственныйКалендарь, "ПроизводственныйКалендарь"); - НаборЗаписей = РегистрыСведений.ДанныеПроизводственногоКалендаря.СоздатьНаборЗаписей(); - НаборЗаписей.Загрузить(ДанныеКалендаря); - НаборЗаписей.Отбор.ПроизводственныйКалендарь.Установить(Выборка.ПроизводственныйКалендарь); - НаборЗаписей.Отбор.Год.Установить(Выборка.Год); - Если ОбновлениеИнформационнойБазы.ЭтоВызовИзОбработчикаОбновления() Тогда - ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей); - Иначе - НаборЗаписей.Записать(); - КонецЕсли; - // Добавляем в таблицу изменений. - НоваяСтрока = ИзмененияКалендарей.Добавить(); - НоваяСтрока.КодПроизводственногоКалендаря = Выборка.Код; - НоваяСтрока.Год = Выборка.Год; - КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры // Определяет источник актуального перечня поддерживаемых производственных календарей (макет или поставка классификатора). // // Возвращаемое значение: -// ТаблицаЗначений +// ТаблицаЗначений // Функция ПроизводственныеКалендариПоУмолчанию() Экспорт @@ -837,7 +844,7 @@ // Определяет источник актуальных данных производственного календаря (макет или поставка классификатора). // // Параметры: -// КодыКалендарей - Массив. +// КодыКалендарей - Массив. // // Возвращаемое значение: // см. Справочники.ПроизводственныеКалендари.ДанныеПроизводственныхКалендарейИзXML. @@ -909,12 +916,9 @@ // Процедура записывает данные одного производственного календаря за 1 год. // // Параметры: -// ПроизводственныйКалендарь - ссылка на текущий элемент справочника. -// НомерГода - номер года, за который необходимо записать производственный календарь. -// ДанныеПроизводственногоКалендаря - таблица значений, в которой хранятся сведения о виде дня на каждую дату календаря. -// -// Возвращаемое значение -// Нет +// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - текущий элемент справочника. +// НомерГода - Число - номер года, за который необходимо записать производственный календарь. +// ДанныеПроизводственногоКалендаря - см. Справочник.ПроизводственныеКалендари.ДанныеПроизводственногоКалендаря. // Процедура ЗаписатьДанныеПроизводственногоКалендаря(ПроизводственныйКалендарь, НомерГода, ДанныеПроизводственногоКалендаря) Экспорт @@ -945,7 +949,7 @@ // этого дня в поле календаря. // // Возвращаемое значение -// ЦветаОформления - соответствие видов дня и цветов оформления. +// ЦветаОформления - соответствие видов дня и цветов оформления. // Функция ЦветаОформленияВидовДнейПроизводственногоКалендаря() Экспорт @@ -965,7 +969,7 @@ // по метаданным перечисления ВидыДнейПроизводственногоКалендаря. // // Возвращаемое значение -// СписокВидовДня - список значений, содержащий значение перечисления +// СписокВидовДня - СписокЗначений - содержащий значение перечисления // и его синоним в качестве представления. // Функция СписокВидовДня() Экспорт @@ -1016,8 +1020,8 @@ ПраздничныеДни.Колонки.Добавить("ТолькоНерабочий", Новый ОписаниеТипов("Булево")); Если Метаданные.Обработки.Найти("ЗаполнениеКалендарныхГрафиков") <> Неопределено Тогда - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - МодульКалендарныеГрафики.ЗаполнитьПраздничныеДни(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + МодульЗаполнениеКалендарныхГрафиков.ЗаполнитьПраздничныеДни(КодПроизводственногоКалендаря, НомерГода, ПраздничныеДни); КонецЕсли; Возврат ПраздничныеДни; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl index 2ec713dc6..c66ef683e 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -36,7 +36,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -58,7 +60,30 @@ // ТехнологияСервиса.ВыгрузкаЗагрузкаДанных -// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +// Подключается в ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +// +// Параметры: +// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера +// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы +// Сериализатор - СериализаторXDTO +// Объект - КонстантаМенеджерЗначения +// - СправочникОбъект +// - ДокументОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланСчетовОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланВидовРасчетаОбъект +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей +// - ПоследовательностьНаборЗаписей +// - ПерерасчетНаборЗаписей +// Артефакты - Массив из ОбъектXDTO +// Отказ - Булево +// Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт УправлениеДоступомСлужебный.ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ); @@ -291,10 +316,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -505,7 +528,8 @@ Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл Отбор = Новый Структура; - Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.ЗначениеДоступа)); + Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", + "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); Отбор.Вставить("ЗначениеДоступа", Запрос.Выполнить().Выгрузить()[0].Значение); Если Профиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда Возврат Истина; @@ -675,7 +699,7 @@ // // Возвращаемое значение: // ФиксированнаяСтруктура: -// * ОписанияПрофилей - Соответствие: +// * ОписанияПрофилей - Соответствие из КлючИЗначение: // ** Ключ - Строка // ** Значение - см. СвойстваПоставляемогоПрофиля // * ОписанияПрофилейМассив - Массив из см. СвойстваПоставляемогоПрофиля @@ -746,6 +770,35 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Начальное заполнение + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт + + Настройки.ПриНачальномЗаполненииЭлемента = Ложь; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// +// Параметры: +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// +Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + + Элемент = Элементы.Добавить(); + Элемент.ИмяПредопределенныхДанных = "Администратор"; + Элемент.Наименование = НСтр("ru = 'Администратор'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для поддержки обмена данными в РИБ. @@ -804,14 +857,32 @@ ЕстьИзменения = Ложь; + // АПК:1328-выкл. См. 648.1.1. Допустимо чтение без предварительной + // управляемой разделяемой блокировки, так как используется только + // для очистки и какой сеанс очистит первым не важно. Выборка = Запрос.Выполнить().Выбрать(); + // АПК:1328-вкл. + Пока Выборка.Следующий() Цикл - ПрофильОбъект = Выборка.Ссылка.ПолучитьОбъект(); - УдалитьРолиРасширений(ПрофильОбъект); - Если ПрофильОбъект.Модифицированность() Тогда - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); - ЕстьИзменения = Истина; - КонецЕсли; + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ПрофильОбъект = Выборка.Ссылка.ПолучитьОбъект(); + Если ПрофильОбъект <> Неопределено Тогда + УдалитьРолиРасширений(ПрофильОбъект); + Если ПрофильОбъект.Модифицированность() Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильОбъект, Ложь); + ЕстьИзменения = Истина; + КонецЕсли; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; Если ЕстьИзменения Тогда @@ -938,6 +1009,10 @@ КонецФункции // Для функции ЗаполненныеПоставляемыеПрофили. +// +// Параметры: +// ОписаниеПрофиляАдминистратор - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа +// Процедура ЗаполнитьПрофильАдминистратор(ОписаниеПрофиляАдминистратор, КромеОписания = Ложь) Если КромеОписания Тогда @@ -1297,7 +1372,7 @@ // * Наименование - Строка // * Роли - ФиксированныйМассив из Строка // * Назначение - ФиксированныйМассив из ОпределяемыйТип.Пользователь -// * ВидыДоступа - ФиксированноеСоответствие: +// * ВидыДоступа - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка // * Значение - Строка // * ЗначенияДоступа - ФиксированныйМассив из Структура: @@ -1315,7 +1390,7 @@ КонецФункции // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - строковый идентификатор поставляемого профиля // * Значение - Строка - описание поставляемого профиля // @@ -1460,7 +1535,8 @@ СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа); СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка; - Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.ЗначениеДоступа)); + Запрос = Новый Запрос(СтрЗаменить("ВЫБРАТЬ Значение(ЗначениеДоступа) КАК Значение", + "ЗначениеДоступа", ОписаниеЗначенияДоступа.ЗначениеДоступа)); СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; КонецЦикла; diff --git a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаЭлемента/Module.bsl index 39dd22762..ac6c206d3 100644 --- a/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиКлючевыхОпераций/Forms/ФормаЭлемента/Module.bsl @@ -207,10 +207,10 @@ &НаСервере Процедура ЗагрузитьПрофильКлючевыхОперацийНаСервере(АдресХранилища) - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища); // ДвоичныеДанные ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); - ДвоичныеДанные.Записать(ИмяВременногоФайла); // ДвоичныеДанные + ДвоичныеДанные.Записать(ИмяВременногоФайла); ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла); diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl index a557dc441..8705a727e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПолучателиРассылки/Module.bsl @@ -243,9 +243,8 @@ &НаСервере Процедура ЗаполнитьПочтовыеАдреса() - НаборПараметров = "Ссылка, ВидПочтовогоАдресаПолучателей, Личная, Получатели, ТипПолучателейРассылки"; - ПараметрыПолучателей = Новый Структура(НаборПараметров); + ПараметрыПолучателей = Новый Структура("Ссылка, ВидПочтовогоАдресаПолучателей, Личная, Получатели, ТипПолучателейРассылки"); ЗаполнитьЗначенияСвойств(ПараметрыПолучателей, ЭтотОбъект); ПараметрыПолучателей.Личная = Ложь; ПараметрыПолучателей.ТипПолучателейРассылки = ИдентификаторОбъектаМетаданных; diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form index 643a84632..b49daf8bb 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Form.form @@ -120,10 +120,6 @@ true - - <key>ru</key> - <value>Основное</value> - ОсновноеРасширеннаяПодсказка 25 @@ -209,10 +205,6 @@ true - - <key>ru</key> - <value>Основные команды</value> - ОсновныеКомандыРасширеннаяПодсказка 13 @@ -233,10 +225,6 @@ true - - <key>ru</key> - <value>Командная панель</value> - КоманднаяПанельРасширеннаяПодсказка 11 diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Module.bsl index e44af4388..64a1e621d 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/Предупреждение/Module.bsl @@ -84,20 +84,27 @@ Текст.Добавить(, Тип("ПереводСтрокиФорматированногоДокумента")); Текст.Добавить(, Тип("ПереводСтрокиФорматированногоДокумента")); - // АПК:1299-выкл Строка текста добавляется фрагментами, чтобы для одного из них установить навигационную ссылку - - Текст.Добавить(НСтр("ru = 'Перейдите к '"), Тип("ТекстФорматированногоДокумента")); - ЭлементСсылки = Текст.Добавить(НСтр("ru = 'настройкам учетной записи электронной почты'"), Тип("ТекстФорматированногоДокумента")); - Текст.Добавить(НСтр("ru = ' для корректировки логина, пароля.'"), Тип("ТекстФорматированногоДокумента")); - - // АПК:1299-вкл Строка текста добавляется фрагментами, чтобы для одного из них установить навигационную ссылку - Ссылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Ссылка"); Если ЗначениеЗаполнено(Ссылка) Тогда - ЭлементСсылки.НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Ссылка); + + ШаблонСтроки = НСтр("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 de1edccbd..9785ab2af 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form @@ -40,8 +40,9 @@ Left true - 15 + 12 true + 15 true true true @@ -118,7 +119,7 @@ Left true - 35 + 25 true true true @@ -170,7 +171,7 @@ Left true - 35 + 25 true true true diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl index 15ff5deee..555d9b54e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -35,7 +35,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -55,25 +57,23 @@ #Область СлужебныеПроцедурыИФункции +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Ложь; КонецПроцедуры -// Вызывается при начальном заполнении справочника РолиИсполнителей. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника РолиИсполнителей. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт @@ -83,17 +83,6 @@ КонецПроцедуры -// Вызывается РолиИсполнителей при начальном заполнении создаваемой роли исполнителя. -// -// Параметры: -// Объект - СправочникОбъект.РолиИсполнителей - заполняемый объект. -// Данные - СтрокаТаблицыЗначений - данные заполнения. -// ДополнительныеПараметры - Структура -// -Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт - -КонецПроцедуры - #КонецОбласти #КонецЕсли diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Module.bsl index f58bf3466..e9eadaa8a 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Module.bsl @@ -40,7 +40,10 @@ СвойстваСписка.ТекстЗапроса = Список.ТекстЗапроса + СтрокаОтбораВТекстеЗапроса; ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(Элементы.Список, СвойстваСписка); - МультиязычностьСервер.ИзменениеТекстаЗапросаСпискаДляТекущегоЯзыка(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ИзменениеТекстаЗапросаСпискаДляТекущегоЯзыка(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl index 8c8245eda..efc0e4898 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Module.bsl @@ -15,7 +15,10 @@ НастроитьОтображениеСпискаРолей(); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl index 34c066ed4..77e656fae 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl @@ -18,23 +18,41 @@ ОбновитьДоступность(); - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -84,7 +102,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl index 6134a254c..160c44b7d 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -58,17 +58,21 @@ КонецЕсли; ТекстПоискаДляДополнительныхЯзыков = ""; - Если МультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() Тогда - ТекстПоискаДляДополнительныхЯзыков = " ИЛИ РолиИсполнителей.НаименованиеЯзык1 ПОДОБНО &СтрокаПоиска"; - КонецЕсли; - Если МультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() Тогда - ТекстПоискаДляДополнительныхЯзыков = ТекстПоискаДляДополнительныхЯзыков - + " ИЛИ РолиИсполнителей.НаименованиеЯзык2 ПОДОБНО &СтрокаПоиска"; - КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); - Если МультиязычностьСервер.ИспользуетсяВторойДополнительныйЯзык() Тогда - СуффиксЯзыка = МультиязычностьСервер.СуффиксТекущегоЯзыка(); + Если МодульМультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() Тогда + ТекстПоискаДляДополнительныхЯзыков = "РолиИсполнителей.НаименованиеЯзык1 ПОДОБНО &СтрокаПоиска"; + КонецЕсли; + + Если МодульМультиязычностьСервер.ИспользуетсяВторойДополнительныйЯзык() Тогда + Если Не ПустаяСтрока(ТекстПоискаДляДополнительныхЯзыков) Тогда + ТекстПоискаДляДополнительныхЯзыков = ТекстПоискаДляДополнительныхЯзыков + " " + "ИЛИ" + " "; + КонецЕсли; + ТекстПоискаДляДополнительныхЯзыков = ТекстПоискаДляДополнительныхЯзыков + + " ИЛИ РолиИсполнителей.НаименованиеЯзык2 ПОДОБНО &СтрокаПоиска"; + КонецЕсли; КонецЕсли; ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 20 @@ -79,12 +83,17 @@ | ПО РолиИсполнителейНазначение.Ссылка = РолиИсполнителей.Ссылка |ГДЕ | РолиИсполнителейНазначение.ТипПользователей = &Тип - | И (РолиИсполнителей.Наименование ПОДОБНО &СтрокаПоиска " + ТекстПоискаДляДополнительныхЯзыков + " + | И (РолиИсполнителей.Наименование ПОДОБНО &СтрокаПоиска + | ИЛИ &ПоискДляДополнительныхЯзыков | ИЛИ РолиИсполнителей.Код ПОДОБНО &СтрокаПоиска) | И НЕ РолиИсполнителей.Ссылка ЕСТЬ NULL"; + Если ПустаяСтрока(ТекстПоискаДляДополнительныхЯзыков) Тогда + ТекстПоискаДляДополнительныхЯзыков = "ЛОЖЬ"; + КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоискДляДополнительныхЯзыков", ТекстПоискаДляДополнительныхЯзыков); + Запрос = Новый Запрос(ТекстЗапроса); - Запрос.УстановитьПараметр("Тип", ОбъектАвторизации); Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%"); РезультатЗапроса = Запрос.Выполнить().Выбрать(); @@ -100,13 +109,33 @@ Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); + КонецЕсли; + #Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры @@ -116,32 +145,35 @@ #Область СлужебныйПрограммныйИнтерфейс +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Истина; КонецПроцедуры -// Вызывается при начальном заполнении справочника РолиИсполнителей. +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов // // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника РолиИсполнителей. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "ОтветственныйЗаКонтрольИсполнения"; - МультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", - "ru='Координатор выполнения задач'", КодыЯзыков); // @НСтр + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", + "ru='Координатор выполнения задач'", КодыЯзыков); // @НСтр-2 + КонецЕсли; + Элемент.ИспользуетсяБезОбъектовАдресации = Истина; Элемент.ИспользуетсяСОбъектамиАдресации = Истина; Элемент.ВнешняяРоль = Ложь; @@ -157,12 +189,10 @@ КонецПроцедуры -// Вызывается РолиИсполнителей при начальном заполнении создаваемой роли исполнителя. +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов // // Параметры: -// Объект - СправочникОбъект.РолиИсполнителей - заполняемый объект. -// Данные - СтрокаТаблицыЗначений - данные заполнения. -// ДополнительныеПараметры - Структура +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки // Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl index 20afc9314..773008ee3 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/ObjectModule.bsl @@ -60,7 +60,10 @@ Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl index a0b67f03c..087ff95e4 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ВыборСертификатаДляПодписанияИлиРасшифровки/Module.bsl @@ -642,8 +642,8 @@ // Продолжение процедуры ПерейтиКВыборуТекущегоСертификата. // // Параметры: -// РезультатПоиска - СертификатКриптографии -// Контекст - Структура +// РезультатПоиска - СертификатКриптографии +// Контекст - Структура // &НаКлиенте Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификата(РезультатПоиска, Контекст) Экспорт @@ -669,11 +669,11 @@ // Продолжение процедуры ПерейтиКВыборуТекущегоСертификата. // // Параметры: -// РезультатПоиска - Структура: -// * Выполнено - Булево -// * ОписаниеОшибки - Структура: -// ** Описание - Строка -// Контекст - Структура +// РезультатПоиска - Структура: +// * Выполнено - Булево +// * ОписаниеОшибки - Структура: +// ** Описание - Строка +// Контекст - Структура // &НаКлиенте Процедура ПерейтиКВыборуТекущегоСертификатаПослеПоискаСертификатаВОблачномСервисе(РезультатПоиска, Контекст) Экспорт diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl index 6f935fb5c..3d2a73841 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ДобавлениеСертификатаДляШифрования/Module.bsl @@ -284,10 +284,10 @@ // Продолжение процедуры Далее. // // Параметры: -// Результат - Структура: -// * ОписаниеОшибки - Структура: -// ** Описание - Строка -// Контекст - Структура +// Результат - Структура: +// * ОписаниеОшибки - Структура: +// ** Описание - Строка +// Контекст - Структура // &НаКлиенте Процедура ДалееПослеПоискаСертификатаВОблачномСервисе(Результат, Контекст) Экспорт diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl index 7cbc026de..badb1bc71 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Forms/ПроверкаСертификата/Module.bsl @@ -1412,7 +1412,7 @@ Процедура УстановитьЭлемент(Форма, НачалоЭлемента, НаСервере, ОписаниеОшибки = Неопределено, ЭтоОшибка = Ложь, ОбъединятьРезультаты = "НеОбъединять") - ЭлементНадпись = Форма.Элементы[НачалоЭлемента + "Надпись"]; // ДекорацияФормы, Надпись + ЭлементНадпись = Форма.Элементы[НачалоЭлемента + "Надпись"]; // ДекорацияФормы, РасширениеДекорацииФормыДляНадписи Если ОбъединятьРезультаты = "ОбъединятьПоИ" Или ОбъединятьРезультаты = "ОбъединятьПоИли" Тогда diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl index 123730941..71eb71925 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx index 32920e00c..18c798aaa 100644 --- a/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx +++ b/SSL/src/Catalogs/СертификатыКлючейЭлектроннойПодписиИШифрования/Templates/Штамп/Template.mxlx @@ -80,7 +80,6 @@ 9 - ДатаПодписи @@ -114,33 +113,6 @@ 4 - - - - 10 - - - - - 11 - - - ru - Кем выдан: - - - - - - - 12 - ВыдалСертификат - - - - - - 5 @@ -167,7 +139,7 @@ - 6 + 5 @@ -194,7 +166,7 @@ - 7 + 6 @@ -211,30 +183,20 @@ true 18 - 12 - 12 + 11 + 11 1 1 1 - 7 + 6 1 1 ВладелецСертификата - - Rectangle - 5 - 5 - 2 - 2 - - - - ВыдалСертификат Rectangle 4 @@ -268,27 +230,27 @@ Rows 1 - 7 - 0 - 0 + 6 + -1 + -1 Отступ Rows - 10 - 10 - 0 - 0 + 9 + 9 + -1 + -1 ОтступЛев Rectangle - 10 - 11 + 9 + 10 1 1 @@ -297,8 +259,8 @@ ОтступПрав Rectangle - 10 - 11 + 9 + 10 2 2 @@ -308,7 +270,7 @@ Rectangle 1 - 7 + 6 0 0 @@ -317,8 +279,8 @@ СрокДействия Rectangle - 6 - 6 + 5 + 5 2 2 @@ -327,8 +289,8 @@ ТекстОтметки Rectangle - 7 - 7 + 6 + 6 1 2 @@ -338,7 +300,7 @@ Rectangle 1 - 7 + 6 1 2 @@ -348,7 +310,7 @@ Rectangle 1 - 6 + 5 1 1 @@ -358,7 +320,7 @@ Rectangle 1 - 6 + 5 2 2 @@ -399,7 +361,7 @@ Text true 1 - RealSize + Proportionally Center Center @@ -428,7 +390,6 @@ 1 219 Center - Parameter true diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl index eb31279f0..595f7cf7b 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -45,6 +47,7 @@ КонецПроцедуры // Конец СтандартныеПодсистемы.УправлениеДоступом + #КонецОбласти #КонецОбласти diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl index 12c642570..17c8aefb2 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/Forms/ФормаСписка/Module.bsl @@ -35,6 +35,10 @@ #Область ОбработчикиКомандФормы // СтандартныеПодсистемы.ПодключаемыеКоманды + +// Параметры: +// Команда - КомандаФормы +// &НаКлиенте Процедура Подключаемый_ВыполнитьКоманду(Команда) @@ -53,23 +57,31 @@ КонецЕсли; Если Перемещать Тогда - ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список); + ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список); Иначе ПоказатьПредупреждение(,НСтр("ru = 'Начальное и конечное состояние перемещать нельзя.'")); КонецЕсли; КонецЕсли; Иначе - ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ЭтотОбъект, Команда, Элементы.Список); + ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список); КонецЕсли; КонецПроцедуры -&НаСервере -Процедура Подключаемый_ВыполнитьКомандуНаСервере(Контекст, Результат) Экспорт - ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, Контекст, Элементы.Список, Результат); +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); + КонецПроцедуры +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + + ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список); + +КонецПроцедуры &НаКлиенте Процедура Подключаемый_ОбновитьКоманды() ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список); diff --git a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl index 4d0facc23..b42219df0 100644 --- a/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl +++ b/SSL/src/Catalogs/СостоянияОригиналовПервичныхДокументов/ManagerModule.bsl @@ -10,18 +10,23 @@ #Область СлужебныйПрограммныйИнтерфейс +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Ложь; КонецПроцедуры -// Вызывается при начальном заполнении справочника. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника РолиИсполнителей. +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl index b6ae8fe58..32873bb4b 100644 --- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -125,25 +125,23 @@ #Область СлужебныеПроцедурыИФункции +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Ложь; КонецПроцедуры -// Вызывается при начальном заполнении справочника СтраныМира. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника СтраныМира. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт @@ -165,8 +163,15 @@ // Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт - // Если наименования были обновлены, то их следует обновить - МультиязычностьСервер.ЗарегистрироватьПредопределенныеЭлементыДляОбновления(Параметры, Метаданные.Справочники.СтраныМира); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + // Обновление мультиязычных строк, если они были изменены. + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("РежимОбновления", "МультиязычныеСтроки"); + + ОбновлениеИнформационнойБазы.ЗарегистрироватьПредопределенныеЭлементыДляОбновления(Параметры, + Метаданные.Справочники.СтраныМира, ДополнительныеПараметры); + + КонецЕсли; СписокСтран = УправлениеКонтактнойИнформацией.СтраныУчастникиЕАЭС(); @@ -225,7 +230,11 @@ Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт СтранаМираСсылка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, "Справочник.СтраныМира"); - НастройкиОбновления = МультиязычностьСервер.НастройкиОбновлениеПредопределенныхДанных(Метаданные.Справочники.СтраныМира); + НастройкиОбновления = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + НастройкиОбновления = МодульМультиязычностьСервер.НастройкиОбновлениеПредопределенныхДанных(Метаданные.Справочники.СтраныМира); + КонецЕсли; ПроблемныхОбъектов = 0; ОбъектовОбработано = 0; @@ -244,8 +253,11 @@ КонецЕсли; // Обновление наименований - Если НастройкиОбновления.ЛокализуемыеРеквизитыОбъекта.Количество() > 0 Тогда - МультиязычностьСервер.ОбновитьМультиязычныеСтрокиПредопределенногоЭлемента(СтранаМираСсылка, НастройкиОбновления); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + Если НастройкиОбновления.ЛокализуемыеРеквизитыОбъекта.Количество() > 0 Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ОбновитьМультиязычныеСтрокиПредопределенногоЭлемента(СтранаМираСсылка, НастройкиОбновления); + КонецЕсли; КонецЕсли; ОбъектовОбработано = ОбъектовОбработано + 1; diff --git a/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl b/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl index 616369b34..6ec03b75c 100644 --- a/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ObjectModule.bsl @@ -11,21 +11,34 @@ #Область ОбработчикиСобытий Процедура ПередЗаписью(Отказ) + Если ОбменДанными.Загрузка Или ДополнительныеСвойства.Свойство("НеПроверятьУникальность") Тогда Возврат; КонецЕсли; + Если Предопределенный И Не ЭтоНовый() Тогда + + ПроверитьИзменениеПредопределенногоЭлемента(); + + КонецЕсли; + Если Не ПроверитьЗаполнение() Тогда Отказ = Истина; КонецЕсли; + КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) - Существующий = СуществующийЭлемент(); - Если Существующий<>Неопределено Тогда + СписокОшибок = ПроверитьУникальностьЭлементов(); + + Если СписокОшибок.Количество() > 0 Тогда + Отказ = Истина; - ОбщегоНазначения.СообщитьПользователю(Существующий.ОписаниеОшибки,, "Объект.Наименование"); + Для каждого ОписаниеОшибки Из СписокОшибок Цикл + ОбщегоНазначения.СообщитьПользователю(ОписаниеОшибки.ТекстСообщения,, ОписаниеОшибки.ИмяПоля); + КонецЦикла; + КонецЕсли; КонецПроцедуры @@ -41,35 +54,26 @@ #Область СлужебныеПроцедурыИФункции // Контролирует уникальность элемента в базе. +// В случае выявления дублей кодов или наименование возвращает их список. // // Возвращаемое значение: -// Неопределено - нет ошибок. -// Структура - описание элемента, существующего в базе. Свойства: -// * ОписаниеОшибки - Строка - текст ошибки. -// * Код - Строка - реквизит уже существующего элемента. -// * Наименование - Строка - реквизит уже существующего элемента. -// * НаименованиеПолное - Строка - реквизит уже существующего элемента. -// * КодАльфа2 - Строка - реквизит уже существующего элемента. -// * КодАльфа3 - Строка - реквизит уже существующего элемента. -// * Ссылка - СправочникаСсылка.СтраныМира - реквизит уже существующего элемента. +// Массив из см. НовыйСообщениеОбОшибке - если в программе были найдены дубли, то содержит описание элементов +// существующих в базе. // -Функция СуществующийЭлемент() +Функция ПроверитьУникальностьЭлементов() - Результат = Неопределено; + Результат = Новый Массив; // Нецифровые коды пропускаем ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(3, 0, ДопустимыйЗнак.Неотрицательный)); - Если Код="0" Или Код="00" Или Код="000" Тогда + Если Код= "0" Или Код = "00" Или Код = "000" Тогда КодПоиска = "000"; Иначе КодПоиска = Формат(ТипЧисло.ПривестиЗначение(Код), "ЧЦ=3; ЧН=; ЧВН="); - Если КодПоиска="000" Тогда - Возврат Результат; // Не число - КонецЕсли; КонецЕсли; Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 1 + |ВЫБРАТЬ ПЕРВЫЕ 10 | Код КАК Код, | Наименование КАК Наименование, | НаименованиеПолное КАК НаименованиеПолное, @@ -80,27 +84,110 @@ |ИЗ | Справочник.СтраныМира |ГДЕ - | Код=&Код + | (Код = &Код + | ИЛИ Наименование = &Наименование + | ИЛИ КодАльфа2 = &КодАльфа2 + | ИЛИ КодАльфа3 = &КодАльфа3 + | ИЛИ НаименованиеПолное = &НаименованиеПолное) | И Ссылка <> &Ссылка |"); - Запрос.УстановитьПараметр("Ссылка", Ссылка); - Запрос.УстановитьПараметр("Код", КодПоиска); + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.УстановитьПараметр("Код", КодПоиска); + Запрос.УстановитьПараметр("Наименование", Наименование); + Запрос.УстановитьПараметр("НаименованиеПолное", НаименованиеПолное); + Запрос.УстановитьПараметр("КодАльфа2", КодАльфа2); + Запрос.УстановитьПараметр("КодАльфа3", КодАльфа3); РезультатЗапроса = Запрос.Выполнить(); - Выборка = РезультатЗапроса.Выбрать(); - Если Выборка.Следующий() Тогда - Результат = Новый Структура("ОписаниеОшибки", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'С кодом %1 уже существует страна %2. Измените код или используйте уже существующие данные.'"), - Код, Выборка.Наименование)); - - Для Каждого Поле Из РезультатЗапроса.Колонки Цикл - Результат.Вставить(Поле.Имя, Выборка[Поле.Имя]); - КонецЦикла; + Если РезультатЗапроса.Пустой() Тогда + Возврат Результат; КонецЕсли; + Выборка = РезультатЗапроса.Выбрать(); + Пока Выборка.Следующий() Цикл + + Сообщение = НовыйСообщениеОбОшибке(); + Если СтрСравнить(Выборка.Код, Код) = 0 Тогда + + Сообщение.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'С кодом %1 уже существует страна %2. Измените код или используйте уже существующие данные.'"), + Код, Выборка.Наименование); + Сообщение.ИмяПоля = "Объект.Код"; + + ИначеЕсли СтрСравнить(Выборка.Наименование, Наименование) = 0 Тогда + + Сообщение.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Страна с наименованием %1 уже существует. Измените наименование или используйте уже существующие данные.'"), + Выборка.Наименование); + Сообщение.ИмяПоля = "Объект.Наименование"; + + ИначеЕсли СтрСравнить(Выборка.НаименованиеПолное, НаименованиеПолное) = 0 Тогда + + Сообщение.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уже существует страна %2 с полным наименованием %1. Измените полное наименование или используйте уже существующие данные.'"), + НаименованиеПолное, Выборка.Наименование); + Сообщение.ИмяПоля = "Объект.НаименованиеПолное"; + + ИначеЕсли СтрСравнить(Выборка.КодАльфа2, КодАльфа2) = 0 Тогда + + Сообщение.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'С кодом Альфа-2 %1 уже существует страна %2. Измените код Альфа-2 или используйте уже существующие данные.'"), + КодАльфа2, Выборка.Наименование); + Сообщение.ИмяПоля = "Объект.КодАльфа2"; + + ИначеЕсли СтрСравнить(Выборка.КодАльфа3, КодАльфа3) = 0 Тогда + + Сообщение.ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'С кодом Альфа-3 %1 уже существует страна %2. Измените код Альфа-3 или используйте уже существующие данные.'"), + КодАльфа3, Выборка.Наименование); + Сообщение.ИмяПоля = "Объект.КодАльфа3"; + + КонецЕсли; + + Результат.Добавить(Сообщение); + + КонецЦикла; + Возврат Результат; + КонецФункции +// Возвращаемое значение: +// Структура: +// ИмяПоля - Строка +// ТекстСообщения - Строка +// +Функция НовыйСообщениеОбОшибке() + + Результат = Новый Структура; + Результат.Вставить("ИмяПоля", ""); + Результат.Вставить("ТекстСообщения", ""); + + Возврат Результат; + +КонецФункции + +Процедура ПроверитьИзменениеПредопределенногоЭлемента() + + ПредыдущиеЗначения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Код, Наименование"); + Если СтрСравнить(ПредыдущиеЗначения.Наименование, Наименование) <> 0 Тогда + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не допускается изменение наименования для страны %1'"), ПредыдущиеЗначения.Наименование); + ВызватьИсключение ТекстСообщения; + + КонецЕсли; + + Если СтрСравнить(ПредыдущиеЗначения.Код, Код) <> 0 Тогда + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не допускается изменение кода для страны %1'"), ПредыдущиеЗначения.Наименование); + ВызватьИсключение ТекстСообщения; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Иначе diff --git a/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl index 2548cb15d..3bddcdfa1 100644 --- a/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl index 068732bfd..76bc5aca0 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form index 223babf5e..d74c10e97 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Form.form @@ -88,10 +88,6 @@ true - - <key>ru</key> - <value>Лишние файлы</value> - ГруппаЛишниеФайлыРасширеннаяПодсказка 17 @@ -195,10 +191,6 @@ true - - <key>ru</key> - <value>Комментарий</value> - ГруппаКомментарийРасширеннаяПодсказка 6 @@ -318,10 +310,6 @@ true - - <key>ru</key> - <value>Настройки удаления</value> - НастройкиУдаленияРасширеннаяПодсказка 28 diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl index 693e0ff56..7819cc50f 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/УдалениеЛишнихФайловИзТома/Module.bsl @@ -207,11 +207,10 @@ // Возвращаемое значение: -// Структура: +// Структура: // * КаталогДляКопирования - Строка // * ПоследняяИтерация - Булево -// * ТекущийФайл - ОпределяемыйТип.ПрисоединенныйФайл: -// ** Имя - Строка +// * ТекущийФайл - Файл // * ИтоговоеОповещение - ОписаниеОповещения // &НаКлиенте @@ -240,8 +239,8 @@ КонецПроцедуры // Параметры: -// КаталогСуществует - Булево -// ДополнительныеПараметры - см. ПараметрыТекущегоФайла +// КаталогСуществует - Булево +// ДополнительныеПараметры - см. ПараметрыТекущегоФайла // &НаКлиенте Процедура КаталогДняСуществуетЗавершение(КаталогСуществует, ДополнительныеПараметры) Экспорт @@ -257,8 +256,8 @@ КонецПроцедуры // Параметры: -// ИмяКаталога - Строка -// ДополнительныеПараметры - см. ПараметрыТекущегоФайла +// ИмяКаталога - Строка +// ДополнительныеПараметры - см. ПараметрыТекущегоФайла // &НаКлиенте Процедура СоздатьКаталогДняЗавершение(ИмяКаталога, ДополнительныеПараметры) Экспорт @@ -348,7 +347,7 @@ КонецПроцедуры // Возвращаемое значение: -// Структура: +// Структура: // * Имя - Строка // * Ошибка - Строка // @@ -506,8 +505,8 @@ КонецПроцедуры // Параметры: -// ОтчетОбОшибках - ТабличныйДокумент -// МассивФайловСОшибками - Массив из см. СтруктураОшибки +// ОтчетОбОшибках - ТабличныйДокумент +// МассивФайловСОшибками - Массив из см. СтруктураОшибки // &НаСервере Процедура СформироватьОтчетОбОшибках(ОтчетОбОшибках, МассивФайловСОшибками) diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form index 0afd5e2de..ee25fc983 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form @@ -129,7 +129,7 @@ 5 <key>ru</key> - <value>Полный путь для сервера 1С:Предприятия под управлением Microsoft Windows</value> + <value>Полный путь к общей папке на компьютере под управлением Microsoft Windows</value> true true @@ -179,7 +179,7 @@ Normal ru - \\servername\resource + \\computername\foldername @@ -188,7 +188,7 @@ 23 <key>ru</key> - <value>Полный путь для сервера 1С:Предприятия под управлением Linux</value> + <value>Полный путь к общей папке на компьютере под управлением Linux</value> true true diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html index a504ce4af..8cd7cfdff 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html @@ -1,23 +1,34 @@

Описание свойств тома хранения файлов.

-

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

+

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

Для каждого тома необходимо указать:

  • Наименование - полное наименование тома для хранения файлов; -
  • Код - заполняется автоматически; -
  • Полный путь для сервера 1С:Предприятия под управлением Microsoft Windows - напишите путь к каталогу тома для сервера под управлением Microsoft Windows в формате UNC - \\Имя компьютера\Наименование папки\Наименование файла\;

или

-
    • Полный путь для сервера 1С:Предприятия под управлением Linux - напишите путь к каталогу для сервера под управлением Linux;
  • Порядок - введите целое число, по умолчанию равно 1. Заполнение томов осуществляется по порядку заполнения (по возрастанию) до полного заполнения тома. Эту особенность можно использовать, например, для временного отключения тома путем увеличения ему порядка заполнения. -
  • Предел, МБ -можно указать максимальный размер всех файлов на томе (квота тома). Если суммарный размер файлов в томе превышает установленную квоту, то будет использован следующий по порядку том. Если ни на одном из доступных томов не будет достаточно места для размещения файла, то информация об этом будет записана в журнал регистрации и будет выдано сообщение об ошибке. Если квота установлена равной нулю, то при размещении файлов в томе она не проверяется; -
  • Текущий размер, МБ - проставляется программой автоматически по мере наполнения тома, показывает, насколько том заполнен; -
  • На вкладке Комментарий напишите подробную информацию о томе.

Особенности заполнения поля Полный путь для Linux

-
  • Если сервер 1С:Предприятия работает под Linux, то путь к тому хранения файлов можно указать только локальный, например /home/path. Для того чтобы использовать UNC путь, нужно сделать на него ссылку.Для этого под правами администратора сделайте следующее: +
  • +
  • Код - заполняется автоматически; +
  • +
  • Полный путь к общей папке на компьютере под управлением Microsoft Windows - напишите путь к каталогу тома для сервера под управлением Microsoft Windows в формате UNC - \\Имя компьютера\Наименование папки;

или

+
    • Полный путь к общей папке на компьютере под управлением Linux - напишите путь к каталогу для сервера под управлением Linux;
  • Порядок - введите целое число, по умолчанию равно 1. Заполнение томов осуществляется по порядку заполнения (по возрастанию) до полного заполнения тома. Эту особенность можно использовать, например, для временного отключения тома путем увеличения ему порядка заполнения. +
  • +
  • Предел, МБ -можно указать максимальный размер всех файлов на томе (квота тома). Если суммарный размер файлов в томе превышает установленную квоту, то будет использован следующий по порядку том. Если ни на одном из доступных томов не будет достаточно места для размещения файла, то информация об этом будет записана в журнал регистрации и будет выдано сообщение об ошибке. Если квота установлена равной нулю, то при размещении файлов в томе она не проверяется; +
  • +
  • Текущий размер, МБ - проставляется программой автоматически по мере наполнения тома, показывает, насколько том заполнен; +
  • +
  • На вкладке Комментарий напишите подробную информацию о томе.

Особенности заполнения поля Полный путь для Linux

+
  • Если сервер 1С:Предприятия работает под Linux, то путь к тому хранения файлов можно указать только локальный, например /home/path. Для того чтобы использовать UNC путь, нужно сделать на него ссылку. Для этого под правами администратора сделайте следующее:
    • выполните команду вида mkdir folder, где вместо "folder" напишите имя своего каталога. Например, в каталоге /home выполните команду mkdir shared - будет создан каталог shared с полным путем /home/shared. -
    • выполните команду видаmount -t cifs //server/share folder -o //domain/user, password=pwd, где
      - где //server/share - UNC путь к другому компьютеру , folder - путь к каталогу на Linux компьютере, например \home\shared, //domain/user - имя домена/пользователя, если необходимо, pwd - пароль пользователя (если необходимо). -
    •  Если имя и пароль не нужны, команда выглядит так:mount -t cifs //server/share folder.
  • После этого в пути к тому указываем folder, например /home/shared.

Просмотр списка файлов в томе

+ +
  • выполните команду видаmount -t cifs //server/share folder -o //domain/user, password=pwd, где
    - где //server/share - UNC путь к другому компьютеру , folder - путь к каталогу на Linux компьютере, например \home\shared, //domain/user - имя домена/пользователя, если необходимо, pwd - пароль пользователя (если необходимо). +
  • +
  •  Если имя и пароль не нужны, команда выглядит так:mount -t cifs //server/share folder.
  • +
  • После этого в пути к тому указываем folder, например /home/shared.
  • Просмотр списка файлов в томе

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

    См. также:

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

    \ No newline at end of file diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html index 54533d630..fef23b376 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html @@ -3,28 +3,45 @@

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

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

    • Наименование - наименование тома хранения файлов; -
    • Порядок - целое число. Заполнение томов осуществляется по порядку заполнения по возрастанию до полного заполнения тома; -
    • Полный путь Microsoft Windows - путь к каталогу тома для сервера под управлением Microsoft Windows в формате UNC: \\Имя компьютера\Наименование папки\Наименование файла\; -
    • Комментарий - подробная информация о томе. -
    • Предел, Мб - можно указать максимальный размер всех файлов в томе (квота тома). Если квота установлена равной нулю, то при размещении файлов в томе она не проверяется. При установленном ненулевом значении Максимальный размер, если суммарный размер файлов в томе уже превышает установленную квоту, то будет использован следующий по порядку заполнения том. Если ни в одном из доступных томов не будет достаточно места для размещения файла, то информация об этом записывается в журнал регистрации и выводится сообщение об ошибке; -
    • Полный путь Linux - путь к каталогу для сервера под управлением Linux.

    Ввод тома хранения файлов

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

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

    Правила хранения файлов в томах

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

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

    Работа с томами хранения файлов

    • При создании нового тома автоматически проверяется доступ к указанному в поле Полный путь каталогу, в случае ошибки выводится соответствующее сообщение. -
    • Заполнение томов осуществляется по порядку (по возрастанию) до полного заполнения тома. Эту особенность можно использовать для временного отключения тома путем увеличения ему порядка заполнения. -
    • Уже созданному тому нельзя поменять пути. -
    • Созданный том нельзя удалить до тех пор, пока на него ссылаются какие-либо версии файлов. -
    • Ошибки доступа к томам помещаются в журнал регистрации и могут быть просмотрены администратором программы. -
    • В каждом томе файлы хранятся в подкаталогах по дате так, что на каждый день создается свой подкаталог. Все файлы в томах хранятся с оригинальным именем и расширением, между которыми добавляется номер версии, например "Приказ.1.txt". -
    • После переключения режима хранения файлов (например, в значение В томах на диске) все ранее накопленные файлы не перемещаются в тома - только вновь добавленные файлы будут размещаться в соответствии с настройкой. Для того чтобы перенести ранее накопленные файлы из информационной базы в тома, воспользуйтесь командой Перенос файлов в тома. -
    • Если используется синхронизация данных между программой-источником и программой-приемником и при этом в программе-источнике используется хранение файлов в томах на дисках, то в процессе создания начального образа необходимо будет создать архивный файл с томами хранимых файлов. -
    • В процессе получения начального образа в программу-приемник необходимо будет указать и расположение архивного файла с томами хранимых файлов. Для получения файлов в томах из архива выполните команду Разместить файлы начального образа.
    + +
  • Заполнение томов осуществляется по порядку (по возрастанию) до полного заполнения тома. Эту особенность можно использовать для временного отключения тома путем увеличения ему порядка заполнения. +
  • +
  • Уже созданному тому нельзя поменять пути. +
  • +
  • Созданный том нельзя удалить до тех пор, пока на него ссылаются какие-либо версии файлов. +
  • +
  • Ошибки доступа к томам помещаются в журнал регистрации и могут быть просмотрены администратором программы. +
  • +
  • В каждом томе файлы хранятся в подкаталогах по дате так, что на каждый день создается свой подкаталог. Все файлы в томах хранятся с оригинальным именем и расширением, между которыми добавляется номер версии, например "Приказ.1.txt". +
  • +
  • После переключения режима хранения файлов (например, в значение В томах на диске) все ранее накопленные файлы не перемещаются в тома - только вновь добавленные файлы будут размещаться в соответствии с настройкой. Для того чтобы перенести ранее накопленные файлы из информационной базы в тома, воспользуйтесь командой Перенос файлов в тома. +
  • +
  • Если используется синхронизация данных между программой-источником и программой-приемником и при этом в программе-источнике используется хранение файлов в томах на дисках, то в процессе создания начального образа необходимо будет создать архивный файл с томами хранимых файлов. +
  • +
  • В процессе получения начального образа в программу-приемник необходимо будет указать и расположение архивного файла с томами хранимых файлов. Для получения файлов в томах из архива выполните команду Разместить файлы начального образа.
  • Примечание
    Для использования томов, расположенных на сетевых дисках, сервер 1С:Предприятия 8 нужно запускать от лица доменного пользователя вида domain1\user1, имеющего права доступа к тому, указанному в виде UNC пути. Этот пользователь должен входить в группу Users локального компьютера,иметь права "Run as service" и "Run as batch job" и права на каталоги, в которых сервер 1С:Предприятия 8 хранит служебные файлы - журнал регистрации, каталог временных файлов и пр.

    См. также:

    \ No newline at end of file + +
  • Работа с формами.
  • \ No newline at end of file diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl index ab53e7119..2ef8b3bcf 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -40,7 +40,7 @@ // Только для внутреннего использования. // // Параметры: -// Запросы - Массив +// Запросы - Массив // Процедура ДобавитьЗапросыНаИспользованиеВнешнихРесурсовВсехТомов(Запросы) Экспорт @@ -72,7 +72,7 @@ // Только для внутреннего использования. // // Параметры: -// Запросы - Массив +// Запросы - Массив // Процедура ДобавитьЗапросыНаОтменуИспользованияВнешнихРесурсовВсехТомов(Запросы) Экспорт diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl index 7c26c9557..8f24e6567 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ObjectModule.bsl @@ -81,7 +81,8 @@ Если ИспользуютсяПрофилиБезопасности Тогда ШаблонОшибки = - НСтр("ru = 'Путь к тому некорректен. + НСтр("ru = 'Некорректный путь к тому или сервер с томом в данный момент недоступен. + |Проверьте корректность пути к общей папке и доступность сервера. |Возможно не настроены разрешения в профилях безопасности, |или учетная запись, от лица которой работает |сервер 1С:Предприятия, не имеет прав доступа к каталогу тома. @@ -89,7 +90,8 @@ |%1'"); Иначе ШаблонОшибки = - НСтр("ru = 'Путь к тому некорректен. + НСтр("ru = 'Некорректный путь к тому или сервер с томом в данный момент недоступен. + |Проверьте корректность пути к общей папке и доступность сервера. |Возможно учетная запись, от лица которой работает |сервер 1С:Предприятия, не имеет прав доступа к каталогу тома. | diff --git a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/ManagerModule.bsl index a9e668ee7..8243722ca 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/ManagerModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиСинхронизацииФайлов/ManagerModule.bsl @@ -14,7 +14,9 @@ // СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов -// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +// Возвращаемое значение: +// см. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов.ЗаблокированныеРеквизиты. +// Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт Результат = Новый Массив; diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl index 118d048c3..7aa0bf983 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl @@ -49,6 +49,8 @@ УстановитьПривилегированныйРежим(Ложь); КонецЕсли; + РаботаСПочтовымиСообщениямиСлужебный.ОбновитьНастройкиСервераВосстановленияПочты(ТекущийОбъект.Ссылка); + КонецПроцедуры &НаСервере @@ -632,7 +634,7 @@ Если ОбработчикиОжидания.Количество() > 0 Тогда ОписаниеОповещения = ОбработчикиОжидания[0]; ИмяПроцедуры = ОбработчикиОжидания[0].ИмяПроцедуры; - Форма = ОбработчикиОжидания[0].Модуль; + Форма = ОбработчикиОжидания[0].Модуль; // РасширениеУправляемойФормыДляСправочника ПараметрыЗаписи = ОбработчикиОжидания[0].ДополнительныеПараметры; ОбработчикиОжидания.Удалить(0); ПараметрыЗаписи.ОбработчикиПередЗаписью[ИмяПроцедуры] = Истина; diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl index a705d7086..70301d409 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -33,7 +33,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -193,25 +195,23 @@ // Начальное заполнение +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// +// Параметры: +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Ложь; КонецПроцедуры -// Вызывается при начальном заполнении справочника УчетныеЗаписиЭлектроннойПочты. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// справочника УчетныеЗаписиЭлектроннойПочты. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти // Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl index f493d1301..166bcfa07 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl @@ -82,6 +82,46 @@ КонецПроцедуры +Процедура ПриЗаписи(Отказ) + + Если ОбменДанными.Загрузка Тогда + Возврат; + КонецЕсли; + + УчетнаяЗаписьДляВосстановленияПароля = РаботаСПочтовымиСообщениямиСлужебный.НастройкиУчетнойЗаписиДляВосстановленияПароля(); + + Если УчетнаяЗаписьДляВосстановленияПароля.Используется + И УчетнаяЗаписьДляВосстановленияПароля.УчетнаяЗаписьПочты = Ссылка Тогда + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + + УстановитьПривилегированныйРежим(Истина); + Пароль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 2465f8bee..1f3a68d38 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form @@ -166,10 +166,6 @@ true - - <key>ru</key> - <value>Основная командная панель</value> - ОсновнаяКоманднаяПанельExtendedTooltip 11 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form index 924c06388..f2d7e005c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form @@ -55,10 +55,6 @@ true - - <key>ru</key> - <value>Заголовок</value> - ЗаголовокExtendedTooltip 48 @@ -82,10 +78,6 @@ ДеревоФайлов 31 - - <key>ru</key> - <value>Дерево файлов</value> - true true @@ -227,10 +219,6 @@ true - - <key>ru</key> - <value>Картинка и наименование</value> - КартинкаИНаименованиеExtendedTooltip 51 @@ -371,10 +359,6 @@ true - - <key>ru</key> - <value>Файлы</value> - ГруппаФайлыРасширеннаяПодсказка 47 @@ -571,10 +555,6 @@ true - - <key>ru</key> - <value>Реквизиты файлов</value> - РеквизитыФайловExtendedTooltip 57 @@ -664,10 +644,6 @@ true - - <key>ru</key> - <value>Кодировка</value> - ГруппаКодировкаExtendedTooltip 60 @@ -768,10 +744,6 @@ true - - <key>ru</key> - <value>Основная командная панель</value> - ОсновнаяКоманднаяПанельExtendedTooltip 63 diff --git a/SSL/src/Catalogs/Файлы/ManagerModule.bsl b/SSL/src/Catalogs/Файлы/ManagerModule.bsl index 54752f682..899a38ea6 100644 --- a/SSL/src/Catalogs/Файлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/Файлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -205,7 +207,7 @@ БлокировкаДанных.Заблокировать(); - ОбновляемыйФайл = Строка.Ссылка.ПолучитьОбъект(); + ОбновляемыйФайл = Строка.Ссылка.ПолучитьОбъект(); // СправочникОбъект.Файлы ОбновляемыйФайл.ДатаМодификацииУниверсальная = ОбновляемыйФайл.ТекущаяВерсия.ДатаМодификацииУниверсальная; ОбновляемыйФайл.ТипХраненияФайла = ОбновляемыйФайл.ТекущаяВерсия.ТипХраненияФайла; diff --git a/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl index 8d2cbc3dc..84986a83a 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl index 7b801ff4c..1e6335903 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ЗаполнитьПроизвольныеПараметры/Module.bsl @@ -93,6 +93,7 @@ КонецЕсли; ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(Реквизит.Имя, ОписаниеТипаПараметра,, Реквизит.Представление)); + КонецЦикла; КонецЕсли; diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl index 8a80abbb4..526a18def 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаСписка/Module.bsl @@ -26,9 +26,34 @@ // кнопки в группе, если одна кнопка, то группа не нужна Элементы.ФормаСоздатьШаблонСообщенияSMS.Видимость = ВключенаОтправкаSMS; Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Видимость = ВключенаРаботаСПочтовымиСообщениями; - Элементы.ФормаПоказыватьКонтекстныеШаблоны.Видимость = Пользователи.ЭтоПолноправныйПользователь(); + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОтправкаSMS") Тогда + + СпрятатьЭлементыКогдаНедоступнаОднаИзПодсистем(); + + Заголовок = НСтр("ru='Шаблоны сообщений электронных писем'"); + Элементы.ФормаСоздатьШаблонСообщенияSMS.Видимость = Ложь; + Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Заголовок = НСтр("ru='Создать'"); + ШаблонДля = ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем(); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, + "ШаблонДля", НСтр("ru = 'Электронного письма'"), ВидСравненияКомпоновкиДанных.Равно); + + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + + СпрятатьЭлементыКогдаНедоступнаОднаИзПодсистем(); + + Заголовок = НСтр("ru='Шаблоны SMS сообщений'"); + Элементы.ФормаСоздатьШаблонЭлектронногоПисьма.Видимость = Ложь; + Элементы.ФормаСоздатьШаблонСообщенияSMS.Заголовок = НСтр("ru='Создать'"); + ШаблонДля = ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS(); + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, + "ШаблонДля", НСтр("ru = 'Сообщения SMS'"), ВидСравненияКомпоновкиДанных.Равно); + + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -50,13 +75,9 @@ &НаКлиенте Процедура ШаблонДляФильтрОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - Если ВыбранноеЗначение = "SMS" Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Сообщения SMS'"), ВидСравненияКомпоновкиДанных.Равно); - ИначеЕсли ВыбранноеЗначение = "Email" Тогда - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Электронного письма'"), ВидСравненияКомпоновкиДанных.Равно); - Иначе - ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "ШаблонДля"); - КонецЕсли; + + УстановитьОтборВСпискеШаблонов(ВыбранноеЗначение); + КонецПроцедуры #КонецОбласти @@ -139,6 +160,19 @@ ОткрытьФорму("Справочник.ШаблоныСообщений.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры +&НаКлиенте +Процедура УстановитьОтборВСпискеШаблонов(Знач ВыбранноеЗначение) + + Если ВыбранноеЗначение = ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS() Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Сообщения SMS'"), ВидСравненияКомпоновкиДанных.Равно); + ИначеЕсли ВыбранноеЗначение = ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем() Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Список.Отбор, "ШаблонДля", НСтр("ru = 'Электронного письма'"), ВидСравненияКомпоновкиДанных.Равно); + Иначе + ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбора(Список.Отбор, "ШаблонДля"); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура УстановитьФильтрНазначение(Знач ВыбранноеЗначение) @@ -210,6 +244,16 @@ КонецПроцедуры +&НаСервере +Процедура СпрятатьЭлементыКогдаНедоступнаОднаИзПодсистем() + + Элементы.ШаблонДляФильтр.Видимость = Ложь; + Элементы.ШаблонДля.Видимость = Ложь; + АвтоЗаголовок = Ложь; + Элементы.ФормаГруппаСоздать.Вид = ВидГруппыФормы.ГруппаКнопок; + +КонецПроцедуры + &НаСервере Процедура УстановитьУсловноеОформление() diff --git a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl index e393c42a1..e6c03805e 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/Forms/ФормаЭлемента/Module.bsl @@ -1417,7 +1417,6 @@ Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл - ИмяФайла = ""; Расширение = ПолучитьРасширениеФайла(ВыбранныйФайл.Имя); НоваяСтрока = Вложения.Добавить(); diff --git a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl index 7c9466123..47fe52286 100644 --- a/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщений/ManagerModule.bsl @@ -16,7 +16,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ШаблоныСообщенийПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl index ec189d0e3..595f7cf7b 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -30,7 +30,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form new file mode 100644 index 000000000..7ee7dc333 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Form.form @@ -0,0 +1,579 @@ + + + + <key>ru</key> + <value>Выбор языков печатных форм</value> + + + КоманднаяПанель + 31 + + СписокВыбрать + 22 + true + true + + true + + + СписокВыбратьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + UsualButton + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + + Поиск + 24 + true + true + + true + + + СтрокаПоиска + + None + + OnChange + ПоискПриИзменении + + + ПоискРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + ПоискКонтекстноеМеню + 25 + true + + InputField + Enter + true + Left + true + + + AutoComplete + ПоискАвтоПодбор + + + Clearing + ПоискОчистка + + true + true + true + true + true + true + true + Normal + + ru + Найти... + + + + + КоманднаяПанельПраваяЧасть + 41 + + КомандыСПиска + 27 + true + true + + true + + + <key>ru</key> + <value>Команды с писка</value> + + + КомандыСПискаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + Item.Список + + + true + true + + true + + + <key>ru</key> + <value>Командная панель правая часть</value> + + + КоманднаяПанельПраваяЧастьРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + CommandBar + + Left + Form + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + Список + 1 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + None + Add + Change + Copy + Delete + EndEdit + MoveDown + MoveUp + ShowRowRearrangement + + СписокНаименование + 17 + true + true + + true + + + Список.Наименование + + + СписокНаименованиеРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокНаименованиеКонтекстноеМеню + 18 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + СписокКод + 33 + + <key>ru</key> + <value>Код локализации</value> + + true + true + + true + + + Список.Код + + + СписокКодРасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + СписокКодКонтекстноеМеню + 34 + true + + InputField + Auto + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + Selection + СписокВыбор + + + СписокСтрокаПоиска + 5 + + СписокСтрокаПоискаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 6 + true + + Список + + true + + + + СписокСостояниеПросмотра + 8 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 9 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 11 + + СписокУправлениеПоискомРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 12 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 2 + true + + true + true + true + true + MultiRow +
    true
    + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + true + true + true + true + AsFileRef + None + true + +
    + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + 50 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Список + + <key>ru</key> + <value>Список</value> + + 1 + + ValueTable + + + true + + + true + + + Код + + <key>ru</key> + <value>Код языка</value> + + 1 + + String + + + + true + + + true + + + + Наименование + + <key>ru</key> + <value>Язык</value> + + 2 + + String + + + + true + + + true + + + + СтрокаПоиска + 3 + + String + + + + true + + + true + + + + Страны + 4 + + String + + + + true + + + true + + + + + СтрокаПоиска + + <key>ru</key> + <value>Строка поиска</value> + + 2 + + String + + + + true + + + true + + + + Сворачивать + 3 + + Boolean + + + true + + + true + + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + + Выбрать + + + Auto + 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..13961bf26 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ПодборЯзыкаИзСпискаДоступных/Module.bsl @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ТекущийЭлемент = Элементы.Поиск; + Элементы.Список.МножественныйВыбор = Не ЗначениеЗаполнено(Параметры.Отбор); + + Если ЗначениеЗаполнено(Параметры.Отбор) Тогда + Отбор = СтрРазделить(Параметры.Отбор, "_", Истина)[0]; + Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Выбор региональных настроек для языка %1'"), + МультиязычностьСервер.ПредставлениеЯзыка(Отбор)); + КонецЕсли; + + ЗаполнитьСписокДоступныхЯзыков(Сворачивать); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ПоискОчистка(Элемент, СтандартнаяОбработка) + + УстановитьОтбор(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоискПриИзменении(Элемент) + + УстановитьОтбор(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Закрыть(ВыбранныеЯзыки()); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Выбрать(Команда) + + Закрыть(ВыбранныеЯзыки()); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ЗаполнитьСписокДоступныхЯзыков(Свернуть = Истина) + + Список.Очистить(); + + Отбор = СтрРазделить(Параметры.Отбор, "_", Истина)[0]; + + Для Каждого Язык Из ПолучитьДопустимыеКодыЛокализации() Цикл + Если ЗначениеЗаполнено(Отбор) И Не СтрНачинаетсяС(Язык, Отбор) Тогда + Продолжить; + КонецЕсли; + + Представление = ПредставлениеКодаЛокализации(Язык); + ЧастиСтроки = СтрРазделить(Представление, " ", Истина); + ЧастиСтроки[0] = ТРег(ЧастиСтроки[0]); + Представление = СтрСоединить(ЧастиСтроки, " "); + + Если СтрНайти(Язык, "_") И Свернуть Тогда + ОписаниеЯзыка = Список.НайтиСтроки(Новый Структура("Код", СтрРазделить(Язык, "_", Истина)[0]))[0]; + Представление = Сред(Представление, СтрДлина(ОписаниеЯзыка.Наименование) + 1); + + Страны = СтрРазделить(ОписаниеЯзыка.Страны, ",", Ложь); + + ПозицияНачала = СтрНайти(Представление, "("); + Если ПозицияНачала > 0 Тогда + ПозицияКонца = СтрНайти(Представление, ")", НаправлениеПоиска.СКонца); + Если ПозицияКонца > 0 Тогда + СписокСтранСтрокой = Сред(Представление, ПозицияНачала + 1, ПозицияКонца - ПозицияНачала - 1); + СтраныЯзыка = СтрРазделить(СписокСтранСтрокой, ",", Ложь); + Для Каждого Страна Из СтраныЯзыка Цикл + Страна = СокрЛП(Страна); + Если Страны.Найти(Страна) = Неопределено Тогда + Страны.Добавить(Страна); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + ОписаниеЯзыка.Страны = СтрСоединить(Страны, ","); + ОписаниеЯзыка.СтрокаПоиска = СтрокаПоиска(ОписаниеЯзыка.Наименование) + " " + ОписаниеЯзыка.Код + " " + СтрокаПоиска(ОписаниеЯзыка.Страны); + Иначе + ОписаниеЯзыка = Список.Добавить(); + ОписаниеЯзыка.Код = Язык; + ОписаниеЯзыка.Наименование = Представление; + ОписаниеЯзыка.СтрокаПоиска = СтрокаПоиска(ОписаниеЯзыка.Наименование) + " " + ОписаниеЯзыка.Код; + КонецЕсли; + + КонецЦикла; + + Для Каждого ОписаниеЯзыка Из Список Цикл + ОписаниеЯзыка.Страны = СтрЗаменить(ОписаниеЯзыка.Страны, ",", ", "); + КонецЦикла; + + Список.Сортировать("СтрокаПоиска"); + +КонецПроцедуры + +&НаСервере +Функция СтрокаПоиска(Строка) + Возврат СтрСоединить(СтрРазделить(Строка, "(), ", Ложь), " "); +КонецФункции + +&НаКлиенте +Функция ВыбранныеЯзыки() + + Результат = Новый Массив; + Для Каждого ВыделеннаяСтрока Из Элементы.Список.ВыделенныеСтроки Цикл + Результат.Добавить(Новый Структура("Код,Наименование", Список.НайтиПоИдентификатору(ВыделеннаяСтрока).Код, Список.НайтиПоИдентификатору(ВыделеннаяСтрока).Наименование)); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Процедура ПоискАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка) + + УстановитьОтбор(Текст); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОтбор(Текст = Неопределено); + + Если Текст = Неопределено Тогда + Текст = СтрокаПоиска; + КонецЕсли; + + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("СтрокаПоиска", Текст); + Элементы.Список.ОтборСтрок = Новый ФиксированнаяСтруктура(СтруктураОтбора); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss new file mode 100644 index 000000000..3c82ef846 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -0,0 +1,21 @@ + + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + + РеквизитДопУпорядочивания + Asc + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form new file mode 100644 index 000000000..43b309bcb --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Form.form @@ -0,0 +1,580 @@ + + + + СписокКомпоновщикНастроекПользовательскиеНастройки + 1 + true + true + + true + + + <key>ru</key> + <value>Группа пользовательских настроек</value> + + false + + СписокКомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + 2 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + Auto + Auto + + + + Список + 3 + + <key>ru</key> + <value>Список</value> + + true + true + + true + + + Список + + true + None + + Наименование + 16 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Наименование + + true + + НаименованиеРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + + НаименованиеКонтекстноеМеню + 17 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Код + 19 + true + true + + true + + + Список.Code + + + КодРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 20 + true + + LabelField + Enter + true + Left + true + + true + true + + + + Ссылка + 26 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 27 + true + + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 5 + Left + + + OnActivateRow + СписокПриАктивизацииСтроки + + + СписокСтрокаПоиска + 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 + + + OnGetDataAtServer + СписокПриПолученииДанныхНаСервере + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + СписокКомпоновщикНастроекПользовательскиеНастройки + +
    + + ГруппаАвтоматическийПеревод + 35 + + ВключитьАвтоматическийПеревод + 29 + + <key>ru</key> + <value>Автоперевод с помощью:</value> + + true + true + + true + + + ВключитьАвтоматическийПеревод + + Right + + OnChange + ВключитьАвтоматическийПереводПриИзменении + + + ВключитьАвтоматическийПереводРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + ВключитьАвтоматическийПереводКонтекстноеМеню + 30 + true + + CheckBoxField + Enter + true + Left + true + + + + Параметры + 37 + + <key>ru</key> + <value><настроить></value> + + true + true + + true + + + ПараметрыРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + ПараметрыКонтекстноеМеню + 38 + true + + Label + true + true + + + Click + ПараметрыНажатие + + true + Left + + + true + true + + true + + + <key>ru</key> + <value>Автоматический перевод</value> + + + ГруппаАвтоматическийПереводРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаСоздать + 22 + + <key>ru</key> + <value>Добавить язык</value> + + true + true + + true + + + ФормаСоздатьРасширеннаяПодсказка + 23 + Label + true + true + + Left + + + Form.Command.Создать + Auto + true + true + true + UserCmds + Auto + + + Группа1 + 24 + true + true + + true + + + Группа1РасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + Form + + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Change + Copy + Create + DontBlock + true + true + true + Vertical + true + true + true + auto + true + + Список + 1 + + DynamicList + + + true + + + true + + + Список.Ref + +
    true
    + + ВЫБРАТЬ + СправочникЯзыкиПечатныхФорм.Ссылка, + СправочникЯзыкиПечатныхФорм.ПометкаУдаления, + СправочникЯзыкиПечатныхФорм.Код, + ВЫРАЗИТЬ(NULL КАК СТРОКА(80)) КАК Наименование, + СправочникЯзыкиПечатныхФорм.РеквизитДопУпорядочивания, + СправочникЯзыкиПечатныхФорм.Предопределенный, + СправочникЯзыкиПечатныхФорм.ИмяПредопределенныхДанных +ИЗ + Справочник.ЯзыкиПечатныхФорм КАК СправочникЯзыкиПечатныхФорм + Catalog.ЯзыкиПечатныхФорм + true + true + true + true + true + +
    + + ВключитьАвтоматическийПеревод + + <key>ru</key> + <value>Включить автоматический перевод</value> + + 2 + + Boolean + + + true + + + true + + + + Переводчик + 3 + + EnumRef.СервисыПереводаТекста + + + true + + + true + + + + Создать + + <key>ru</key> + <value>Создать</value> + + 1 + + ru + Создать + + + 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..d6e90b901 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаСписка/Module.bsl @@ -0,0 +1,233 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + + + Элементы.ГруппаАвтоматическийПеревод.Видимость = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + ВключитьАвтоматическийПеревод = МодульПереводТекстаНаДругиеЯзыки.ДоступенПереводТекста(); + Элементы.ГруппаАвтоматическийПеревод.Видимость = Истина; + Переводчик = МодульПереводТекстаНаДругиеЯзыки.СервисПереводаТекста(); + Если ЗначениеЗаполнено(Переводчик) Тогда + Элементы.Параметры.Заголовок = Переводчик; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВключитьАвтоматическийПереводПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Переводчик) Или Не ВключитьАвтоматическийПеревод Тогда + УстановитьИспользованиеСервисаПереводаТекста(ВключитьАвтоматическийПеревод); + ИначеЕсли ВключитьАвтоматическийПеревод Тогда + ПерейтиКНастройкамПереводчика(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыНажатие(Элемент) + + ПерейтиКНастройкамПереводчика(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + // СтандартныеПодсистемы.ПодключаемыеКоманды + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект); + КонецЕсли; + // Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +КонецПроцедуры + +&НаСервереБезКонтекста +Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки) + + Для Каждого Строка Из Строки Цикл + Строка.Значение.Данные["Наименование"] = МультиязычностьСервер.ПредставлениеЯзыка(Строка.Значение.Данные["Код"]); + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Создать(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореЯзыка", ЭтотОбъект); + ОткрытьФорму("Справочник.ЯзыкиПечатныхФорм.Форма.ПодборЯзыкаИзСпискаДоступных", , ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// СтандартныеПодсистемы.ПодключаемыеКоманды +&НаКлиенте +Процедура Подключаемый_ВыполнитьКоманду(Команда) + МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент"); + МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Элементы.Список); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт + ВыполнитьКомандуНаСервере(ПараметрыВыполнения); +КонецПроцедуры + +&НаСервере +Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения) + МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды"); + МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Элементы.Список); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ОбновитьКоманды() + МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер"); + МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Элементы.Список); +КонецПроцедуры + +// Конец СтандартныеПодсистемы.ПодключаемыеКоманды + +// Параметры: +// ВыбранныеЯзыки - Массив из Структура: +// * Код - Строка +// * Наименование - Строка +// +&НаКлиенте +Процедура ПриВыбореЯзыка(ВыбранныеЯзыки, ДополнительныеПараметры) Экспорт + + Если ВыбранныеЯзыки = Неопределено Тогда + Возврат; + КонецЕсли; + + ДобавленныеЯзыки = ДобавитьЯзыки(ВыбранныеЯзыки); + ОбщегоНазначенияКлиент.ОповеститьОбИзмененииОбъектов(ДобавленныеЯзыки); + Элементы.Список.ТекущаяСтрока = ДобавленныеЯзыки[0]; + Элементы.Список.ВыделенныеСтроки.Очистить(); + Для Каждого Язык Из ДобавленныеЯзыки Цикл + Элементы.Список.ВыделенныеСтроки.Добавить(Язык); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ДобавитьЯзыки(ВыбранныеЯзыки) + + Результат = Новый Массив; + Для Каждого ОписаниеЯзыка Из ВыбранныеЯзыки Цикл + ЯзыкСсылка = Справочники.ЯзыкиПечатныхФорм.НайтиПоКоду(ОписаниеЯзыка.Код); + Если ЗначениеЗаполнено(ЯзыкСсылка) Тогда + ЯзыкОбъект = ЯзыкСсылка.ПолучитьОбъект(); + Иначе + ЯзыкОбъект = Справочники.ЯзыкиПечатныхФорм.СоздатьЭлемент(); + КонецЕсли; + ЗаполнитьЗначенияСвойств(ЯзыкОбъект, ОписаниеЯзыка); + ЯзыкОбъект.ПометкаУдаления = Ложь; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ЯзыкиПечатныхФорм"); + ЭлементБлокировки.УстановитьЗначение("Код", ЯзыкОбъект.Код); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + ЯзыкОбъект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Результат.Добавить(ЯзыкОбъект.Ссылка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Процедура УстановитьИспользованиеСервисаПереводаТекста(Использовать); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + МодульПереводТекстаНаДругиеЯзыки.УстановитьИспользованиеСервисаПереводаТекста(Использовать); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиКНастройкамПереводчика() + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииНастройки", ЭтотОбъект); + ОткрытьФорму("ОбщаяФорма.НастройкаПереводаТекста", , ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииНастройки(Знач ВыбранныйПереводчик, ДополнительныеПараметры) Экспорт + + Если ВыбранныйПереводчик = Неопределено Тогда + ВыбранныйПереводчик = ТекущийПереводчик(); + КонецЕсли; + + Если ВключитьАвтоматическийПеревод Тогда + Если Не ЗначениеЗаполнено(ВыбранныйПереводчик) Тогда + ВключитьАвтоматическийПеревод = Ложь; + КонецЕсли; + УстановитьИспользованиеСервисаПереводаТекста(ВключитьАвтоматическийПеревод); + КонецЕсли; + + Переводчик = ВыбранныйПереводчик; + + Если ЗначениеЗаполнено(Переводчик) Тогда + Элементы.Параметры.Заголовок = Переводчик; + Иначе + Элементы.Параметры.Заголовок = НСтр("ru = '<настроить>'"); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ТекущийПереводчик() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Возврат МодульПереводТекстаНаДругиеЯзыки.СервисПереводаТекста(); + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Form.form new file mode 100644 index 000000000..040cf1ed8 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Form.form @@ -0,0 +1,157 @@ + + + + Язык + 4 + true + true + + true + + + Язык + + + ЯзыкРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ЯзыкКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + + StartChoice + ЯзыкНачалоВыбора + + true + true + true + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + Код + 1 + true + true + + true + + + Объект.Code + + + КодРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + КодКонтекстноеМеню + 2 + true + + InputField + Show + + ru + Изменение кода локализации вручную не рекомендуется + + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + ФормаКоманднаяПанель + -1 + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + CatalogObject.ЯзыкиПечатныхФорм + + + true + + + true + +
    true
    + true +
    + + Язык + + <key>ru</key> + <value>Язык</value> + + 2 + + String + + + + true + + + true + + + + + + + +
    diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Module.bsl new file mode 100644 index 000000000..b2ede49d3 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/Forms/ФормаЭлемента/Module.bsl @@ -0,0 +1,54 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Объект.Код) Тогда + Язык = МультиязычностьСервер.ПредставлениеЯзыка(Объект.Код); + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ЯзыкНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриВыбореЯзыка", ЭтотОбъект); + ОткрытьФорму("Справочник.ЯзыкиПечатныхФорм.Форма.ПодборЯзыкаИзСпискаДоступных", Новый Структура("Отбор", Объект.Код), ЭтотОбъект, , , , ОписаниеОповещения); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// ВыбранныеЯзыки - Массив из Структура: +// * Код - Строка +// * Наименование - Строка +// +&НаКлиенте +Процедура ПриВыбореЯзыка(ВыбранныеЯзыки, ДополнительныеПараметры) Экспорт + + Если Не ЗначениеЗаполнено(ВыбранныеЯзыки) Тогда + Возврат; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Объект, ВыбранныеЯзыки[0]); + Язык = ВыбранныеЯзыки[0].Наименование; + Модифицированность = Истина; + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl new file mode 100644 index 000000000..e2e6575da --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ManagerModule.bsl @@ -0,0 +1,105 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ЗаполнитьПоставляемыеЯзыки() Экспорт + + Для Каждого КодЯзыка Из СтандартныеПодсистемыСервер.ЯзыкиКонфигурации() Цикл + + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ЯзыкиПечатныхФорм"); + ЭлементБлокировки.УстановитьЗначение("Код", КодЯзыка); + Блокировка.Заблокировать(); + + Если Не ЗначениеЗаполнено(Справочники.ЯзыкиПечатныхФорм.НайтиПоКоду(КодЯзыка)) Тогда + Язык = Справочники.ЯзыкиПечатныхФорм.СоздатьЭлемент(); + Язык.Код = КодЯзыка; + Язык.Записать(); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ДоступныеЯзыки(СРегиональнымиНастройками = Ложь) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | ЯзыкиПечатныхФорм.Код КАК Код + |ИЗ + | Справочник.ЯзыкиПечатныхФорм КАК ЯзыкиПечатныхФорм + |ГДЕ + | НЕ ЯзыкиПечатныхФорм.ПометкаУдаления + | + |УПОРЯДОЧИТЬ ПО + | ЯзыкиПечатныхФорм.РеквизитДопУпорядочивания, + | ЯзыкиПечатныхФорм.Ссылка"; + + Запрос = Новый Запрос(ТекстЗапроса); + Языки = Запрос.Выполнить().Выгрузить(); + + Если Не СРегиональнымиНастройками Тогда + Для Каждого Язык Из Языки Цикл + Язык.Код = СтрРазделить(Язык.Код, "_", Истина)[0]; + КонецЦикла; + Языки.Свернуть("Код"); + КонецЕсли; + + Возврат Языки.ВыгрузитьКолонку("Код"); + +КонецФункции + +Функция ДополнительныеЯзыкиПечатныхФорм() Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | ЯзыкиПечатныхФорм.Код КАК КодЯзыка + |ИЗ + | Справочник.ЯзыкиПечатныхФорм КАК ЯзыкиПечатныхФорм + |ГДЕ + | НЕ ЯзыкиПечатныхФорм.ПометкаУдаления + | И НЕ ЯзыкиПечатныхФорм.Код В (&ЯзыкиКонфигурации) + | + |УПОРЯДОЧИТЬ ПО + | ЯзыкиПечатныхФорм.РеквизитДопУпорядочивания"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("ЯзыкиКонфигурации", СтандартныеПодсистемыСервер.ЯзыкиКонфигурации()); + + Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("КодЯзыка"); + +КонецФункции + +Функция ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка) Экспорт + + Если Не ЗначениеЗаполнено(КодЯзыка) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат СтандартныеПодсистемыСервер.ЯзыкиКонфигурации().Найти(КодЯзыка) = Неопределено; + +КонецФункции + +#КонецОбласти + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ObjectModule.bsl b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo new file mode 100644 index 000000000..c8d70e035 --- /dev/null +++ b/SSL/src/Catalogs/ЯзыкиПечатныхФорм/ЯзыкиПечатныхФорм.mdo @@ -0,0 +1,167 @@ + + + + + + + + + + ЯзыкиПечатныхФорм + + ru + Языки печатных форм + + true + Catalog.ЯзыкиПечатныхФорм.StandardAttribute.Code + DontUse + + Use + PredefinedDataName + + Use + + + + + Use + Predefined + + Use + + + + + Use + Ref + + Use + + + + + Use + DeletionMark + + Use + + + + + Use + IsFolder + + Use + + + + + Use + Owner + true + + ShowError + Use + + + + + Use + Parent + true + + Use + + + + + Use + Description + + ShowError + Use + + + + + Use + Code + + ru + Код локализации + + + Use + + + + Use + Catalog.ЯзыкиПечатныхФорм.StandardAttribute.Code + Managed + Use + + ru + Язык + + 2 + true + 13 + String + Variable + true + InDialog + BothWays + Catalog.ЯзыкиПечатныхФорм.Form.ФормаЭлемента + Catalog.ЯзыкиПечатныхФорм.Form.ФормаСписка + + РеквизитДопУпорядочивания + + ru + Порядок + + + Number + + 5 + + + + ru + Используется для упорядочивания (служебный) + + + + + 0 + + IndexWithAdditionalOrder + Use + + + ФормаСписка + + ru + Форма списка + + PersonalComputer + MobileDevice + + + ПодборЯзыкаИзСпискаДоступных + + ru + Подбор языка из списка доступных + + PersonalComputer + MobileDevice + + + ФормаЭлемента + + ru + Форма элемента + + PersonalComputer + MobileDevice + + diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl index ca3268fe4..8f32296e0 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl index 623409d61..f313f3fc1 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl @@ -64,7 +64,10 @@ Элементы.ЗаполнитьИдентификаторДляФормул.Доступность = НЕ Элементы.ИдентификаторДляФормул.ТолькоПросмотр; - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; ТекущийЗаголовок = Объект.Заголовок; @@ -229,6 +232,10 @@ ТекущийОбъект.Имя = ТекущийОбъект.Имя + ВРег(Лев(ЧастьЗаголовка, 1)) + Сред(ЧастьЗаголовка, 2); КонецЦикла; + Если ИмяНачинаетсяСЦифры(ТекущийОбъект.Имя) Тогда + ТекущийОбъект.Имя = "_" + ТекущийОбъект.Имя; + КонецЕсли; + УИД = Новый УникальныйИдентификатор(); СтрокаУИД = СтрЗаменить(Строка(УИД), "-", ""); ТекущийОбъект.Имя = ТекущийОбъект.Имя + "_" + СтрокаУИД; @@ -247,7 +254,10 @@ ТекущийОбъект.ДополнительныеСвойства.Вставить("ПроверкаИдентификатораДляФормулВыполнена"); КонецЕсли; - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -301,7 +311,10 @@ // Обработчик подсистемы запрета редактирования реквизитов объектов. ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект); - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; ОбновитьСоставЭлементовФормы(); @@ -385,7 +398,10 @@ КонецЕсли; // Конец СтандартныеПодсистемы.УправлениеДоступом - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецПроцедуры @@ -510,7 +526,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -615,7 +636,6 @@ Если ПереданныеПараметрыФормы.Перетаскивание Тогда Результат.Вставить("Перетаскивание", Истина); КонецЕсли; - КонвертироватьДополнительныйРеквизитВОбщий(); ОповеститьОВыборе(Результат); Возврат; КонецЕсли; @@ -794,7 +814,7 @@ &НаСервереБезКонтекста Функция ЗаголовокДляФормированияИдентификатора(Знач Заголовок, Знач Представления) - Если ТекущийЯзык() <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда + Если ТекущийЯзык().КодЯзыка <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда Отбор = Новый Структура(); Отбор.Вставить("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка()); НайденныеСтроки = Представления.НайтиСтроки(Отбор); @@ -1022,35 +1042,6 @@ КонецПроцедуры -&НаСервере -Процедура КонвертироватьДополнительныйРеквизитВОбщий() - Возврат; - - ВыбранныйРеквизит = ПереданныеПараметрыФормы.ВладелецДополнительныхЗначений; // ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - НаборСвойств = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВыбранныйРеквизит, "НаборСвойств"); - Если Не ЗначениеЗаполнено(НаборСвойств) Тогда - Возврат; - КонецЕсли; - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); - ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыбранныйРеквизит); - Блокировка.Заблокировать(); - - ВыбранныйРеквизитОбъект = ВыбранныйРеквизит.ПолучитьОбъект(); - ВыбранныйРеквизитОбъект.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.ПустаяСсылка(); - ВыбранныйРеквизитОбъект.Наименование = ВыбранныйРеквизитОбъект.Заголовок; - ВыбранныйРеквизитОбъект.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; -КонецПроцедуры - &НаСервере Процедура ЗаполнитьКарточкуРеквизитаИлиСведения() @@ -2204,7 +2195,6 @@ ЗаданаЗависимостьДоступности = Ложь; ЗаданаЗависимостьОбязательностиЗаполнения = Ложь; ЗаданаЗависимостьВидимости = Ложь; - ЗависимостиСвойств = Объект.ЗависимостиДополнительныхРеквизитов; ОтборПоНабору = Новый Структура; ОтборПоНабору.Вставить("НаборСвойств", ТекущийНаборСвойств); @@ -2569,7 +2559,7 @@ &НаСервереБезКонтекста Функция НаименованиеУжеИспользуется(Знач Заголовок, Знач ТекущееСвойство, Знач НаборСвойств, НовоеНаименование, Знач Представления) - Если ТекущийЯзык() <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда + Если ТекущийЯзык().КодЯзыка <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда Отбор = Новый Структура(); Отбор.Вставить("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка()); НайденныеСтроки = Представления.НайтиСтроки(Отбор); @@ -2647,6 +2637,16 @@ &НаСервереБезКонтекста Функция ИмяУжеИспользуется(Знач Имя, Знач ТекущееСвойство, НовоеНаименование) + НовоеИмя = Имя; + УправлениеСвойствамиСлужебный.УдалитьНедопустимыеСимволы(НовоеИмя); + Если НовоеИмя <> Имя + Или ИмяНачинаетсяСЦифры(Имя) + Или СтрРазделить(НовоеИмя, " ", Истина).Количество() > 1 Тогда + + ТекстВопроса = НСтр("ru = 'Имя (группа Для разработчиков) должно состоять из одного слова, начинаться с буквы и не содержать специальных символов, кроме «_».'"); + Возврат ТекстВопроса; + КонецЕсли; + Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 @@ -2694,6 +2694,16 @@ КонецФункции +&НаСервереБезКонтекста +Функция ИмяНачинаетсяСЦифры(ИмяРеквизита) + ПервыйСимвол = Лев(ИмяРеквизита, 1); + Если СтрНайти("0123456789", ПервыйСимвол) > 0 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; +КонецФункции + &НаСервереБезКонтекста Функция ИдентификаторДляФормулУжеИспользуется(Знач ИдентификаторДляФормул, Знач ТекущееСвойство) diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl index aebaab451..1b225884d 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -39,7 +39,9 @@ // СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов -// См. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. +// Возвращаемое значение: +// см. ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов.ЗаблокированныеРеквизиты. +// Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт Результат = Новый Массив; @@ -56,7 +58,9 @@ // СтандартныеПодсистемы.УправлениеДоступом -// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +// Параметры: +// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +// Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт Ограничение.Текст = @@ -98,7 +102,19 @@ КонецПроцедуры Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка, "Заголовок"); + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка, "Заголовок"); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка, "Заголовок"); + КонецЕсли; +#КонецЕсли + Если Не ЗначениеЗаполнено(Представление) Тогда Представление = Данные.Заголовок; КонецЕсли; @@ -120,9 +136,9 @@ // Проверяет уникальность идентификатора, а также соответствие идентификатора правилам написания // // Параметры: -// ИдентификаторДляФормул - Строка - идентификатор для формул. -// Ссылка - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на текущий объект. -// Отказ - Булево - флаг отказа при наличии ошибки. +// ИдентификаторДляФормул - Строка - идентификатор для формул. +// Ссылка - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на текущий объект. +// Отказ - Булево - флаг отказа при наличии ошибки. // Процедура ПроверитьУникальностьИдентификатора(ИдентификаторДляФормул, Ссылка, Отказ) Экспорт @@ -198,10 +214,10 @@ // Возвращает уникальный идентификатора для формул (после проверки на уникальность) // // Параметры: -// ПредставлениеОбъекта - Строка - представление, из которого будет сформирован идентификатор для формул. -// СсылкаНаТекущийОбъект - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на текущий элемент. +// ПредставлениеОбъекта - Строка - представление, из которого будет сформирован идентификатор для формул. +// СсылкаНаТекущийОбъект - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на текущий элемент. // Возвращаемое значение: -// Строка - уникальное значение идентификатора для формул. +// Строка - уникальное значение идентификатора для формул. // Функция УникальныйИдентификаторДляФормул(ПредставлениеОбъекта, СсылкаНаТекущийОбъект) Экспорт diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl index e2093f4e3..c332d7e10 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ObjectModule.bsl @@ -93,7 +93,7 @@ "ВЫБРАТЬ | Наборы.Ссылка КАК Ссылка |ИЗ - | %1 КАК Свойства + | &ИмяТаблицы КАК Свойства | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НаборыДополнительныхРеквизитовИСведений КАК Наборы | ПО (Свойства.Ссылка = Наборы.Ссылка) |ГДЕ @@ -104,7 +104,7 @@ Иначе ИмяТаблицы = "Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты"; КонецЕсли; - Запрос.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Запрос.Текст, ИмяТаблицы); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицы", ИмяТаблицы); Запрос.УстановитьПараметр("Свойство", Ссылка); Запрос.УстановитьПараметр("ПометкаУдаления", СвойстваОбъекта.ПометкаУдаления); @@ -186,7 +186,11 @@ #Область СлужебныйПрограммныйИнтерфейс Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры #КонецОбласти diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Module.bsl index 32ee7e880..9f47b390f 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Module.bsl @@ -11,7 +11,10 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Module.bsl index f171303a1..c65bc1d08 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Module.bsl @@ -11,23 +11,41 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - МультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриСозданииНаСервере(ЭтотОбъект, Объект); + КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ТекущийОбъект); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) - МультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -36,7 +54,12 @@ &НаКлиенте Процедура Подключаемый_Открытие(Элемент, СтандартнаяОбработка) - МультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + МодульМультиязычностьКлиент.ПриОткрытии(ЭтотОбъект, Объект, Элемент, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl index 4f6bc995a..b25ccc4c3 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ManagerModule.bsl @@ -18,7 +18,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт @@ -43,7 +43,11 @@ Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) - МультиязычностьСервер.ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка, Метаданные.ПланыВидовХарактеристик.ОбъектыАдресацииЗадач); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ОбработкаПолученияДанныхВыбора( + ДанныеВыбора, Параметры, СтандартнаяОбработка, Метаданные.ПланыВидовХарактеристик.ОбъектыАдресацииЗадач); + КонецЕсли; КонецПроцедуры @@ -51,13 +55,33 @@ Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); + КонецЕсли; + #Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) - МультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#Иначе + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиентСервер"); + МодульМультиязычностьКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); + КонецЕсли; +#КонецЕсли КонецПроцедуры @@ -67,52 +91,46 @@ #Область СлужебныйПрограммныйИнтерфейс -// Определяет настройки начального заполнения элементов -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов +// // Параметры: -// Настройки - Структура: -// * ПриНачальномЗаполненииЭлемента - Булево - если Истина, то для каждого элемента будет -// вызвана процедура индивидуального заполнения ПриНачальномЗаполненииЭлемента. -// +// Настройки - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов.Настройки +// Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт Настройки.ПриНачальномЗаполненииЭлемента = Истина; КонецПроцедуры -// Вызывается при начальном заполнении объектов адресации задач. -// Стандартный реквизит ТипЗначения заполняется в процедуре ПриНачальномЗаполненииЭлемента. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов +// // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. -// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов -// объекта ПВХ ОбъектыАдресацииЗада. -// ТабличныеЧасти - Структура - описание табличных частей объекта, где: -// * Ключ - Строка - имя табличной части; -// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой -// необходимо скопировать перед заполнением. Например: -// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); -// ЭлементТЧ = Элемент.Ключи.Добавить(); -// ЭлементТЧ.ИмяКлюча = "Первичный"; -// +// КодыЯзыков - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.КодыЯзыков +// Элементы - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.Элементы +// ТабличныеЧасти - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов.ТабличныеЧасти +// Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт Элемент = Элементы.Добавить(); Элемент.ИмяПредопределенныхДанных = "ВсеОбъектыАдресации"; - МультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", - "ru='Все объекты адресации'", КодыЯзыков); // @НСтр + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ЗаполнитьМультиязычныйРеквизит(Элемент, "Наименование", + "ru='Все объекты адресации'", КодыЯзыков); // @НСтр-2 + КонецЕсли; БизнесПроцессыИЗадачиПереопределяемый.ПриНачальномЗаполненииОбъектовАдресацииЗадач(КодыЯзыков, Элементы, ТабличныеЧасти); КонецПроцедуры -// Вызывается при начальном заполнении создаваемого объекта адресации задач. -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлемента +// // Параметры: -// Объект - ПланВидовХарактеристикОбъект.ОбъектыАдресацииЗадач - заполняемый объект. -// Данные - СтрокаТаблицыЗначений - данные заполнения. -// ДополнительныеПараметры - Структура -// +// Объект - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлемента.Объект +// Данные - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлемента.Данные +// ДополнительныеПараметры - см. ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлемента.ДополнительныеПараметры +// Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт БизнесПроцессыИЗадачиПереопределяемый.ПриНачальномЗаполненииЭлементаОбъектаАдресацииЗадачи(Объект, Данные, ДополнительныеПараметры); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl index aa9279780..cddba4602 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/ObjectModule.bsl @@ -12,7 +12,10 @@ Процедура ПриЧтенииПредставленийНаСервере() Экспорт - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ЭтотОбъект); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl index eb48a0011..5b031ba86 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/РазделыДатЗапретаИзменения/ManagerModule.bsl @@ -17,7 +17,7 @@ // Возвращает реквизиты справочника, которые образуют естественный ключ для элементов справочника. // // Возвращаемое значение: -// Массив Из Строка - массив имен реквизитов, образующих естественный ключ. +// Массив из Строка - массив имен реквизитов, образующих естественный ключ. // Функция ПоляЕстественногоКлюча() Экспорт diff --git a/SSL/src/CommonCommands/ПредупрежденияПриЗавершенииРаботы/CommandModule.bsl b/SSL/src/CommonCommands/ПредупрежденияПриЗавершенииРаботы/CommandModule.bsl index cb14f2a42..35453414f 100644 --- a/SSL/src/CommonCommands/ПредупрежденияПриЗавершенииРаботы/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПредупрежденияПриЗавершенииРаботы/CommandModule.bsl @@ -11,21 +11,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - Параметры = Новый Структура; - - // Внешние параметры описания результата. - Параметры.Вставить("Отказ", Ложь); - Параметры.Вставить("Предупреждения", СтандартныеПодсистемыКлиент.ПараметрКлиента("ПредупрежденияПриЗавершенииРаботы")); - - // Внешние параметры управления выполнением. - Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. - Параметры.Вставить("НепрерывноеВыполнение", Истина); - - // Внутренние параметры. - Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( - "ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения", СтандартныеПодсистемыКлиент, Параметры)); - + Параметры = СтандартныеПодсистемыКлиент.ПараметрыДействийПередЗавершениемРаботыСистемы(); СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Параметры); КонецПроцедуры diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Form.form b/SSL/src/CommonForms/АвтономнаяРабота/Form.form index 72c456f7f..7c9118cb4 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРабота/Form.form @@ -774,10 +774,6 @@ true - - <key>ru</key> - <value>Настройка автоматической синхронизации</value> - НастройкаАвтоматическойСинхронизацииExtendedTooltip 86 @@ -1129,10 +1125,6 @@ true - - <key>ru</key> - <value>Автономная работа</value> - АвтономнаяРаботаExtendedTooltip 68 diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form index d78e50a4f..5bba811ec 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form @@ -959,10 +959,6 @@ СписокАвтономныхРабочихМест 78 - - <key>ru</key> - <value>Список автономных рабочих мест</value> - true true @@ -1222,10 +1218,6 @@ true - - <key>ru</key> - <value>Список автономных рабочих мест группа 3</value> - СписокАвтономныхРабочихМестГруппа3ExtendedTooltip 157 @@ -1300,10 +1292,6 @@ true - - <key>ru</key> - <value>Список автономных рабочих мест группа 1</value> - СписокАвтономныхРабочихМестГруппа1ExtendedTooltip 159 @@ -1378,10 +1366,6 @@ true - - <key>ru</key> - <value>Список автономных рабочих мест группа 2</value> - СписокАвтономныхРабочихМестГруппа2ExtendedTooltip 162 @@ -1684,10 +1668,6 @@ true - - <key>ru</key> - <value>Список автономных рабочих мест группа 4</value> - СписокАвтономныхРабочихМестГруппа4ExtendedTooltip 151 @@ -1785,10 +1765,6 @@ true - - <key>ru</key> - <value>Автономная работа</value> - true АвтономнаяРаботаExtendedTooltip diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl index 44304ba0f..4ca4f344c 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl @@ -142,10 +142,10 @@ Процедура КакНастроитьАвтономноеРабочееМесто(Команда) ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ИмяМакета", "ИнструкцияПоНастройкеАвтономногоРабочегоМеста"); + ПараметрыФормы.Вставить("ИмяМакета", "ИнструкцияПоНастройкеАРМ"); ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Как настроить автономное рабочее место'")); - ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтотОбъект, "ИнструкцияПоНастройкеАвтономногоРабочегоМеста"); + ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтотОбъект, "ИнструкцияПоНастройкеАРМ"); КонецПроцедуры diff --git a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl index 9873c59d6..c6559432d 100644 --- a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl +++ b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl @@ -34,8 +34,25 @@ &НаКлиенте Процедура ОК(Команда) - ПарольПользователяСервиса = Пароль; - Закрыть(ПарольПользователяСервиса); + ТекстОшибки = ""; + + Если ТипЗнч(ЭтотОбъект.ОписаниеОповещенияОЗакрытии) = Тип("ОписаниеОповещения") Тогда + ПарольПользователяСервиса = Пароль; + Попытка + ВыполнитьОбработкуОповещения(ЭтотОбъект.ОписаниеОповещенияОЗакрытии, ПарольПользователяСервиса); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ЗаписатьОшибкуВЖурнал(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке) + Символы.ПС + + НСтр("ru = 'Возможно пароль введен неверно, повторите ввод пароля.'"); + КонецПопытки; + КонецЕсли; + + Закрыть(); + + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ПоказатьПредупреждение(, ТекстОшибки); + КонецЕсли; КонецПроцедуры @@ -46,4 +63,17 @@ КонецПроцедуры -#КонецОбласти \ No newline at end of file +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервереБезКонтекста +Процедура ЗаписатьОшибкуВЖурнал(ТекстОшибки) + + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); + +КонецПроцедуры + +#КонецОбласти diff --git a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form index 416289453..78c232cdf 100644 --- a/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form +++ b/SSL/src/CommonForms/БлокировкаРаботыСВнешнимиРесурсами/Form.form @@ -236,10 +236,6 @@ true - - <key>ru</key> - <value>Командная панель</value> - ГруппаКоманднаяПанельРасширеннаяПодсказка 28 @@ -318,10 +314,6 @@ true - - <key>ru</key> - <value>Командная панель параметры</value> - ГруппаКоманднаяПанельПараметрыРасширеннаяПодсказка 33 @@ -403,10 +395,6 @@ true - - <key>ru</key> - <value>Параметры формы</value> - ГруппаПараметрыФормыРасширеннаяПодсказка 19 diff --git a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form index ac1957bcd..f8321fd72 100644 --- a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form +++ b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Form.form @@ -1,5 +1,71 @@ - + + + КоманднаяПанель + 9 + + Перевести + 11 + + <key>ru</key> + <value>Перевести автоматически</value> + + true + true + + true + + + ПеревестиРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + UsualButton + Form.Command.Перевести + Normal + PictureAndText + true + true + UserCmds + + CommonPicture.ЗаполнитьФорму + + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + ГруппаЯзыки 5 @@ -190,6 +256,20 @@ true + + ФормаРедактирования + 5 + + String + + + + true + + + true + + МультиязычныеСтрокиВРеквизитах @@ -226,6 +306,28 @@ Auto Auto
    + + Перевести + + <key>ru</key> + <value>Перевести</value> + + 2 + + ru + Перевести + + + true + + + + Перевести + + + Auto + Auto + Заголовок diff --git a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl index a15a7d510..32ce7446e 100644 --- a/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl +++ b/SSL/src/CommonForms/ВводНаРазныхЯзыках/Module.bsl @@ -76,8 +76,17 @@ Иначе + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ПриЗаполненииНабораЯзыков(НаборЯзыков); + КонецЕсли; + Для Каждого ЯзыкКонфигурации Из Метаданные.Языки Цикл + Если НаборЯзыков.НайтиСтроки(Новый Структура("КодЯзыка", ЯзыкКонфигурации.КодЯзыка)).Количество() > 0 Тогда + Продолжить; + КонецЕсли; + НовыйЯзык = НаборЯзыков.Добавить(); НовыйЯзык.КодЯзыка = ЯзыкКонфигурации.КодЯзыка; НовыйЯзык.Представление = ЯзыкКонфигурации.Представление(); @@ -166,6 +175,13 @@ КонецЦикла; КонецЕсли; + Элементы.Перевести.Видимость = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Элементы.Перевести.Видимость = МодульПереводТекстаНаДругиеЯзыки.ДоступенПереводТекста() + И Не Параметры.ТолькоПросмотр И Не ТолькоПросмотр; + КонецЕсли; + КонецПроцедуры #КонецОбласти @@ -180,9 +196,12 @@ Возврат; КонецЕсли; - Результат = Новый Структура("ОсновнойЯзык", ОсновнойЯзык); - Результат.Вставить("ЗначенияНаРазныхЯзыках", Новый Массив); + Результат = Новый Структура; + + Результат.Вставить("ОсновнойЯзык", ОсновнойЯзык); Результат.Вставить("ХранениеВТабличнойЧасти", Не МультиязычныеСтрокиВРеквизитах); + Результат.Вставить("Модифицированность", Модифицированность); + Результат.Вставить("ЗначенияНаРазныхЯзыках", Новый Массив); Для каждого Язык Из Языки Цикл @@ -206,6 +225,13 @@ КонецПроцедуры +&НаКлиенте +Процедура Перевести(Команда) + + ПеревестиНаСервере(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -234,11 +260,18 @@ КонецЕсли; Элемент.ПутьКДанным = ЯзыкКонфигурации.Имя; - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.Ширина = 40; - Элемент.МногострочныйРежим = МногострочныйРежим; - Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; - Элемент.ТолькоПросмотр = ТолькоПросмотр; + + Если ЗначениеЗаполнено(ЯзыкКонфигурации.ФормаРедактирования) Тогда + Элемент.Вид = ВидПоляФормы.ПолеНадписи; + Элемент.Гиперссылка = Истина; + Элемент.УстановитьДействие("Нажатие", "Подключаемый_Нажатие"); + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.Ширина = 40; + Элемент.МногострочныйРежим = МногострочныйРежим; + Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; + Элемент.ТолькоПросмотр = ТолькоПросмотр; + КонецЕсли; КонецЦикла; @@ -257,5 +290,49 @@ КонецФункции +&НаСервере +Процедура ПеревестиНаСервере() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Иначе + Возврат; + КонецЕсли; + + ЗначениеДляПеревода = Языки[0]; + ИсходныйЯзык = СтрРазделить(ЗначениеДляПеревода.КодЯзыка, "_", Ложь)[0]; + ПредставлениеНаИсходномЯзыке = ЭтотОбъект[ЗначениеДляПеревода.Имя]; + + ДоступныеЯзыки = МодульПереводТекстаНаДругиеЯзыки.ДоступныеЯзыки(); + Если ДоступныеЯзыки.НайтиПоЗначению(ИсходныйЯзык) = Неопределено Тогда + Возврат; + КонецЕсли; + + Для Индекс = 1 По Языки.Количество() - 1 Цикл + СтрокаТаблицы = Языки[Индекс]; + ЯзыкПеревода = СтрРазделить(СтрокаТаблицы.КодЯзыка, "_", Ложь)[0]; + Если ДоступныеЯзыки.НайтиПоЗначению(ЯзыкПеревода) = Неопределено Тогда + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ЭтотОбъект[СтрокаТаблицы.Имя]) Тогда + Элементы[СтрокаТаблицы.Имя].ЦветФона = Новый Цвет; + Иначе + ЭтотОбъект[СтрокаТаблицы.Имя] = ПеревестиТекстНаСервере(ПредставлениеНаИсходномЯзыке, ЯзыкПеревода, ИсходныйЯзык); + Элементы[СтрокаТаблицы.Имя].ЦветФона = ЦветаСтиля.ЦветИзмененногоПоля; + Модифицированность = Истина; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПеревестиТекстНаСервере(ИсходныйТекст, ЯзыкПеревода, ИсходныйЯзык) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Возврат МодульПереводТекстаНаДругиеЯзыки.ПеревестиТекст(ИсходныйТекст, ЯзыкПеревода, ИсходныйЯзык); + КонецЕсли; + +КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/Вопрос/Form.form b/SSL/src/CommonForms/Вопрос/Form.form index ca571b49f..34c4e5453 100644 --- a/SSL/src/CommonForms/Вопрос/Form.form +++ b/SSL/src/CommonForms/Вопрос/Form.form @@ -78,7 +78,6 @@ Left true - true true true true @@ -131,10 +130,6 @@ true - - <key>ru</key> - <value>Строки</value> - 35 СтрокиExtendedTooltip @@ -161,10 +156,6 @@ true - - <key>ru</key> - <value>Колонки</value> - КолонкиExtendedTooltip 17 diff --git a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form index 50a9c1edc..88fc9b316 100644 --- a/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form +++ b/SSL/src/CommonForms/ВопросОбУстановкеВнешнейКомпоненты/Form.form @@ -51,10 +51,6 @@ true - - <key>ru</key> - <value>Шапка</value> - ШапкаРасширеннаяПодсказка 17 diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form new file mode 100644 index 000000000..7ff498d6d --- /dev/null +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Form.form @@ -0,0 +1,2386 @@ + + + + <key>ru</key> + <value>Помощь и восстановление паролей при входе</value> + + + ОтображатьГиперссылкуПомощи + 1 + true + true + + true + + + ОтображатьГиперссылкуПомощи + + Right + + OnChange + НужнаПомощьПриИзменении + + + ОтображатьГиперссылкуПомощиРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ОтображатьГиперссылкуПомощиКонтекстноеМеню + 2 + true + + CheckBoxField + Enter + true + Left + true + + + + НавигационнаяСсылкаПомощи + 4 + true + true + + true + + + НавигационнаяСсылкаПомощи + + None + + НавигационнаяСсылкаПомощиРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + НавигационнаяСсылкаПомощиКонтекстноеМеню + 5 + true + + InputField + Enter + true + Left + true + + + Opening + НавигационнаяСсылкаПомощиОткрытие + + true + true + true + true + true + true + true + Normal + + ru + http://server/help + + + + + ВосстановлениеПароля + 7 + + ВосстанавливатьПароль + 45 + true + true + + true + + + ВосстанавливатьПароль + + Right + + OnChange + ВосстанавливатьПарольПриИзменении + + + ВосстанавливатьПарольРасширеннаяПодсказка + 47 + Label + true + true + + Left + + + + ВосстанавливатьПарольКонтекстноеМеню + 46 + true + + CheckBoxField + Enter + true + Left + true + + + + ВариантВосстановленияПароля + 9 + + <key>ru</key> + <value>Восстанавливать пароль</value> + + true + true + + true + + + ВариантВосстановленияПароля + + + OnChange + ВариантВосстановленияПароляПриИзменении + + + ВариантВосстановленияПароляРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ВариантВосстановленияПароляКонтекстноеМеню + 10 + true + + RadioButtonField + Enter + true + Left + true + + Tumbler + + + ru + по электронной почте + + + ЧерезЭлектроннуюПочту + + + + + ru + переходом по ссылке + + + ПереходПоСсылке + + + Vertical + + + + ВариантыВосстановления + 17 + + ЭлектроннаяПочта + 19 + + ГруппаОтправкиПоПочте + 106 + + ДекорацияОтправлятьОт + 108 + + <key>ru</key> + <value>Отправлять письмо от:</value> + + true + true + + true + + + ДекорацияОтправлятьОтРасширеннаяПодсказка + 110 + Label + true + true + + Left + + + + ДекорацияОтправлятьОтКонтекстноеМеню + 109 + true + + Label + true + true + + Left + + + + ГруппаВарианты + 69 + + ВариантОтправкиПоПочтеСтандартныйСервис + 100 + + <key>ru</key> + <value>Сервер отправки</value> + + true + true + + true + + + ВариантОтправкиПоПочте + + None + + OnChange + ВариантОтправкиСтандартныйСервисПриИзменении + + + ВариантОтправкиПоПочтеСтандартныйСервисРасширеннаяПодсказка + 102 + Label + true + true + + Left + + + + ВариантОтправкиПоПочтеСтандартныйСервисКонтекстноеМеню + 101 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Стандартный сервис отправки + + + СтандартныйСервис + + + Vertical + + + + ГруппаНастройкиПочты + 111 + + ВариантОтправкиПоПочтеУчетнаяЗапись + 103 + + <key>ru</key> + <value>Сервер отправки</value> + + true + true + + true + + + ВариантОтправкиПоПочте + + None + + OnChange + ВариантОтправкиПоНастройкеПочтыПриИзменении + + + ВариантОтправкиПоПочтеУчетнаяЗаписьРасширеннаяПодсказка + 105 + Label + true + true + + Left + + + + ВариантОтправкиПоПочтеУчетнаяЗаписьКонтекстноеМеню + 104 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Настройки почты: + + + ВнешнийПочтовыйСервер + + + Vertical + + + + УчетнаяЗаписьПочты + 35 + true + true + + true + + + УчетнаяЗаписьПочты + + None + + УчетнаяЗаписьПочтыРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + УчетнаяЗаписьПочтыКонтекстноеМеню + 36 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Настройки почты</value> + + + ГруппаНастройкиПочтыРасширеннаяПодсказка + 112 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ВариантОтправкиПоПочтеСвоиНастройки + 40 + + <key>ru</key> + <value>Сервер отправки</value> + + true + true + + true + + + ВариантОтправкиПоПочте + + None + + OnChange + ВариантОтправкиПоПочтеПриИзменении + + + ВариантОтправкиПоПочтеСвоиНастройкиРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + + ВариантОтправкиПоПочтеСвоиНастройкиКонтекстноеМеню + 41 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Указанный почтовый сервер + + + РучнаяНастройка + + + Vertical + + + true + true + + true + + + <key>ru</key> + <value>Варианты</value> + + + ГруппаВариантыРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Отправки по почте</value> + + + ГруппаОтправкиПоПочтеРасширеннаяПодсказка + 107 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + ГруппаРучныеНастройкиПочты + 71 + + ГруппаСерверSMTP + 88 + + АдресСервераSMTP + 85 + true + true + + true + + + АдресСервераSMTP + + + АдресСервераSMTPРасширеннаяПодсказка + 87 + Label + true + true + + Left + + + + АдресСервераSMTPКонтекстноеМеню + 86 + true + + InputField + Enter + true + Left + true + + 27 + true + true + true + true + true + true + Normal + + + + ШифрованиеПриОтправкеПочты + 113 + true + true + + true + + + ШифрованиеПриОтправкеПочты + + + OnChange + ШифрованиеПриПолученииПочтыПриИзменении + + + ШифрованиеПриОтправкеПочтыРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + ШифрованиеПриОтправкеПочтыКонтекстноеМеню + 114 + true + + RadioButtonField + Enter + true + Left + true + + 2 + + + ru + STARTTLS + + + Авто + + + + + ru + SSL + + + SSL + + + Vertical + + + + ПортSMTP + 73 + true + true + + true + + + ПортSMTP + + + ПортSMTPРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + ПортSMTPКонтекстноеМеню + 74 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Сервер SMTP</value> + + + ГруппаСерверSMTPРасширеннаяПодсказка + 89 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ГруппаПользовательSMTP + 90 + + ПользовательSMTP + 76 + true + true + + true + + + ПользовательSMTP + + + ПользовательSMTPРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + ПользовательSMTPКонтекстноеМеню + 77 + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + true + Normal + + + + ПарольSMTP + 79 + true + true + + true + + + ПарольSMTP + + + ПарольSMTPРасширеннаяПодсказка + 81 + Label + true + true + + Left + + + + ПарольSMTPКонтекстноеМеню + 80 + true + + InputField + Enter + true + Left + true + + 10 + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Пользователь SMTP</value> + + + ГруппаПользовательSMTPРасширеннаяПодсказка + 91 + Label + true + true + + Left + + + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto + + + + ИмяОтправителя + 82 + true + true + + true + + + ИмяОтправителя + + + ИмяОтправителяРасширеннаяПодсказка + 84 + Label + true + true + + Left + + + + ИмяОтправителяКонтекстноеМеню + 83 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + ru + Имя отправителя почтовых сообщений + + + + true + true + + true + + + <key>ru</key> + <value>Настройки почтового сервера</value> + + + ГруппаРучныеНастройкиПочтыРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Collapsible + true + Button + true + true + auto + Auto + Auto + + + + ГруппаТекстСообщения + 57 + + ТемаПисьма + 59 + + <key>ru</key> + <value>Тема</value> + + true + true + + true + + + ТемаПисьма + + + ТемаПисьмаРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ТемаПисьмаКонтекстноеМеню + 60 + + ВставитьПараметрКонтекстноеМенюГруппа + 120 + + ТемаПисьмаКонтекстноеМенюИмяПользователя + 118 + true + true + + true + + + ТемаПисьмаКонтекстноеМенюИмяПользователяРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + Form.Command.ИмяПользователя + Normal + Auto + true + true + UserCmds + Auto + + + ТемаПисьмаКонтекстноеМенюНаименованиеКонфигурации + 124 + true + true + + true + + + ТемаПисьмаКонтекстноеМенюНаименованиеКонфигурацииРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + Form.Command.НаименованиеКонфигурации + Normal + Auto + true + true + UserCmds + Auto + + + ТемаПисьмаКонтекстноеМенюКодПодтверждения + 122 + true + true + + true + + + ТемаПисьмаКонтекстноеМенюКодПодтвержденияРасширеннаяПодсказка + 123 + Label + true + true + + Left + + + Form.Command.КодПодтверждения + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Вставить параметр</value> + + + ВставитьПараметрКонтекстноеМенюГруппаРасширеннаяПодсказка + 121 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + Normal + + + + ГруппаКнопкиФорматированногоДокумента + 67 + + ТелоГруппаПараметры + 92 + + ИмяПользователя + 94 + true + true + + true + + + ИмяПользователяРасширеннаяПодсказка + 95 + Label + true + true + + Left + + + Form.Command.ИмяПользователя + Normal + Auto + true + true + UserCmds + Auto + + + ИмяКонфигурации + 96 + true + true + + true + + + ИмяКонфигурацииРасширеннаяПодсказка + 97 + Label + true + true + + Left + + + Form.Command.НаименованиеКонфигурации + Normal + Auto + true + true + UserCmds + Auto + + + КодПодтверждения + 98 + true + true + + true + + + КодПодтвержденияРасширеннаяПодсказка + 99 + Label + true + true + + Left + + + Form.Command.КодПодтверждения + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Вставить параметр</value> + + + ТелоГруппаПараметрыРасширеннаяПодсказка + 93 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + ГруппаКнопки + 65 + true + true + + true + + + <key>ru</key> + <value>Кнопки</value> + + + ГруппаКнопкиРасширеннаяПодсказка + 66 + Label + true + true + + Left + + + + Item.ТекстСообщения + + + true + true + + true + + + <key>ru</key> + <value>Кнопки форматированного документа</value> + + + ГруппаКнопкиФорматированногоДокументаРасширеннаяПодсказка + 68 + Label + true + true + + Left + + + CommandBar + + Left + + + + ТекстСообщения + 62 + true + true + + true + + + ТекстСообщения + + None + + ТекстСообщенияРасширеннаяПодсказка + 64 + Label + true + true + + Left + + + + ТекстСообщенияКонтекстноеМеню + 63 + + ВставитьПараметрТелоКонтекстноеМенюГруппа + 132 + + ТекстСообщенияКонтекстноеМенюИмяПользователя + 126 + true + true + + true + + + ТекстСообщенияКонтекстноеМенюИмяПользователяРасширеннаяПодсказка + 127 + Label + true + true + + Left + + + Form.Command.ИмяПользователя + Normal + Auto + true + true + UserCmds + Auto + + + ТекстСообщенияКонтекстноеМенюНаименованиеКонфигурации + 130 + true + true + + true + + + ТекстСообщенияКонтекстноеМенюНаименованиеКонфигурацииРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + Form.Command.НаименованиеКонфигурации + Normal + Auto + true + true + UserCmds + Auto + + + ТекстСообщенияКонтекстноеМенюКодПодтверждения + 128 + true + true + + true + + + ТекстСообщенияКонтекстноеМенюКодПодтвержденияРасширеннаяПодсказка + 129 + Label + true + true + + Left + + + Form.Command.КодПодтверждения + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Вставить параметр</value> + + + ВставитьПараметрТелоКонтекстноеМенюГруппаРасширеннаяПодсказка + 133 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + true + + FormattedDocumentField + Enter + true + Left + true + + 50 + true + 5 + true + true + true + + + true + true + + true + + + <key>ru</key> + <value>Шаблон сообщения с кодом восстановления пароля</value> + + + ГруппаТекстСообщенияРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + Button + true + true + auto + Auto + Auto + + + + ПараметрыКодаПодтверждения + 48 + + ДлинаКода + 12 + true + true + + true + + + ДлинаКодаПодтверждения + + + ДлинаКодаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДлинаКодаКонтекстноеМеню + 13 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ГруппаДлительностьБлокировкиЗапроса + 50 + + ДлительностьБлокировкиЗапроса + 23 + true + true + + true + + + ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения + + + ДлительностьБлокировкиЗапросаРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДлительностьБлокировкиЗапросаКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + + ДекорацияСек + 52 + + <key>ru</key> + <value>сек.</value> + + true + true + + true + + + ДекорацияСекРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ДекорацияСекКонтекстноеМеню + 53 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Длительность блокировки запроса</value> + + + ГруппаДлительностьБлокировкиЗапросаРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + UsualGroup + + HorizontalIfPossible + Auto + true + true + Auto + Auto + + + + МаксимальноеКоличествоПопыток + 26 + true + true + + true + + + МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения + + + МаксимальноеКоличествоПопытокРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + + МаксимальноеКоличествоПопытокКонтекстноеМеню + 27 + true + + InputField + Enter + true + Left + true + + 3 + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Код подтверждения</value> + + + ПараметрыКодаПодтвержденияРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + UsualGroup + + Vertical + Collapsible + Button + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Электронная почта</value> + + + ЭлектроннаяПочтаРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + + ПереходПоСсылке + 21 + + АдресСсылкиДляВосстановленияПароля + 29 + + <key>ru</key> + <value>Адрес страницы восстановления пароля</value> + + true + true + + true + + + НавигационнаяСсылкаВосстановленияПароля + + Top + + АдресСсылкиДляВосстановленияПароляРасширеннаяПодсказка + 31 + Label + true + true + + Left + + + + АдресСсылкиДляВосстановленияПароляКонтекстноеМеню + 30 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + ru + http://server/password + + + + true + true + + true + + + <key>ru</key> + <value>Переход по ссылке</value> + + + ПереходПоСсылкеРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Page + + Vertical + auto + false + + + true + true + + true + + + <key>ru</key> + <value>Варианты восстановления</value> + + + ВариантыВосстановленияРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + Pages + + Auto + + + true + true + + true + + + <key>ru</key> + <value>Восстановление пароля</value> + + + ВосстановлениеПароляРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ФормаЗаписатьИЗакрыть + 43 + true + true + + true + + true + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписать + 116 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 117 + Label + true + true + + Left + + + Form.Command.Записать + Normal + Auto + true + true + UserCmds + + StdPicture.SaveFile + + Auto + + Left + true + + + OnCreateAtServer + ПриСозданииНаСервере + + DontBlock + true + true + Vertical + true + true + true + auto + true + + ОтображатьГиперссылкуПомощи + + <key>ru</key> + <value>Отображать гиперссылку "Нужна помощь?" в диалоге аутентификации:</value> + + 1 + + Boolean + + + true + + + true + + true + + + НавигационнаяСсылкаПомощи + + <key>ru</key> + <value>Навигационная ссылка помощи</value> + + 2 + + String + + + + true + + + true + + true + + + ДлинаКодаПодтверждения + + <key>ru</key> + <value>Длина генерируемого кода</value> + + 3 + + Number + + 3 + true + + + + true + + + true + + true + + + МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения + + <key>ru</key> + <value>Допустимое количество неудачных попыток ввода</value> + + 4 + + Number + + 2 + true + + + + true + + + true + + true + + + ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения + + <key>ru</key> + <value>Минимальное время между повторными запросами</value> + + 5 + + Number + + 3 + true + + + + true + + + true + + true + + + ВариантОтправкиПоПочте + + <key>ru</key> + <value>Вариант отправки по почте</value> + + 6 + + String + + + + true + + + true + + true + + + ВариантВосстановленияПароля + + <key>ru</key> + <value>Вариант восстановления пароля</value> + + 7 + + String + + + + true + + + true + + true + + + УчетнаяЗаписьПочты + + <key>ru</key> + <value>Учетная запись почты</value> + + 8 + + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + true + + + true + + true + + + НавигационнаяСсылкаВосстановленияПароля + + <key>ru</key> + <value>Навигационная ссылка восстановления пароля</value> + + 9 + + String + + + + true + + + true + + true + + + ВосстанавливатьПароль + + <key>ru</key> + <value>Отображать гиперссылку "Забыли пароль?":</value> + + 10 + + Boolean + + + true + + + true + + true + + + ТекстСообщенияHTML + 11 + + String + + + + true + + + true + + + + ТемаПисьма + + <key>ru</key> + <value>Тема письма</value> + + 12 + + String + + + + true + + + true + + true + + + ТекстСообщения + + <key>ru</key> + <value>Текст сообщения</value> + + 13 + + FormattedDocument + + + true + + + true + + true + + + ПортSMTP + + <key>ru</key> + <value>Порт</value> + + 14 + + Number + + 5 + true + + + + true + + + true + + true + + + АдресСервераSMTP + + <key>ru</key> + <value>Сервер SMTP</value> + + 15 + + String + + 200 + + + + true + + + true + + true + + + ИмяОтправителя + + <key>ru</key> + <value>Отправитель</value> + + 16 + + String + + 200 + + + + true + + + true + + true + + + ПарольSMTP + + <key>ru</key> + <value>Пароль</value> + + 17 + + String + + 100 + + + + true + + + true + + true + + + ПользовательSMTP + + <key>ru</key> + <value>Пользователь</value> + + 18 + + String + + 200 + + + + true + + + true + + true + + + SSL + 19 + + String + + + + true + + + true + + + + ШифрованиеПриОтправкеПочты + + <key>ru</key> + <value>Шифрование</value> + + 20 + + String + + + + true + + + true + + true + + + ПарольИзменен + 21 + + Boolean + + + true + + + true + + + + ИспользоватьSSL + 22 + + Boolean + + + true + + + true + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 2 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + ИмяПользователя + + <key>ru</key> + <value>Имя пользователя</value> + + 3 + + ru + Имя пользователя + + + true + + + + ПараметрИмяПользователя + + + Auto + Auto + + + НаименованиеКонфигурации + + <key>ru</key> + <value>Наименование конфигурации</value> + + 4 + + true + + + + НаименованиеКонфигурации + + + Auto + Auto + + + КодПодтверждения + + <key>ru</key> + <value>Код подтверждения</value> + + 5 + + ru + Код подтверждения + + + true + + + + КодПодтверждения + + + Auto + Auto + + + Записать + + <key>ru</key> + <value>Записать</value> + + 1 + + ru + Записать + + + true + + + + Записать + + + Picture + Auto + Auto + + + + + + diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl new file mode 100644 index 000000000..ee2a30cec --- /dev/null +++ b/SSL/src/CommonForms/ВосстановлениеПаролей/Module.bsl @@ -0,0 +1,535 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав для выполнения операции.'"); + КонецЕсли; + + Если Не ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + ВызватьИсключение НСтр("ru = 'Восстановление паролей пользователей не поддерживается. + |Необходимо обновить версию платформы 1С: Предприятие.'"); + КонецЕсли; + + ПрочитьНастройкиВосстановленияПароля(); + + Если ОтображатьГиперссылкуПомощи И ПустаяСтрока(НавигационнаяСсылкаПомощи) Тогда + Элементы.НавигационнаяСсылкаПомощи.ОтметкаНезаполненного = Истина; + КонецЕсли; + + Флаг = ВариантОтправкиПоПочте = "РучнаяНастройка"; + Элементы.ГруппаСерверSMTP.Доступность = Флаг; + Элементы.ГруппаПользовательSMTP.Доступность = Флаг; + Элементы.ИмяОтправителя.Доступность = Флаг; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + УчетнаяЗаписьПочты = Неопределено; + Элементы.ГруппаНастройкиПочты.Видимость = Ложь; + КонецЕсли; + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + Элементы.ГруппаНастройкиПочты.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура ВариантВосстановленияПароляПриИзменении(Элемент) + + Если ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту" Тогда + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ЭлектроннаяПочта; + Иначе + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ПереходПоСсылке; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВосстанавливатьПарольПриИзменении(Элемент) + + Если ВосстанавливатьПароль Тогда + Элементы.ВариантВосстановленияПароля.Доступность = Истина; + Элементы.ВариантыВосстановления.Доступность = Истина; + Иначе + Элементы.ВариантВосстановленияПароля.Доступность = Ложь; + Элементы.ВариантыВосстановления.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НужнаПомощьПриИзменении(Элемент) + + Элементы.НавигационнаяСсылкаПомощи.Доступность = ОтображатьГиперссылкуПомощи; + +КонецПроцедуры + +&НаКлиенте +Процедура ВариантОтправкиПоПочтеПриИзменении(Элемент) + + Флаг = ВариантОтправкиПоПочте = "РучнаяНастройка"; + Элементы.ГруппаСерверSMTP.Доступность = Флаг; + Элементы.ГруппаПользовательSMTP.Доступность = Флаг; + Элементы.ИмяОтправителя.Доступность = Флаг; + + Если Флаг Тогда + Элементы.ГруппаРучныеНастройкиПочты.Показать(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВариантОтправкиПоНастройкеПочтыПриИзменении(Элемент) + + Элементы.ГруппаСерверSMTP.Доступность = Ложь; + Элементы.ГруппаПользовательSMTP.Доступность = Ложь; + Элементы.ИмяОтправителя.Доступность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ВариантОтправкиСтандартныйСервисПриИзменении(Элемент) + + Элементы.ГруппаСерверSMTP.Доступность = Ложь; + Элементы.ГруппаПользовательSMTP.Доступность = Ложь; + Элементы.ИмяОтправителя.Доступность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ШифрованиеПриПолученииПочтыПриИзменении(Элемент) + + Если ШифрованиеПриОтправкеПочты = "Авто" Тогда + ПортSMTP = 25; + Иначе + ПортSMTP = 465 + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + Если НастройкиВосстановленияПароляКорректные() Тогда + СохранитьНастройкиВосстановленияПароля(); + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + Если НастройкиВосстановленияПароляКорректные() Тогда + СохранитьНастройкиВосстановленияПароля(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура НавигационнаяСсылкаПомощиОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(НавигационнаяСсылкаПомощи); + +КонецПроцедуры + +&НаКлиенте +Процедура КодПодтверждения(Команда) + + ВставитьПараметрВШаблон("&VerificationCode"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрИмяПользователя(Команда) + + ВставитьПараметрВШаблон("&UserPresentation"); + +КонецПроцедуры + +&НаКлиенте +Процедура НаименованиеКонфигурации(Команда) + + ВставитьПараметрВШаблон("&ConfigurationPresentation"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаКлиенте +Функция НастройкиВосстановленияПароляКорректные() + + ОчиститьСообщения(); + + НастройкиКорректные = Истина; + + Если ОтображатьГиперссылкуПомощи И ПустаяСтрока(НавигационнаяСсылкаПомощи) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен адрес страницы помощи'"),, + "НавигационнаяСсылкаПомощи"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + Если ВариантВосстановленияПароля <> "ЧерезЭлектроннуюПочту" Тогда + + Если ПустаяСтрока(НавигационнаяСсылкаВосстановленияПароля) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен адрес страницы восстановления пароля'"),, + "НавигационнаяСсылкаВосстановленияПароля"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + Возврат НастройкиКорректные; + + КонецЕсли; + + Если ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер" Тогда + + Если Не ЗначениеЗаполнено(УчетнаяЗаписьПочты) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнены настройки почты'"),, + "УчетнаяЗаписьПочты"); + НастройкиКорректные = Ложь; + + ИначеЕсли Не УчетнаяЗаписьНастроена(УчетнаяЗаписьПочты) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Почта не настроена для отправки писем'"),, + "УчетнаяЗаписьПочты"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + ИначеЕсли ВариантОтправкиПоПочте = "РучнаяНастройка" Тогда + + Если ПустаяСтрока(АдресСервераSMTP) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен адрес сервера SMTP'"),, + "АдресСервераSMTP"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + Если ПустаяСтрока(ПользовательSMTP) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен пользователь SMTP'"),, + "ПользовательSMTP"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + Если ПустаяСтрока(ПарольSMTP) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнен пароль SMTP'"),, + "ПарольSMTP"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + Если ПустаяСтрока(ИмяОтправителя) Тогда + + ОбщегоНазначенияКлиент.СообщитьПользователю(НСтр("ru='Не заполнено имя отправителя'"),, + "ИмяОтправителя"); + НастройкиКорректные = Ложь; + + КонецЕсли; + + + КонецЕсли; + + Возврат НастройкиКорректные; + +КонецФункции + +&НаСервереБезКонтекста +Функция УчетнаяЗаписьНастроена(УчетнаяЗапись) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + + МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями"); + Возврат МодульРаботаСПочтовымиСообщениями.УчетнаяЗаписьНастроена(УчетнаяЗапись, Истина, Ложь); + + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Процедура ВставитьПараметрВШаблон(ИмяПараметра) + + Если ТекущийЭлемент.Имя = Элементы.ТемаПисьма.Имя Тогда + ТемаПисьма = ТемаПисьма + " " + ИмяПараметра; + Иначе + ЗакладкаДляВставкиНачало = Неопределено; + ЗакладкаДляВставкиКонец = Неопределено; + Элементы.ТекстСообщения.ПолучитьГраницыВыделения(ЗакладкаДляВставкиНачало, ЗакладкаДляВставкиКонец); + ТекстСообщения.Вставить(ЗакладкаДляВставкиКонец, ИмяПараметра); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗапуститьФоновоеЗаполнениеПочтыПользователей() + + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); + ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Заполнение почты пользователей для восстановления пароля'"); + + ДлительныеОперации.ВыполнитьВФоне("ПользователиСлужебный.ЗаполнитьПочтуДляВосстановленияПароляУПользователейВФоне", + Новый Структура, ПараметрыВыполнения); + +КонецПроцедуры + +&НаСервере +Функция ТребуетсяЗапускЗаполненияПочтыПользователей() + + Если Не ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ВосстанавливатьПароль Тогда + Возврат Ложь; + КонецЕсли; + + Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); + Если Настройки = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + // Предыдущие значение + Если Настройки.СпособВосстановленияПароля <> ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет") Тогда + Возврат Ложь; + КонецЕсли; + + ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей(); + Для Каждого ПользовательИБ Из ПользователиИБ Цикл + Если ПользовательИБ.ЗапрещеноВосстанавливатьПароль = Ложь Тогда + Возврат Ложь; + КонецЕсли; + КонецЦикла; + + Возврат Истина; + +КонецФункции + +&НаСервере +Процедура СохранитьНастройкиВосстановленияПароля() + + ЗапуститьФоновоеЗаполнениеПочтыПользователей = ТребуетсяЗапускЗаполненияПочтыПользователей(); + + Если ПарольИзменен Тогда + ТекущийПарольSMTP = ПарольSMTP; + Иначе + ТекущиеНастройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); + Если ТекущиеНастройки <> Неопределено Тогда + ТекущийПарольSMTP = ТекущиеНастройки.ПарольSMTP; + Иначе + ТекущийПарольSMTP = ""; + КонецЕсли; + КонецЕсли; + + Вложения = Новый Структура; + ТекстСообщения.ПолучитьHTML(ТекстСообщенияHTML, Вложения); + + Для каждого Вложение Из Вложения Цикл + + ФорматИзображения = ?(Вложение.Значение.Формат() <> ФорматКартинки.НеизвестныйФормат, + НРег(Вложение.Значение.Формат()), НРег(ФорматКартинки.PNG)); + + ТекстКартинки = "src=""data:image/" + ФорматИзображения + ";base64," + Base64Строка(Вложение.Значение.ПолучитьДвоичныеДанные()) + """"; + ТекстСообщенияHTML = СтрЗаменить(ТекстСообщенияHTML, + "src=""" + Вложение.Ключ + """", + ТекстКартинки); + + КонецЦикла; + + Настройки = ПользователиСлужебный.НовыеНастройкиВосстановленияПароля(); + Если Настройки = Неопределено Тогда + Возврат; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(Настройки, ЭтотОбъект, СписокПолейНастроек()); + + Настройки.Заголовок = ТемаПисьма; + Настройки.ПарольSMTP = ТекущийПарольSMTP; + + Если ВосстанавливатьПароль Тогда + + Если ВариантВосстановленияПароля = "ПереходПоСсылке" Тогда + Настройки.СпособВосстановленияПароля = + ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ПереходПоНавигационнойСсылке"); + ИначеЕсли ВариантОтправкиПоПочте = "СтандартныйСервис" Тогда + Настройки.СпособВосстановленияПароля = + ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис"); + ИначеЕсли ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер" Тогда + Настройки.СпособВосстановленияПароля = + ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + НастройкиУчетнойЗаписиДляОтправкиПочта = МодульРаботаСПочтовымиСообщениямиСлужебный.НастройкиУчетнойЗаписиДляОтправкиПочта(УчетнаяЗаписьПочты); + ЗаполнитьЗначенияСвойств(Настройки, НастройкиУчетнойЗаписиДляОтправкиПочта); + + КонецЕсли; + + Иначе + + Настройки.СпособВосстановленияПароля = + ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); + ЗаполнитьЗначенияСвойств(Настройки, ЭтотОбъект, "АдресСервераSMTP, ПарольSMTP, ПользовательSMTP, ПортSMTP,ИмяОтправителя"); + Настройки.ИспользоватьSSL = ШифрованиеПриОтправкеПочты = "SSL"; + + КонецЕсли; + Иначе + Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет"); + КонецЕсли; + + УстановитьУчетнуюЗаписьДляВосстановленияПароля(УчетнаяЗаписьПочты, ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер"); + ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(Настройки); + + Если ЗапуститьФоновоеЗаполнениеПочтыПользователей Тогда + ЗапуститьФоновоеЗаполнениеПочтыПользователей(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПрочитьНастройкиВосстановленияПароля() + + ВариантОтправкиПоПочте = "СтандартныйСервис"; + ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту"; + + СведенияОбУчетнойЗаписи = НастройкиУчетнойЗаписиДляВосстановленияПароля(); + + Если ТипЗнч(СведенияОбУчетнойЗаписи) = Тип("Структура") Тогда + УчетнаяЗаписьПочты = СведенияОбУчетнойЗаписи.УчетнаяЗаписьПочты; + КонецЕсли; + + Настройки = ПользователиСлужебный.НастройкиВосстановленияПароля(); + Если Настройки = Неопределено Тогда + Возврат; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Настройки, СписокПолейНастроек()); + + Если ЗначениеЗаполнено(Настройки.ПарольSMTP) Тогда + ПарольSMTP = Строка(Новый УникальныйИдентификатор); + КонецЕсли; + + ШифрованиеПриОтправкеПочты = ?(Настройки.ИспользоватьSSL, "SSL", "Авто"); + + Если ПустаяСтрока(ТекстСообщенияHTML) Тогда + ТекстСообщенияHTML = ТекстПоУмолчанию(); + КонецЕсли; + ТекстСообщения.УстановитьHTML(ТекстСообщенияHTML, Новый Структура); + + ТемаПисьма = ?(ЗначениеЗаполнено(Настройки.Заголовок), + Настройки.Заголовок, НСтр("ru='Восстановление пароля'")); + + Если Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("Нет") Тогда + ВосстанавливатьПароль = Ложь; + + Иначе + ВосстанавливатьПароль = Истина; + Если Настройки.СпособВосстановленияПароля = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияЧерезСтандартныйСервис") Тогда + ВариантОтправкиПоПочте = "СтандартныйСервис"; + Иначе + Если Настройки.СпособВосстановленияПароля = + ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам") Тогда + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ЭлектроннаяПочта; + ВариантВосстановленияПароля = "ЧерезЭлектроннуюПочту"; + Если СведенияОбУчетнойЗаписи.Используется Тогда + ВариантОтправкиПоПочте = "ВнешнийПочтовыйСервер"; + Иначе + ВариантОтправкиПоПочте = "РучнаяНастройка"; + Элементы.ГруппаРучныеНастройкиПочты.Показать(); + КонецЕсли; + Иначе + Элементы.ВариантыВосстановления.ТекущаяСтраница = Элементы.ПереходПоСсылке; + ВариантВосстановленияПароля = "ПереходПоСсылке"; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция СписокПолейНастроек() + + Возврат "ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения, + |МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения,НавигационнаяСсылкаВосстановленияПароля, + |ОтображатьГиперссылкуПомощи,НавигационнаяСсылкаПомощи,ДлинаКодаПодтверждения,ТекстСообщенияHTML, + |АдресСервераSMTP,ПортSMTP,ИспользоватьSSL,ПользовательSMTP,ИмяОтправителя"; + +КонецФункции + +&НаСервереБезКонтекста +Функция ТекстПоУмолчанию() + + ТекстСообщенияHTML = НСтр("ru='Здравствуйте, &UserPresentation + | + |Мы получили запрос на восстановление пароля от &ConfigurationPresentation. + | + |Введите код &VerificationCode для сброса пароля. + | + |Если восстановление пароля не запрашивалось, сообщите об этом техническому специалисту.'"); + + Возврат ТекстСообщенияHTML; + +КонецФункции + +&НаСервереБезКонтекста +Процедура УстановитьУчетнуюЗаписьДляВосстановленияПароля(УчетнаяЗаписьПочты, Используется) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + + СведенияОбУчетнойЗаписи = МодульРаботаСПочтовымиСообщениямиСлужебный.ОписаниеНастроекУчетнойЗаписиДляВосстановленияПароля(); + СведенияОбУчетнойЗаписи.УчетнаяЗаписьПочты = УчетнаяЗаписьПочты; + СведенияОбУчетнойЗаписи.Используется = Используется; + + МодульРаботаСПочтовымиСообщениямиСлужебный.СохранитьНастройкиУчетнойЗаписиДляВосстановленияПароля(СведенияОбУчетнойЗаписи); + + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция НастройкиУчетнойЗаписиДляВосстановленияПароля() + + СведенияОбУчетнойЗаписи = Неопределено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениямиСлужебный"); + СведенияОбУчетнойЗаписи = МодульРаботаСПочтовымиСообщениямиСлужебный.НастройкиУчетнойЗаписиДляВосстановленияПароля(); + КонецЕсли; + + Возврат СведенияОбУчетнойЗаписи; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ВосстановлениеПаролей/ВосстановлениеПаролей.mdo b/SSL/src/CommonForms/ВосстановлениеПаролей/ВосстановлениеПаролей.mdo new file mode 100644 index 000000000..fd07b6556 --- /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 3aea1a980..c4d89cf29 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form @@ -82,10 +82,6 @@ true - - <key>ru</key> - <value>Сообщение для пользователя</value> - СообщениеДляПользователяExtendedTooltip 42 @@ -185,10 +181,6 @@ true - - <key>ru</key> - <value>Файл и кнопка</value> - ФайлИКнопкаExtendedTooltip 47 @@ -522,10 +514,6 @@ true - - <key>ru</key> - <value>Свойства файлов</value> - СвойстваФайловExtendedTooltip 50 diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl index 693c866a0..350fdb653 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -35,6 +35,13 @@ // список при открытии формы. // +#Область ОписаниеПеременных + +&НаСервере +Перем ПодчиненныеСправочники; + +#КонецОбласти + #Область ОбработчикиСобытийФормы &НаСервере @@ -389,12 +396,11 @@ // КартинкаОбъекта - Число - код картинки подэлемента. // Родитель - ссылка на элемента дерева значений, который является корнем // для добавляемого элемента. -// Подсистемы - если заполнен, то содержит значение Метаданные.Подсистемы (коллекцию элементов). +// Подсистемы - КоллекцияОбъектовМетаданных - если заполнен, то содержит значение Метаданные.Подсистемы (коллекцию элементов). // Проверять - Булево - признак проверки на принадлежность родительским подсистемам. // // Возвращаемое значение: -// -// Строка дерева объектов метаданных. +// ДанныеФормыЭлементДерева // &НаСервере Функция ДобавитьЭлементДереваОбъектовМетаданных(ПараметрыЭлемента, Подсистемы = Неопределено, Проверять = Истина) @@ -491,11 +497,13 @@ // конфигурации. // // Параметры: -// Имя - имя объекта метаданных или вида объекта метаданных. -// Синоним - синоним объекта метаданных. -// Картинка - картинка поставленная в соответствие объекту метаданных -// или виду объекта метаданных. -// ЭтоКоллекцияОбщие - признак того, что текущий элемент содержит подэлементы. +// Имя - Строка - имя объекта метаданных или вида объекта метаданных. +// Синоним - Строка - синоним объекта метаданных. +// Картинка - Число - картинка поставленная в соответствие объекту метаданных +// или виду объекта метаданных. +// КартинкаОбъекта - Число +// ЭтоКоллекцияОбщие - Булево - признак того, что текущий элемент содержит подэлементы. +// Таб - ТаблицаЗначений // &НаСервере Процедура КоллекцииОбъектовМетаданных_НоваяСтрока(Имя, Синоним, Картинка, КартинкаОбъекта, ЭтоКоллекцияОбщие, Таб) @@ -791,18 +799,27 @@ КонецФункции -&НаСервереБезКонтекста +&НаСервере Функция ПодчиненныеСправочники(ОбъектМетаданных) - Результат = Новый Массив; + Если ПодчиненныеСправочники = Неопределено Тогда + ПодчиненныеСправочники = Новый Соответствие; + + Для Каждого Справочник Из Метаданные.Справочники Цикл + Если ПодчиненныеСправочники[Справочник] = Неопределено Тогда + ПодчиненныеСправочники[Справочник] = Новый Массив; + КонецЕсли; + Для Каждого ВладелецСправочника Из Справочник.Владельцы Цикл + Если ПодчиненныеСправочники[ВладелецСправочника] = Неопределено Тогда + ПодчиненныеСправочники[ВладелецСправочника] = Новый Массив; + КонецЕсли; + СписокСправочников = ПодчиненныеСправочники[ВладелецСправочника]; // Массив + СписокСправочников.Добавить(Справочник); + КонецЦикла; + КонецЦикла; + КонецЕсли; - Для Каждого Справочник Из Метаданные.Справочники Цикл - Если Справочник.Владельцы.Содержит(ОбъектМетаданных) Тогда - Результат.Добавить(Справочник); - КонецЕсли; - КонецЦикла; - - Возврат Результат; + Возврат ПодчиненныеСправочники[ОбъектМетаданных]; КонецФункции @@ -810,10 +827,6 @@ Процедура ЗаполнитьДеревоОбъектов() Если СпособГруппировкиОбъектов = "ПоРазделам" Тогда - Если ВыбранныеОбъектыМетаданных.Количество() > 0 - И ЗначениеЗаполнено(ВыбранныеОбъектыМетаданных[0].Представление) Тогда - ИскатьВыбранныеПоАдресу = Истина; - КонецЕсли; ДеревоОбъектовМетаданныхЗаполнитьПоРазделам(); Иначе ДеревоОбъектовМетаданныхЗаполнить(); diff --git a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form index afc831eb5..672dec715 100644 --- a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form +++ b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form @@ -177,10 +177,6 @@ true - - <key>ru</key> - <value>Отступ</value> - ГруппаОтступРасширеннаяПодсказка 28 @@ -206,10 +202,6 @@ true - - <key>ru</key> - <value>Уточнение</value> - ГруппаУточнениеРасширеннаяПодсказка 26 diff --git a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl index 4f14a472f..2b6aa6a69 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl +++ b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl @@ -403,7 +403,7 @@ // Параметры: // ДеревоГруппИсточник - ДанныеФормыКоллекцияЭлементовДерева // МассивПеремещенныхПользователей - Массив из СправочникСсылка.Пользователи -// НеПеремещенныеПользователи - Соответствие: +// НеПеремещенныеПользователи - Соответствие из КлючИЗначение: // * Ключ - СправочникСсылка.Пользователи // * Значение - Массив из СправочникСсылка.ГруппыПользователей // - СправочникСсылка.ГруппыВнешнихПользователей diff --git a/SSL/src/CommonForms/ДлительнаяОперация/Form.form b/SSL/src/CommonForms/ДлительнаяОперация/Form.form index 09747da52..6916b46ac 100644 --- a/SSL/src/CommonForms/ДлительнаяОперация/Form.form +++ b/SSL/src/CommonForms/ДлительнаяОперация/Form.form @@ -79,10 +79,6 @@ true - - <key>ru</key> - <value>Картинка и надпись</value> - КартинкаИНадписьРасширеннаяПодсказка 15 diff --git a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form index 12367176d..9123a0dad 100644 --- a/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form +++ b/SSL/src/CommonForms/ДобавлениеЭлектроннойПодписиИзФайла/Form.form @@ -52,10 +52,6 @@ true - - <key>ru</key> - <value>Представление данных</value> - ГруппаПредставлениеДанныхРасширеннаяПодсказка 32 @@ -80,10 +76,6 @@ Подписи 1 - - <key>ru</key> - <value>Подписи</value> - true true diff --git a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl index e68ef7670..bbda3569a 100644 --- a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl +++ b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl @@ -163,13 +163,11 @@ // Находит и возвращает недопустимые символы в строке, перечисленные через запятую. // // Параметры: -// ПроверяемаяСтрока (Строка) - строка - проверяемая на предмет наличия недопустимых -// символов. -// ДопустимыеСимволы (Строка) - строка допустимых символов. +// ПроверяемаяСтрока - Строка - проверяемая на предмет наличия недопустимых символов. +// ДопустимыеСимволы - Строка - допустимые символы. // // Возвращаемое значение: -// Строка - строка недопустимых символов. Пустая строка, если -// в проверяемой строке недопустимые символы не обнаружены. +// Строка // &НаКлиенте Функция НедопустимыеСимволыВСтроке(ПроверяемаяСтрока, ДопустимыеСимволы) diff --git a/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form b/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form index 9a4c338e4..c5bfe79d8 100644 --- a/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form +++ b/SSL/src/CommonForms/КонтрольДинамическогоОбновления/Form.form @@ -98,6 +98,10 @@ true + + <key>ru</key> + <value>Текст</value> + ГруппаТекстРасширеннаяПодсказка 19 @@ -172,6 +176,10 @@ true + + <key>ru</key> + <value>Расписание</value> + ГруппаРасписаниеРасширеннаяПодсказка 21 @@ -198,6 +206,10 @@ true + + <key>ru</key> + <value>Текст и расписание</value> + ГруппаТекстИРасписаниеРасширеннаяПодсказка 23 diff --git a/SSL/src/CommonForms/НастройкаКолонтитулов/Module.bsl b/SSL/src/CommonForms/НастройкаКолонтитулов/Module.bsl index 12e5d9ff2..048377d31 100644 --- a/SSL/src/CommonForms/НастройкаКолонтитулов/Module.bsl +++ b/SSL/src/CommonForms/НастройкаКолонтитулов/Module.bsl @@ -21,7 +21,7 @@ ЭтоИндивидуальныеНастройки = Параметры.Свойство("Настройки", Настройки); Если Не ЭтоИндивидуальныеНастройки Тогда - Элементы.ФормаОК.Заголовок = "Сохранить"; + Элементы.ФормаОК.Заголовок = НСтр("ru = 'Сохранить'"); КонецЕсли; Элементы.ФормаОтмена.Видимость = Не ЭтоИндивидуальныеНастройки; Элементы.ФормаУстановитьСтандартныеНастройки.Видимость = ЭтоИндивидуальныеНастройки; diff --git a/SSL/src/CommonForms/НастройкаКомандПечати/Module.bsl b/SSL/src/CommonForms/НастройкаКомандПечати/Module.bsl index 0837f4119..819bfcd21 100644 --- a/SSL/src/CommonForms/НастройкаКомандПечати/Module.bsl +++ b/SSL/src/CommonForms/НастройкаКомандПечати/Module.bsl @@ -110,7 +110,7 @@ Процедура ЗаписатьНастройкиКоманд() Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиКомандПечати"); + Блокировка.Добавить("РегистрСведений.НастройкиКомандПечати"); НачатьТранзакцию(); Попытка diff --git a/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form b/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form new file mode 100644 index 000000000..4dfe976da --- /dev/null +++ b/SSL/src/CommonForms/НастройкаПереводаТекста/Form.form @@ -0,0 +1,275 @@ + + + + СервисПереводаТекста + 1 + true + true + + true + + + НаборКонстант.СервисПереводаТекста + + ShowBottom + + OnChange + СервисПереводаТекстаПриИзменении + + + СервисПереводаТекстаРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + СервисПереводаТекстаКонтекстноеМеню + 2 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + + Style.ФонУправляющегоПоля + + Normal + + + + Инструкция + 6 + true + true + + true + + + ИнструкцияРасширеннаяПодсказка + 8 + Label + true + true + + Left + + + + ИнструкцияКонтекстноеМеню + 7 + true + + Label + true + + Left + + + + ПараметрыАвторизации + 4 + true + true + + true + + + <key>ru</key> + <value>Параметры авторизации</value> + + + ПараметрыАвторизацииРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + + ЗаписатьИЗакрыть + 9 + true + true + + true + + + ЗаписатьИЗакрытьРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Auto + true + true + true + UserCmds + Auto + + + СтандартныеКоманды + 11 + true + true + + true + + + <key>ru</key> + <value>Стандартные команды</value> + + + СтандартныеКомандыРасширеннаяПодсказка + 12 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 13 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + WriteAndClose + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + НаборКонстант + 1 + + ConstantsSet + + + true + + + true + +
    true
    + true +
    + + ПараметрыАвторизации + 5 + + ValueList + + + true + + + true + + + + + + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 1 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + + + + + + + + OnReadAtServer + ПриЧтенииНаСервере + + + OnWriteAtServer + ПриЗаписиНаСервере + + +
    diff --git a/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl b/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl new file mode 100644 index 000000000..ccf011be8 --- /dev/null +++ b/SSL/src/CommonForms/НастройкаПереводаТекста/Module.bsl @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) + + Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.СервисПереводаТекста"); + + УстановитьПривилегированныйРежим(Истина); + Для Каждого Параметр Из ПараметрыАвторизации Цикл + Если Параметр.Представление <> Строка(УникальныйИдентификатор) Тогда + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, Параметр.Представление, Параметр.Значение); + КонецЕсли; + КонецЦикла; + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ЗаполнитьНастройки(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовШапкиФормы + +&НаКлиенте +Процедура СервисПереводаТекстаПриИзменении(Элемент) + + ЗаполнитьНастройки(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПараметрАвторизацииИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка) + Элемент.КнопкаВыбора = Истина; +КонецПроцедуры + +// Параметры: +// Элемент - ПолеФормы +// +&НаКлиенте +Процедура Подключаемый_ПараметрАвторизацииНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + Индекс = ПараметрыАвторизации.Индекс(ПараметрыАвторизации.НайтиПоЗначению(Элемент.Имя)); + ПереключитьРежимПароля(Элемент, ПараметрыАвторизации[Индекс].Представление, СтандартнаяОбработка); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + Записать(); + Закрыть(НаборКонстант.СервисПереводаТекста); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +&НаСервере +Процедура ЗаполнитьНастройки() + + СервисПереводаТекста = НаборКонстант.СервисПереводаТекста; + + Для Каждого Параметр Из ПараметрыАвторизации Цикл + Элементы.Удалить(Элементы[Параметр.Значение]); + КонецЦикла; + ПараметрыАвторизации.Очистить(); + + Элементы.Инструкция.Заголовок = ""; + + УстановитьПривилегированныйРежим(Истина); + + НастройкиАвторизации = ПереводТекстаНаДругиеЯзыки.НастройкиАвторизации(СервисПереводаТекста); + Если НастройкиАвторизации = Неопределено Тогда + Возврат; + КонецЕсли; + + НастройкиСервисаПереводаТекста = ПереводТекстаНаДругиеЯзыки.НастройкиСервисаПереводаТекста(СервисПереводаТекста); + Элементы.Инструкция.Заголовок = НастройкиСервисаПереводаТекста.ИнструкцияПоПодключению; + + Для Индекс = 0 По НастройкиСервисаПереводаТекста.ПараметрыАвторизации.Количество() - 1 Цикл + ОписаниеПараметра = НастройкиСервисаПереводаТекста.ПараметрыАвторизации[Индекс]; + ЗначениеПараметра = НастройкиАвторизации[ОписаниеПараметра.Имя]; + ПараметрыАвторизации.Добавить(ОписаниеПараметра.Имя, ?(ЗначениеЗаполнено(ЗначениеПараметра), УникальныйИдентификатор, "")); + + ПолеВвода = Элементы.Добавить(ОписаниеПараметра.Имя, Тип("ПолеФормы"), Элементы.ПараметрыАвторизации); + ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; + ПолеВвода.Заголовок = ОписаниеПараметра.Представление; + ПолеВвода.ПутьКДанным = "ПараметрыАвторизации[" + Индекс + "].Представление"; + ПолеВвода.ОтображениеПодсказки = ОписаниеПараметра.ОтображениеПодсказки; + ПолеВвода.РасширеннаяПодсказка.Заголовок = ОписаниеПараметра.Подсказка; + ПолеВвода.УстановитьДействие("НачалоВыбора", "Подключаемый_ПараметрАвторизацииНачалоВыбора"); + ПолеВвода.УстановитьДействие("ИзменениеТекстаРедактирования", "Подключаемый_ПараметрАвторизацииИзменениеТекстаРедактирования"); + ПолеВвода.РежимПароля = Истина; + ПолеВвода.КнопкаВыбора = Не ЗначениеЗаполнено(ЗначениеПараметра); + ПолеВвода.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + КонецЦикла; + +КонецПроцедуры + +&НаКлиенте +Процедура ПереключитьРежимПароля(Элемент, Реквизит, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + Реквизит = Элемент.ТекстРедактирования; + Элемент.РежимПароля = Не Элемент.РежимПароля; + Если Элемент.РежимПароля Тогда + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыСкрыты; + Иначе + Элемент.КартинкаКнопкиВыбора = БиблиотекаКартинок.ВводимыеСимволыВидны; + КонецЕсли; + +КонецПроцедуры + + +#КонецОбласти + diff --git a/SSL/src/CommonForms/НастройкаПереводаТекста/НастройкаПереводаТекста.mdo b/SSL/src/CommonForms/НастройкаПереводаТекста/НастройкаПереводаТекста.mdo new file mode 100644 index 000000000..866e8765a --- /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 fc86c53e9..3d8c98514 100644 --- a/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form +++ b/SSL/src/CommonForms/НастройкаРабочегоКаталога/Form.form @@ -93,10 +93,6 @@ true - - <key>ru</key> - <value>Расположение</value> - ГруппаРасположениеExtendedTooltip 30 diff --git a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form index b11159aca..47190879e 100644 --- a/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form +++ b/SSL/src/CommonForms/НастройкиЭлектроннойПодписиИШифрования/Form.form @@ -884,7 +884,7 @@ 355 <key>ru</key> - <value>Настройка программ электронной подписи и шифрования выполнена в главном узле</value> + <value>Настройка программ электронной подписи и шифрования выполнена в корневом узле</value> true true diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form index c39f00559..e6b66f9d5 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form @@ -392,10 +392,6 @@ true - - <key>ru</key> - <value>Панель основная</value> - true ПанельОсновнаяExtendedTooltip @@ -685,10 +681,6 @@ true - - <key>ru</key> - <value>Панель навигации</value> - ПанельНавигацииExtendedTooltip 44 diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl index 843e4e19e..573e903aa 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl @@ -333,25 +333,6 @@ КонецПроцедуры -// Добавляет новую строку в конец текущей таблицы переходов -// -// Параметры: -// -// ПорядковыйНомерПерехода (обязательный) - Число - порядковый номер перехода, который соответствует текущему шагу перехода -// ИмяОсновнойСтраницы (обязательный) - Строка - имя страницы панели "ПанельОсновная", которая соответствует текущему -// номеру перехода -// ИмяСтраницыНавигации (обязательный) - Строка - имя страницы панели "ПанельНавигации", которая соответствует текущему -// номеру перехода -// ИмяСтраницыДекорации (необязательный) - Строка - имя страницы панели "ПанельДекорации", которая соответствует -// текущему номеру перехода -// ИмяОбработчикаПриОткрытии (необязательный) - Строка - имя функции-обработчика события открытия текущей страницы помощника -// ИмяОбработчикаПриПереходеДалее (необязательный) - Строка - имя функции-обработчика события перехода на следующую -// страницу помощника -// ИмяОбработчикаПриПереходеНазад (необязательный) - Строка - имя функции-обработчика события перехода на предыдущую -// страницу помощника -// ДлительнаяОперация (необязательный) - Булево - признак отображения страницы длительной операции. -// Истина - отображается страница длительной операции; Ложь - отображается обычная страница. Значение по умолчанию - Ложь. -// &НаСервере Функция ТаблицаПереходовНоваяСтрока(ИмяОсновнойСтраницы, ИмяСтраницыНавигации, ИмяСтраницыДекорации = "") diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl index e0bad50c4..f81be7743 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl @@ -583,7 +583,7 @@ ИмяВременногоФайла = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ВыбранноеВложение.Представление; ТабличныйДокумент = ПолучитьТабличныйДокументПоДвоичнымДанным(ВыбранноеВложение.АдресВоВременномХранилище); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ВыбранноеВложение.АдресВоВременномХранилище); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ВыбранноеВложение.АдресВоВременномХранилище); // ДвоичныеДанные ДвоичныеДанные.Записать(ИмяВременногоФайла); Файл = Новый Файл(ИмяВременногоФайла); Файл.УстановитьТолькоЧтение(Истина); @@ -622,7 +622,7 @@ Если ТипЗнч(ДвоичныеДанные) = Тип("Строка") Тогда // Передан адрес двоичных данных во временном хранилище. - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДвоичныеДанные); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДвоичныеДанные); // ДвоичныеДанные КонецЕсли; ИмяФайла = ПолучитьИмяВременногоФайла("mxl"); diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl index 59198092b..c775b711f 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl +++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl @@ -910,7 +910,6 @@ ПараметрыПоиска.Вставить("ИскатьВоВсехРазделах", ИскатьВоВсехРазделах); ПараметрыПоиска.Вставить("ТекущийРазделСсылка", ТекущийРазделСсылка); - ПоискПоСтроке = ЗначениеЗаполнено(СтрокаПоиска); ТолькоТекущийРаздел = РежимНастройки Или Не ЗначениеЗаполнено(СтрокаПоиска) Или ИскатьВоВсехРазделах = 0; Если ТолькоТекущийРаздел Тогда ТаблицаПодсистем = ПодсистемыПрограммы.Выгрузить(Новый Структура("РазделСсылка", ТекущийРазделСсылка)); @@ -1610,14 +1609,14 @@ // СтрокаРодителя - см. ДеревоРаспределения // СтрокаДерева - см. ДеревоРаспределения // Рекурсия - Структура: -// ** ВсегоОсталосьВывести - Число -// ** СвободноКолонок - Число -// ** КоличествоКолонок - Число -// ** ГруппаУровня3Отсечка - Число -// ** НомерТекущейКолонки - Число -// ** ЭтоПоследняяКолонка - Булево -// ** СвободноСтрок - Число -// ** НачатВыводВТекущейКолонке - Булево +// * ВсегоОсталосьВывести - Число +// * СвободноКолонок - Число +// * КоличествоКолонок - Число +// * ГруппаУровня3Отсечка - Число +// * НомерТекущейКолонки - Число +// * ЭтоПоследняяКолонка - Булево +// * СвободноСтрок - Число +// * НачатВыводВТекущейКолонке - Булево // ПараметрыЗаполнения - см. ВариантыОтчетов.ВариантыОтчетовДляВывода // &НаСервере diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl index c94284b22..3e22419e1 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl @@ -414,7 +414,7 @@ // обрезается до первого пробела. // // Параметры: -// АдресПроксиСервера (Строка) - нормализуемый адрес прокси-сервера. +// АдресПроксиСервера - Строка - нормализуемый адрес прокси-сервера. // // Возвращаемое значение: // Строка - нормализованный адрес прокси-сервера. diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form index 45c60b676..9241881a0 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Form.form +++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form @@ -282,6 +282,34 @@ UserCmds Auto
    + + Язык + 284 + true + true + + true + + + <key>ru</key> + <value>Язык</value> + + + ЯзыкРасширеннаяПодсказка + 285 + Label + true + true + + Left + + + Popup + + Auto + Normal + + true true @@ -2767,6 +2795,47 @@ true + + ДоступенВыводНаДругихЯзыках + 13 + + Boolean + + + true + + + true + + + + ТекущийЯзык + 14 + + String + + + + true + + + true + + + + ДоступныеЯзыки + 15 + + String + + + + true + + + true + + ПечатнаяФормаОбразец @@ -3124,6 +3193,20 @@ РазвернутьОбластьПоказателей + + ТекущийЯзык + 10 + + String + + + + true + + + true + + Отправить diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl index fbfd24684..6028d8e93 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -104,6 +104,11 @@ ИнтеграцияПодсистемБСП.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм()); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -211,7 +216,7 @@ И Источник.ВладелецФормы = ЭтотОбъект Тогда Макет = Параметр.ТабличныйДокумент; АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет); - ЗаписатьМакет(Параметр.ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище); + ЗаписатьМакет(Параметр.ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище, Параметр.КодЯзыка); ПодключитьОбработчикОжидания("ОбновитьТекущуюПечатнуюФорму",0.1,Истина); КонецЕсли; @@ -453,6 +458,20 @@ КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_ПереключитьЯзык(Команда) + + УправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт + + ОбновитьТекущуюПечатнуюФорму(); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -488,6 +507,9 @@ Результат = Неопределено; // Формирование табличных документов. Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда + Если ТипЗнч(ПараметрыВывода) = Тип("Структура") И ПараметрыВывода.Свойство("КодЯзыка") Тогда + ПараметрыВывода.КодЯзыка = ТекущийЯзык; + КонецЕсли; УправлениеПечатью.ПечатьПоВнешнемуИсточнику( Параметры.ИсточникДанных, Параметры.ПараметрыИсточника, @@ -502,7 +524,7 @@ Параметры.ПараметрыПечати.Свойство("ДополнительныеПараметры", ДополнительныеПараметры); ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов, - Параметры.ПараметрКоманды, ДополнительныеПараметры, ТипыОбъектовПечати); + Параметры.ПараметрКоманды, ДополнительныеПараметры, ТипыОбъектовПечати, ТекущийЯзык); ОбъектыПечати = ПечатныеФормы.ОбъектыПечати; ПараметрыВывода = ПечатныеФормы.ПараметрыВывода; Результат = ПечатныеФормы.КоллекцияПечатныхФорм; @@ -592,6 +614,13 @@ НоваяНастройкаПечатнойФормы.ИмяФайлаПечатнойФормы = ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ИмяФайлаПечатнойФормы); НоваяНастройкаПечатнойФормы.ОфисныеДокументы = ?(ПустаяСтрока(ОписаниеПечатнойФормы.ОфисныеДокументы), "", ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ОфисныеДокументы)); НоваяНастройкаПечатнойФормы.ПодписьИПечать = ЕстьПодписьИПечать(ОписаниеПечатнойФормы.ТабличныйДокумент); + НоваяНастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках = ОписаниеПечатнойФормы.ДоступенВыводНаДругихЯзыках; + Если ЗначениеЗаполнено(НоваяНастройкаПечатнойФормы.ПутьКМакету) Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + НоваяНастройкаПечатнойФормы.ДоступныеЯзыки = СтрСоединить(МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(НоваяНастройкаПечатнойФормы.ПутьКМакету), ","); + КонецЕсли; + КонецЕсли; ПечатьОфисныхДокументов = ПечатьОфисныхДокументов ИЛИ НЕ ПустаяСтрока(НоваяНастройкаПечатнойФормы.ОфисныеДокументы); @@ -804,6 +833,8 @@ УстановитьДоступностьИзмененияМакета(); УстановитьДоступностьКомандВывода(); + Элементы.Язык.Доступность = НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках; + КонецПроцедуры &НаСервере @@ -890,7 +921,7 @@ Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение); Если ЗаписьZipФайла <> Неопределено Тогда - ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ); // ДвоичныеДанные - ДвоичныеДанные.Записать(ПолноеИмяФайла); @@ -951,7 +982,7 @@ ИмяФайла = ИмяФайла + "." + НастройкиФормата.Расширение; - ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла); Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда @@ -1057,7 +1088,7 @@ ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога); Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлДляЗаписи.АдресВоВременномХранилище); // ДвоичныеДанные - - ДвоичныеДанные.Записать(УникальноеИмяФайла(ИмяКаталога + ФайлДляЗаписи.Представление)); + ДвоичныеДанные.Записать(ФайловаяСистемаКлиент.УникальноеИмяФайла(ИмяКаталога + ФайлДляЗаписи.Представление)); КонецЦикла; ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение успешно завершено'"), "file:///" + ИмяКаталога, @@ -1065,24 +1096,6 @@ КонецПроцедуры -&НаКлиентеНаСервереБезКонтекста -Функция УникальноеИмяФайла(ИмяФайла) - - Файл = Новый Файл(ИмяФайла); - ИмяБезРасширения = Файл.ИмяБезРасширения; - Расширение = Файл.Расширение; - ИмяКаталога = Файл.Путь; - - Счетчик = 1; - Пока Файл.Существует() Цикл - Счетчик = Счетчик + 1; - Файл = Новый Файл(ИмяКаталога + ИмяБезРасширения + " (" + Счетчик + ")" + Расширение); - КонецЦикла; - - Возврат Файл.ПолноеИмя; - -КонецФункции - &НаСервере Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище, ОбъектДляПрисоединения) Результат = Новый Массив; @@ -1175,7 +1188,7 @@ Для Каждого ПодписиИПечатиОбъекта Из ПодписиИПечатиОбъектов Цикл КоллекцияПодписейИПечатей = ПодписиИПечатиОбъекта.Значение; Для Каждого ПодписьПечать Из КоллекцияПодписейИПечатей Цикл - Картинка = ПодписьПечать.Значение; + Картинка = ПодписьПечать.Значение; // Картинка Если Картинка.Вид <> ВидКартинки.Пустая Тогда Возврат Истина; КонецЕсли; @@ -1201,6 +1214,7 @@ ПараметрыОткрытия.Вставить("ИмяДокумента", НастройкаПечатнойФормы.Представление); ПараметрыОткрытия.Вставить("ТипМакета", "MXL"); ПараметрыОткрытия.Вставить("Редактирование", Истина); + ПараметрыОткрытия.Вставить("КодЯзыка", СтрРазделить(ТекущийЯзык, "_", Истина)[0]); ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект); @@ -1291,6 +1305,9 @@ КонецЕсли; ПереформироватьПечатнуюФорму(НастройкаПечатнойФормы.ИмяМакета, НастройкаПечатнойФормы.ИмяРеквизита); + НастройкаПечатнойФормы.ТекущийЯзык = ТекущийЯзык; + + ДобавитьУдалитьПодписьПечать(); ОтобразитьСостояниеТекущейПечатнойФормы(); КонецПроцедуры @@ -1320,8 +1337,8 @@ КонецФункции &НаСервереБезКонтекста -Процедура ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище) - УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище); +Процедура ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище, КодЯзыка) + УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище, КодЯзыка); КонецПроцедуры &НаКлиенте @@ -1353,7 +1370,7 @@ КонецПроцедуры // Параметры: -// ВыбранныеПараметры - см. УправлениеПечатью.НастройкиСохранения +// ВыбранныеПараметры - см. УправлениеПечатью.НастройкиСохранения // &НаСервере Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры) @@ -1517,9 +1534,9 @@ КонецФункции // Параметры: -// ТабличныйДокумент - ТабличныйДокумент +// ТабличныйДокумент - ТабличныйДокумент // Возвращаемое значение: -// Булево +// Булево // &НаСервереБезКонтекста Функция ЕстьПодписьИПечать(ТабличныйДокумент) @@ -1582,7 +1599,6 @@ &НаСервере Процедура УбратьПодписьИПечать() - ПодписиИПечати = Новый Структура; СкрыватьПодписиИПечати = УправлениеПечатью.НастройкиПечати().СкрыватьПодписиИПечатиДляРедактирования; Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл @@ -1662,4 +1678,24 @@ ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма"); КонецПроцедуры +&НаСервере +Функция ДоступныеЯзыкиПечатныхФорм() + + Результат = Новый Массив; + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл + Если Не НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках Тогда + Продолжить; + КонецЕсли; + Для Каждого КодЯзыка Из СтрРазделить(НастройкаПечатнойФормы.ДоступныеЯзыки, ",", Ложь) Цикл + Если Результат.Найти(КодЯзыка) = Неопределено Тогда + Результат.Добавить(КодЯзыка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form b/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form index 9104f8e36..6e6def019 100644 --- a/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form +++ b/SSL/src/CommonForms/ПоддерживаемыеКлиентскиеПриложения/Form.form @@ -536,10 +536,6 @@ <userVisible> <common>true</common> </userVisible> - <title> - <key>ru</key> - <value>Windows</value> - true ГруппаWindowsРасширеннаяПодсказка @@ -961,10 +957,6 @@ true - - <key>ru</key> - <value>Linux</value> - true ГруппаLinuxРасширеннаяПодсказка @@ -1193,10 +1185,6 @@ true - - <key>ru</key> - <value>Mac OS</value> - true ГруппаMacOSРасширеннаяПодсказка @@ -1224,10 +1212,6 @@ true - - <key>ru</key> - <value>Подсказка</value> - ПодсказкаРасширеннаяПодсказка 4 diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl index 46987d1bd..dee7aee67 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl @@ -347,6 +347,7 @@ Индекс = 0; ФлагПоиска = Истина; + Имя = ""; Пока ФлагПоиска Цикл ИндексСтрока = Строка(Формат(Индекс, "ЧН=-")); ИндексСтрока = СтрЗаменить(ИндексСтрока, "-", ""); @@ -354,12 +355,14 @@ НайденныйЭлемент = Элементы.Найти(Имя); Если НайденныйЭлемент = Неопределено Тогда - Возврат Имя; + Прервать; КонецЕсли; Индекс = Индекс + 1; КонецЦикла; -КонецФункции + + Возврат Имя; +КонецФункции &НаКлиенте Функция ИдентификаторМассиваЗадачПоИмени(ИмяЭлемента) diff --git a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form index 7a75822a2..ee05d0c55 100644 --- a/SSL/src/CommonForms/ПустойРабочийСтол/Form.form +++ b/SSL/src/CommonForms/ПустойРабочийСтол/Form.form @@ -82,10 +82,6 @@ true - - <key>ru</key> - <value>Тестовый режим</value> - ТестовыйРежимРасширеннаяПодсказка 2 diff --git a/SSL/src/CommonForms/Расширения/Module.bsl b/SSL/src/CommonForms/Расширения/Module.bsl index 4b0fe32bf..b0a453a47 100644 --- a/SSL/src/CommonForms/Расширения/Module.bsl +++ b/SSL/src/CommonForms/Расширения/Module.bsl @@ -750,9 +750,9 @@ // Параметры: // ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла -// МодульОбновлениеКонфигурацииКлиент - CommonModule.ОбновлениеКонфигурацииКлиент +// МодульОбновлениеКонфигурацииКлиент - CommonModule.ОбновлениеКонфигурацииКлиент // Возвращаемое значение: -// Булево +// Булево // &НаКлиенте Функция ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) @@ -919,7 +919,6 @@ КонецЕсли; КонецЦикла; Иначе - ОписаниеНовыхРасширений = Новый СписокЗначений; Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение); ОписаниеРасширения = Новый ОписаниеКонфигурации(ДвоичныеДанныеФайла); diff --git a/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl b/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl index 01448a001..1faa3c404 100644 --- a/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl +++ b/SSL/src/CommonForms/РегиональныеНастройки/Module.bsl @@ -260,14 +260,10 @@ Элементы.Страницы.ТекущаяСтраница = Элементы.Ожидание; Элементы.ОК.Доступность = Ложь; - ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект); - Задание = ЗапуститьФоновоеПерезаполнениеНаСервере(УникальныйИдентификатор); - ИдентификаторЗадания = Задание.ИдентификаторЗадания; НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); НастройкиОжидания.ВыводитьОкноОжидания = Ложь; - НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; Обработчик = Новый ОписаниеОповещения("ПослеФоновогоПерезаполнения", ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания); @@ -313,23 +309,6 @@ КонецПроцедуры -&НаСервереБезКонтекста -Функция ПрочитатьПрогресс(ИдентификаторЗадания) - Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания); -КонецФункции - -&НаКлиенте -Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт - - Если Результат.Статус = "Выполняется" Тогда - Прогресс = ПрочитатьПрогресс(Результат.ИдентификаторЗадания); - Если Прогресс <> Неопределено Тогда - ТекстСостоянияОчистки = Прогресс.Текст; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - &НаКлиенте Функция ДанныеКорректны() diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form index dae88e1a6..457b98e4f 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form @@ -136,6 +136,89 @@ + + Язык + 265 + true + true + + true + + + <key>ru</key> + <value>Язык</value> + + + ЯзыкРасширеннаяПодсказка + 266 + Label + true + true + + Left + + + Popup + + Auto + Normal + + + + Перевести + 267 + true + true + + true + + + ПеревестиРасширеннаяПодсказка + 268 + Label + true + true + + Left + + + Form.Command.Перевести + Normal + Auto + true + true + UserCmds + Auto + + + КнопкаПоказатьСкрытьОригинал + 274 + true + true + + true + + + КнопкаПоказатьСкрытьОригиналРасширеннаяПодсказка + 275 + Label + true + true + + Left + + + Form.Command.ПоказатьСкрытьОригинал + Normal + Auto + true + true + UserCmds + + StdPicture.Document + + Auto + ВсеДействия 83 @@ -395,7 +478,9 @@ Left - + + Compact + Начертание @@ -527,7 +612,9 @@ Left - + + Compact + Выравнивание @@ -1343,21 +1430,136 @@ Auto - - ТабличныйДокумент - 1 + + Макеты + 272 + + ПоставляемыйМакет + 269 + true + + true + + + ПоставляемыйМакет + + + ПоставляемыйМакетРасширеннаяПодсказка + 271 + Label + true + true + + Left + + + + ПоставляемыйМакетКонтекстноеМеню + 270 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + OnActivate + ПоставляемыйМакетПриАктивизации + + 50 + true + 10 + true + true + true + true + true + true + true + Special + ScrollAuto + ScrollAuto + Always + Auto + true + true + true + + + + ТабличныйДокумент + 1 + + <key>ru</key> + <value>Измененный макет</value> + + true + true + + true + + + ТабличныйДокумент + + None + + ТабличныйДокументExtendedTooltip + 144 + Label + true + true + + Left + + + + ТабличныйДокументКонтекстноеМеню + 2 + true + + SpreadsheetDocumentField + Enter + true + Left + true + + + OnActivate + ТабличныйДокументПриАктивизации + + 50 + true + 10 + true + true + true + true + true + Special + ScrollAlways + ScrollAlways + Always + Auto + true + true + true + true + + true true true - - ТабличныйДокумент - - None + + <key>ru</key> + <value>Макеты</value> + - ТабличныйДокументExtendedTooltip - 144 + МакетыРасширеннаяПодсказка + 273 Label true true @@ -1365,38 +1567,14 @@ Left
    - - ТабличныйДокументКонтекстноеМеню - 2 - true - - SpreadsheetDocumentField - Enter - true - Left - true - - - OnActivate - ТабличныйДокументПриАктивизации - - 50 - true - 10 - true - true - true - true - true - Special - ScrollAlways - ScrollAlways - Always - Auto - true - true - true - true + UsualGroup + + AlwaysHorizontal + Auto + true + true + Auto + Auto None @@ -1493,6 +1671,77 @@ true + + Язык + 1 + + CatalogRef.ЯзыкиПечатныхФорм + + + true + + + true + + + + ТекущийЯзык + 6 + + String + + + + true + + + true + + + + ТребуетсяПеревод + 7 + + Boolean + + + true + + + true + + + + ПоставляемыйМакет + + <key>ru</key> + <value>Поставляемый макет</value> + + 8 + + SpreadsheetDocument + + + true + + + true + + + + + ДоступенАвтоматическийПеревод + 9 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть @@ -1663,6 +1912,50 @@ <currentRowUse>DontUse</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>Перевести</name> + <title> + <key>ru</key> + <value>Перевести</value> + + 2 + + ru + Перевести + + + true + + + + Перевести + + + Auto + Auto + + + ПоказатьСкрытьОригинал + + <key>ru</key> + <value>Показывать поставляемый макет</value> + + 4 + + ru + Показать скрыть оригинал + + + true + + + + ПоказатьСкрытьОригинал + + + Auto + Auto + ТабличныйДокумент @@ -1709,6 +2002,13 @@ true + + КодЯзыка + + String + + + diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl index 23de51919..a2a60ab7e 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl @@ -18,7 +18,7 @@ Если Параметры.ТабличныйДокумент = Неопределено Тогда Если Не ПустаяСтрока(Параметры.ИмяОбъектаМетаданныхМакета) Тогда РедактированиеЗапрещено = Не Параметры.Редактирование; - ЗагрузитьТабличныйДокументИзМетаданных(); + ЗагрузитьТабличныйДокументИзМетаданных(Параметры.КодЯзыка); КонецЕсли; ИначеЕсли ТипЗнч(Параметры.ТабличныйДокумент) = Тип("ТабличныйДокумент") Тогда @@ -47,6 +47,15 @@ Элементы.ТабличныйДокумент.ОтображатьИменаСтрокИКолонок = ТабличныйДокумент.Макет; Элементы.ТабличныйДокумент.ОтображатьИменаЯчеек = ТабличныйДокумент.Макет; + Если ЭтоМакет Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, Параметры.КодЯзыка); + ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык); + КонецЕсли; + КонецЕсли; + Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод; + Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы, "КоманднаяПанель", "Видимость", Ложь); @@ -83,16 +92,7 @@ Возврат; КонецЕсли; - ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу); - ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", Параметры.ИмяОбъектаМетаданныхМакета); - Если ЗаписьВыполнена Тогда - ИмяСобытия = "Запись_ТабличныйДокумент"; - ПараметрыОповещения.Вставить("ТабличныйДокумент", ТабличныйДокумент); - Иначе - ИмяСобытия = "ОтменаРедактированияТабличногоДокумента"; - КонецЕсли; - Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект); + ОповеститьОЗаписиТабличногоДокумента(); КонецПроцедуры @@ -122,6 +122,14 @@ &НаКлиенте Процедура ТабличныйДокументПриАктивизации(Элемент) ОбновитьПометкиКнопокКоманднойПанели(); + СинхронизироватьОбластьПросмотраМакетов(); +КонецПроцедуры + +&НаКлиенте +Процедура ПоставляемыйМакетПриАктивизации(Элемент) + + СинхронизироватьОбластьПросмотраМакетов(); + КонецПроцедуры #КонецОбласти @@ -139,6 +147,7 @@ &НаКлиенте Процедура Записать(Команда) ЗаписатьТабличныйДокумент(); + ОповеститьОЗаписиТабличногоДокумента(); КонецПроцедуры &НаКлиенте @@ -203,16 +212,45 @@ КонецПроцедуры +&НаКлиенте +Процедура Перевести(Команда) + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполнить автоматический перевод на %1 язык?'"), Элементы.Язык.Заголовок); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'")); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки); + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции &НаСервере -Процедура ЗагрузитьТабличныйДокументИзМетаданных() +Процедура ЗагрузитьТабличныйДокументИзМетаданных(Знач КодЯзыка = Неопределено) + + ТребуетсяПеревод = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); - ТабличныйДокумент = МодульУправлениеПечатью.МакетПечатнойФормы(Параметры.ИмяОбъектаМетаданныхМакета); + ТабличныйДокумент = МодульУправлениеПечатью.МакетПечатнойФормы(Параметры.ИмяОбъектаМетаданныхМакета, КодЯзыка); + ПоставляемыйМакет = МодульУправлениеПечатью.ПоставляемыйМакет(Параметры.ИмяОбъектаМетаданныхМакета, КодЯзыка); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + ДоступныеЯзыкиТабличногоДокумента = МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(Параметры.ИмяОбъектаМетаданныхМакета); + ТребуетсяПеревод = ДоступныеЯзыкиТабличногоДокумента.Найти(КодЯзыка) = Неопределено; + КонецЕсли; + + ДоступенАвтоматическийПеревод = МодульУправлениеПечатьюМультиязычность.ДоступенАвтоматическийПеревод(ТекущийЯзык); + Элементы.Перевести.Видимость = ДоступенАвтоматическийПеревод; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -290,7 +328,7 @@ КонецФункции // Возвращаемое значение: -// Массив из ОбластьЯчеекТабличногоДокумента +// Массив из ОбластьЯчеекТабличногоДокумента // &НаКлиенте Функция СписокОбластейДляИзмененияШрифта() @@ -559,4 +597,180 @@ КонецПроцедуры +&НаКлиенте +Процедура Подключаемый_ПереключитьЯзык(Команда) + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); + МодульУправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт + + ЗагрузитьТабличныйДокументИзМетаданных(КодЯзыка); + Если ТребуетсяПеревод Тогда + Если ДоступенАвтоматическийПеревод Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Макет еще не переведен на %1 язык. + |Выполнить автоматический перевод?'"), Элементы.Язык.Заголовок); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Выполнить перевод'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не выполнять'")); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриОтветеНаВопросОПереводеМакета", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОтветеНаВопросОПереводеМакета(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ПеревестиТекстыМакета(); + +КонецПроцедуры + +&НаСервере +Процедура ПеревестиТекстыМакета() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Иначе + Возврат; + КонецЕсли; + + ТекстыЯчеек = Новый Соответствие; + + Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл + Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл + Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки); + Если ЗначениеЗаполнено(Область.Текст) Тогда + Текст = УбратьПараметрыИзТекста(Область.Текст).Текст; + ТекстыЯчеек.Вставить(Текст, Истина); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ТекстыДляПеревода = Новый Массив; + Для Каждого Элемент Из ТекстыЯчеек Цикл + ТекстыДляПеревода.Добавить(Элемент.Ключ); + КонецЦикла; + + Переводы = МодульПереводТекстаНаДругиеЯзыки.ПеревестиТексты(ТекстыДляПеревода, ТекущийЯзык, ОбщегоНазначения.КодОсновногоЯзыка()); + + Для НомерСтроки = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл + Для НомерКолонки = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл + Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки); + Если ЗначениеЗаполнено(Область.Текст) Тогда + РезультатОбработки = УбратьПараметрыИзТекста(Область.Текст); + Текст = РезультатОбработки.Текст; + Если ЗначениеЗаполнено(Переводы[Текст]) Тогда + Область.Текст = ВернутьПараметрыВТекст(Переводы[Текст], РезультатОбработки.Параметры); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Модифицированность = Истина; + +КонецПроцедуры + +&НаСервере +Функция УбратьПараметрыИзТекста(Знач Текст) + + НайденныеПараметры = Новый Массив; + + ЧастиСтроки = СтрРазделить(Текст, "[]", Истина); + Для Индекс = 1 По ЧастиСтроки.ВГраница() Цикл + НайденныеПараметры.Добавить("[" + ЧастиСтроки[Индекс] + "]"); + Индекс = Индекс + 1; + КонецЦикла; + + ОбработанныеПараметры = Новый Массив; + Счетчик = 0; + Для Каждого Параметр Из НайденныеПараметры Цикл + Если СтрНайти(Текст, Параметр) Тогда + Счетчик = Счетчик + 1; + Идентификатор = "%" + XMLСтрока(Счетчик); + Текст = СтрЗаменить(Текст, Параметр, Идентификатор); + ОбработанныеПараметры.Добавить(Параметр); + КонецЕсли; + КонецЦикла; + + Результат = Новый Структура; + Результат.Вставить("Текст", Текст); + Результат.Вставить("Параметры", ОбработанныеПараметры); + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ВернутьПараметрыВТекст(Знач Текст, ОбработанныеПараметры) + + Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(Текст, ОбработанныеПараметры); + +КонецФункции + +&НаКлиенте +Процедура ПоказатьСкрытьОригинал(Команда) + + Элементы.КнопкаПоказатьСкрытьОригинал.Пометка = Не Элементы.КнопкаПоказатьСкрытьОригинал.Пометка; + Элементы.ПоставляемыйМакет.Видимость = Элементы.КнопкаПоказатьСкрытьОригинал.Пометка; + Если Элементы.КнопкаПоказатьСкрытьОригинал.Пометка Тогда + Элементы.ТабличныйДокумент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + Иначе + Элементы.ТабличныйДокумент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СинхронизироватьОбластьПросмотраМакетов() + + Если Не Элементы.ПоставляемыйМакет.Видимость Тогда + Возврат; + КонецЕсли; + + УправляемыйЭлемент = Элементы.ПоставляемыйМакет; + Если ТекущийЭлемент <> Элементы.ТабличныйДокумент Тогда + УправляемыйЭлемент = Элементы.ТабличныйДокумент; + КонецЕсли; + + Область = ТекущийЭлемент.ТекущаяОбласть; + Если Область = Неопределено Тогда + Возврат; + КонецЕсли; + + УправляемыйЭлемент.ТекущаяОбласть = ЭтотОбъект[ТекущийЭлемент.Имя].Область( + Область.Верх, Область.Лево, Область.Низ, Область.Право); + +КонецПроцедуры + +&НаКлиенте +Процедура ОповеститьОЗаписиТабличногоДокумента() + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу); + ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", Параметры.ИмяОбъектаМетаданныхМакета); + ПараметрыОповещения.Вставить("КодЯзыка", ТекущийЯзык); + + Если ЗаписьВыполнена Тогда + ИмяСобытия = "Запись_ТабличныйДокумент"; + ПараметрыОповещения.Вставить("ТабличныйДокумент", ТабличныйДокумент); + Иначе + ИмяСобытия = "ОтменаРедактированияТабличногоДокумента"; + КонецЕсли; + Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl index 79fda82ef..ccb49d642 100644 --- a/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl +++ b/SSL/src/CommonForms/СвязанныеДокументы/Module.bsl @@ -470,10 +470,11 @@ "ВЫБРАТЬ РАЗРЕШЕННЫЕ | 1 |ИЗ - | " + ОсновнойОбъект.Метаданные().ПолноеИмя() + " КАК Таб + | &ИмяТаблицы КАК Таб |ГДЕ | Таб.Ссылка = &ТекущийОбъект |"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицы", ОсновнойОбъект.Метаданные().ПолноеИмя()); Запрос.УстановитьПараметр("ТекущийОбъект", ОсновнойОбъект); Возврат Не Запрос.Выполнить().Пустой(); @@ -498,17 +499,18 @@ ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Ссылка, - | #Проведен, + | &Проведен КАК Проведен, | ПометкаУдаления, - | #Сумма , - | #Валюта, - | #Представление + | &Сумма КАК СуммаДокумента, + | &Валюта КАК Валюта, + | &Представление |ИЗ - | " + МетаданныеОбъекта.ПолноеИмя() + " + | &ИмяТаблицы |ГДЕ | Ссылка = &Ссылка |"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", МетаданныеОбъекта.ПолноеИмя()); Если ОбщегоНазначения.ЭтоДокумент(МетаданныеОбъекта) Тогда ИмяРеквизитаСумма = ИмяРеквизитаДокумента(МетаданныеОбъекта, "СуммаДокумента"); ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеОбъекта, "Валюта"); @@ -519,9 +521,9 @@ ИмяРеквизитаПроведен = "Ложь"; КонецЕсли; - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "#Проведен", ИмяРеквизитаПроведен, "Проведен", Истина); - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "#Сумма", ИмяРеквизитаСумма, "СуммаДокумента"); - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "#Валюта", ИмяРеквизитаВалюта, "Валюта"); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Проведен", ИмяРеквизитаПроведен, Истина); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Сумма", ИмяРеквизитаСумма); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, "&Валюта", ИмяРеквизитаВалюта); МассивДопРеквизитов = РеквизитыДляПредставления(МетаданныеОбъекта.ПолноеИмя(), МетаданныеОбъекта.Имя); ДополнитьТекстЗапросаПоРеквизитамОбъекта(ТекстЗапроса, МассивДопРеквизитов); @@ -692,7 +694,7 @@ // СтрокаРодитель - ДанныеФормыДерево // - ДанныеФормыЭлементДерева - родитель, для // которого предполагается добавить строку дерева. -// ИскомыйОбъект - Ссылка - ссылка на объект метаданных, на наличие которого выполняется проверка. +// ИскомыйОбъект - ЛюбаяСсылка - ссылка на объект метаданных, на наличие которого выполняется проверка. // // Возвращаемое значение: // Булево - Истина если найден, Ложь в обратном случае. @@ -721,13 +723,10 @@ КонецФункции &НаСервере -Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, ЧтоЗаменять, ИмяРеквизита, Представление, НеИскатьВРеквизитах = Ложь) +Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеОбъекта, ЧтоЗаменять, ИмяРеквизита, НеИскатьВРеквизитах = Ложь) - Если НеИскатьВРеквизитах Или МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, ИмяРеквизита + " КАК " + Представление); - Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, " NULL КАК " + Представление); - КонецЕсли; + ЕстьРеквизит = НеИскатьВРеквизитах Или МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) <> Неопределено; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, ?(ЕстьРеквизит, ИмяРеквизита, "NULL")); КонецПроцедуры @@ -794,7 +793,7 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// - Ссылка - СправочникСсылка +// * Ссылка - СправочникСсылка // - ДокументСсылка // &НаСервере @@ -860,8 +859,18 @@ Возврат; КонецЕсли; - ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ ("; - ТекстЗапросаКонец = ") КАК ПодчиненныеОбъекты УПОРЯДОЧИТЬ ПО ПодчиненныеОбъекты.Дата"; + ШаблонПодзапроса = "ВЫБРАТЬ + | &Дата КАК Дата, + | Ссылка, + | &Проведен КАК Проведен, + | ПометкаУдаления, + | &СуммаДокумента КАК СуммаДокумента, + | &Валюта КАК Валюта, + | &Представление + |ИЗ + | &ИмяТаблицы + |ГДЕ + | Ссылка В (&ИмяОбъекта)"; Запрос = Новый Запрос; ТекстЗапроса = ""; @@ -874,29 +883,34 @@ Продолжить; КонецЕсли; - ТекстПоТипуОбъекта = " - |" + КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Дата"] + " КАК Дата, - | Ссылка, - |" + КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Проведен"] + " КАК Проведен, - | ПометкаУдаления, - |" + КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["СуммаДокумента"] + " КАК СуммаДокумента, - |" + КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Валюта"] + " КАК Валюта, - | #Представление - |ИЗ - | " + КлючИЗначение.Ключ + " - |ГДЕ - | Ссылка В (&" + ИмяОбъекта + ")"; - + ТекстПоТипуОбъекта = СтрЗаменить(ШаблонПодзапроса, "&Дата", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Дата"]); + ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&Проведен", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Проведен"]); + ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&СуммаДокумента", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["СуммаДокумента"]); + ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&Валюта", КэшРеквизитовОбъекта[КлючИЗначение.Ключ]["Валюта"]); + ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&ИмяТаблицы", КлючИЗначение.Ключ); + ТекстПоТипуОбъекта = СтрЗаменить(ТекстПоТипуОбъекта, "&ИмяОбъекта", "&" + ИмяОбъекта); Запрос.УстановитьПараметр(ИмяОбъекта, КлючИЗначение.Значение); МассивДопРеквизитов = РеквизитыДляПредставления(КлючИЗначение.Ключ, ИмяОбъекта); ДополнитьТекстЗапросаПоРеквизитамОбъекта(ТекстПоТипуОбъекта, МассивДопРеквизитов); - ТекстЗапроса = ТекстЗапроса + ?(ТекстЗапроса = "", " ВЫБРАТЬ ", " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ") + ТекстПоТипуОбъекта; + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + " + | ОБЪЕДИНИТЬ ВСЕ + |"; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + ТекстПоТипуОбъекта; КонецЦикла; - Запрос.Текст = ТекстЗапросаНачало + ТекстЗапроса + ТекстЗапросаКонец; + ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | * + |ИЗ + | (ВЫБРАТЬ 1 ИЗ #Подзапрос) КАК ПодчиненныеОбъекты + |УПОРЯДОЧИТЬ ПО + | ПодчиненныеОбъекты.Дата"; + + Запрос.Текст = СтрЗаменить(ШаблонЗапроса, "ВЫБРАТЬ 1 ИЗ #Подзапрос", ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл @@ -1053,7 +1067,7 @@ КонецЦикла; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#Представление", ТекстПредставление); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представление", ТекстПредставление); КонецПроцедуры @@ -1216,6 +1230,14 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * Пояснение - Строка +// * Ссылка - Строка +// * Оповещение - Строка +// * Вопрос - Строка +// * Пометка - Булево +// &НаКлиенте Функция СценарийИзмененияПометкиУдаления(ВыбранныеЭлементы, СтатистикаПоВыбраннымЭлементам) @@ -1291,6 +1313,10 @@ КонецФункции +// Параметры: +// Ответ - КодВозвратаДиалога +// Сценарий - см. СценарийИзмененияПометкиУдаления +// &НаКлиенте Процедура ВыполнитьСценарийИзмененияПометкиУдаления(Ответ, Сценарий) Экспорт @@ -1406,7 +1432,7 @@ Иначе - ВыбранныйОбъект = Документ.ПолучитьОбъект(); + ВыбранныйОбъект = Документ.ПолучитьОбъект(); // ДокументОбъект ВыбранныйОбъект.Записать(Режим); ОбработанныеДокументы.Вставить(Документ, СвойстваДокумента.Представление); diff --git a/SSL/src/CommonForms/Сертификат/Form.form b/SSL/src/CommonForms/Сертификат/Form.form index df3b1a941..318c9cf25 100644 --- a/SSL/src/CommonForms/Сертификат/Form.form +++ b/SSL/src/CommonForms/Сертификат/Form.form @@ -257,10 +257,6 @@ true - - <key>ru</key> - <value>Основное назначение</value> - ВертикальнаяГруппаРасширеннаяПодсказка 132 @@ -391,10 +387,6 @@ Субъект 105 - - <key>ru</key> - <value>Субъект</value> - true true @@ -645,10 +637,6 @@ Издатель 115 - - <key>ru</key> - <value>Издатель</value> - true true @@ -989,10 +977,6 @@ ВнутреннееСодержание 95 - - <key>ru</key> - <value>Внутреннее содержание</value> - true true @@ -1290,10 +1274,6 @@ true - - <key>ru</key> - <value>Страницы</value> - СтраницыРасширеннаяПодсказка 21 diff --git a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form index 96f194005..65dc42c20 100644 --- a/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form +++ b/SSL/src/CommonForms/СохранениеВместеСЭлектроннойПодписью/Form.form @@ -52,10 +52,6 @@ true - - <key>ru</key> - <value>Представление данных</value> - ГруппаПредставлениеДанныхРасширеннаяПодсказка 87 @@ -83,10 +79,6 @@ ТаблицаПодписей 34 - - <key>ru</key> - <value>Таблица подписей</value> - true true diff --git a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form index f84814d16..057246059 100644 --- a/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form +++ b/SSL/src/CommonForms/УстановкаВнешнейКомпонентыНевозможна/Form.form @@ -94,10 +94,6 @@ true - - <key>ru</key> - <value>Шапка</value> - ШапкаРасширеннаяПодсказка 91 diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form index 76568caf0..614dd269f 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form @@ -6277,84 +6277,6 @@ - - КомандыСтруктурыВарианта_ДвижениеПоИерархии - 456 - - СтруктураВарианта_ПереместитьВышеИЛевее - 500 - true - true - - true - - - СтруктураВарианта_ПереместитьВышеИЛевееРасширеннаяПодсказка - 501 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ПереместитьВышеИЛевее - Normal - Auto - true - true - UserCmds - Auto - - - СтруктураВарианта_ПереместитьНижеИПравее - 502 - true - true - - true - - - СтруктураВарианта_ПереместитьНижеИПравееРасширеннаяПодсказка - 503 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ПереместитьНижеИПравее - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Команды структуры варианта движение по иерархии</value> - - - КомандыСтруктурыВарианта_ДвижениеПоИерархииРасширеннаяПодсказка - 457 - Label - true - true - - Left - - - - Compact - - КомандыСтруктурыВарианта_ДвижениеВнутриРодителя 462 @@ -6433,6 +6355,162 @@ Compact + + КомандыСтруктурыВарианта_ДвижениеВИерархии + 1363 + + СтруктураВарианта_ПереместитьНаУровеньВыше + 1365 + true + true + + true + + + СтруктураВарианта_ПереместитьНаУровеньВышеРасширеннаяПодсказка + 1366 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНаУровеньВыше + Normal + Auto + true + true + UserCmds + Auto + + + СтруктураВарианта_ПереместитьНаУровеньНиже + 1367 + true + true + + true + + + СтруктураВарианта_ПереместитьНаУровеньНижеРасширеннаяПодсказка + 1368 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНаУровеньНиже + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды структуры варианта движение в иерархии</value> + + + КомандыСтруктурыВарианта_ДвижениеВИерархииРасширеннаяПодсказка + 1364 + Label + true + true + + Left + + + + Compact + + + + КомандыСтруктурыВарианта_ДвижениеПоИерархии + 456 + + СтруктураВарианта_ПереместитьВышеИЛевее + 500 + true + true + + true + + + СтруктураВарианта_ПереместитьВышеИЛевееРасширеннаяПодсказка + 501 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьВышеИЛевее + Normal + Auto + true + true + UserCmds + Auto + + + СтруктураВарианта_ПереместитьНижеИПравее + 502 + true + true + + true + + + СтруктураВарианта_ПереместитьНижеИПравееРасширеннаяПодсказка + 503 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНижеИПравее + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды структуры варианта движение по иерархии</value> + + + КомандыСтруктурыВарианта_ДвижениеПоИерархииРасширеннаяПодсказка + 457 + Label + true + true + + Left + + + + Compact + + КомандыСтруктурыВарианта_Флажки 518 @@ -6884,82 +6962,6 @@ - - КомандыСтруктурыВарианта_ДвижениеПоИерархии1 - 755 - - СтруктураВарианта_ПереместитьВышеИЛевее1 - 757 - true - true - - true - - - СтруктураВарианта_ПереместитьВышеИЛевее1РасширеннаяПодсказка - 758 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ПереместитьВышеИЛевее - Normal - Auto - true - true - UserCmds - Auto - - - СтруктураВарианта_ПереместитьНижеИПравее1 - 759 - true - true - - true - - - СтруктураВарианта_ПереместитьНижеИПравее1РасширеннаяПодсказка - 760 - Label - true - true - - Left - - - Form.Command.СтруктураВарианта_ПереместитьНижеИПравее - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Команды структуры варианта движение по иерархии 1</value> - - - КомандыСтруктурыВарианта_ДвижениеПоИерархии1РасширеннаяПодсказка - 756 - Label - true - true - - Left - - - - КомандыСтруктурыВарианта_ДвижениеВнутриРодителя1 761 @@ -7036,6 +7038,160 @@ + + КомандыСтруктурыВарианта_ДвижениеВИерархии1 + 1369 + + СтруктураВарианта_ПереместитьНаУровеньВыше1 + 1371 + true + true + + true + + + СтруктураВарианта_ПереместитьНаУровеньВыше1РасширеннаяПодсказка + 1372 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНаУровеньВыше + Normal + Auto + true + true + UserCmds + Auto + + + СтруктураВарианта_ПереместитьНаУровеньНиже1 + 1373 + true + true + + true + + + СтруктураВарианта_ПереместитьНаУровеньНиже1РасширеннаяПодсказка + 1374 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНаУровеньНиже + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды структуры варианта движение в иерархии</value> + + + КомандыСтруктурыВарианта_ДвижениеВИерархии1РасширеннаяПодсказка + 1370 + Label + true + true + + Left + + + + Compact + + + + КомандыСтруктурыВарианта_ДвижениеПоИерархии1 + 755 + + СтруктураВарианта_ПереместитьВышеИЛевее1 + 757 + true + true + + true + + + СтруктураВарианта_ПереместитьВышеИЛевее1РасширеннаяПодсказка + 758 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьВышеИЛевее + Normal + Auto + true + true + UserCmds + Auto + + + СтруктураВарианта_ПереместитьНижеИПравее1 + 759 + true + true + + true + + + СтруктураВарианта_ПереместитьНижеИПравее1РасширеннаяПодсказка + 760 + Label + true + true + + Left + + + Form.Command.СтруктураВарианта_ПереместитьНижеИПравее + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Команды структуры варианта движение по иерархии 1</value> + + + КомандыСтруктурыВарианта_ДвижениеПоИерархии1РасширеннаяПодсказка + 756 + Label + true + true + + Left + + + + КомандыСтруктурыВарианта_Флажки1 767 @@ -12816,6 +12972,58 @@ Auto Auto + + СтруктураВарианта_ПереместитьНаУровеньВыше + + <key>ru</key> + <value>Переместить на уровень выше</value> + + 59 + + ru + Переместить на уровень выше + + + true + + + StdPicture.MoveLeft + + + + СтруктураВарианта_ПереместитьНаУровеньВыше + + + Picture + DontUse + Auto + + + СтруктураВарианта_ПереместитьНаУровеньНиже + + <key>ru</key> + <value>Переместить на уровень ниже</value> + + 60 + + ru + Переместить на уровень ниже + + + true + + + StdPicture.MoveRight + + + + СтруктураВарианта_ПереместитьНаУровеньНиже + + + Picture + DontUse + Auto + diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl index 7d464d7b9..4540df2bf 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl @@ -42,7 +42,9 @@ ВызватьИсключение НСтр("ru = 'Не передан служебный параметр ""ВариантНаименование"".'"); КонецЕсли; - КлючСохраненияПоложенияОкна = НастройкиОтчета.ПолноеИмя; + ОписаниеНастроекОтчета = ОписаниеНастроекОтчета(НастройкиОтчета); + + КлючСохраненияПоложенияОкна = ОписаниеНастроекОтчета.ПолноеИмя; Если ЗначениеЗаполнено(КлючТекущегоВарианта) Тогда КлючСохраненияПоложенияОкна = КлючСохраненияПоложенияОкна + "." + КлючТекущегоВарианта; КонецЕсли; @@ -75,7 +77,7 @@ КонецЕсли; Иначе Если Не ЗначениеЗаполнено(ВариантНаименование) Тогда - ВариантНаименование = НастройкиОтчета.Наименование; + ВариантНаименование = ОписаниеНастроекОтчета.Наименование; КонецЕсли; Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -90,8 +92,8 @@ ИмяСтраницы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИмяСтраницы", "СтраницаСоставГруппировки"); РасширенныйРежим = 1; Иначе - РасширенныйРежим = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиОтчета, "ФормаНастроекРасширенныйРежим", 0); - ИмяСтраницы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(НастройкиОтчета, "ФормаНастроекИмяСтраницы", "СтраницаОтборы"); + РасширенныйРежим = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОписаниеНастроекОтчета, "ФормаНастроекРасширенныйРежим", 0); + ИмяСтраницы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ОписаниеНастроекОтчета, "ФормаНастроекИмяСтраницы", "СтраницаОтборы"); КонецЕсли; Страница = Элементы.Найти(ИмяСтраницы); @@ -99,8 +101,8 @@ Элементы.СтраницыНастроек.ТекущаяСтраница = Страница; КонецЕсли; - Если НастройкиОтчета.СхемаМодифицирована Тогда - Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(НастройкиОтчета.АдресСхемы)); + Если ОписаниеНастроекОтчета.СхемаМодифицирована Тогда + Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ОписаниеНастроекОтчета.АдресСхемы)); КонецЕсли; ШрифтВажнойНадписи = Метаданные.ЭлементыСтиля.ВажнаяНадписьШрифт; @@ -328,8 +330,7 @@ КонецЕсли; ЭлементНастройки.Использование = Истина; - ОтчетыКлиент.КэшироватьЗначениеОтбора( - Список, ЭлементНастройки.ИдентификаторПользовательскойНастройки, КомпоновщикНастроек); + ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); ОформитьСписок(Элемент, ЭлементНастройки); КонецПроцедуры @@ -385,8 +386,7 @@ БиблиотекаКартинок.ВыполнитьЗадачу); КонецЕсли; - ОтчетыКлиент.КэшироватьЗначениеОтбора( - Список, ЭлементНастройки.ИдентификаторПользовательскойНастройки, КомпоновщикНастроек); + ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); УстановитьМодифицированность(); КонецПроцедуры @@ -1310,6 +1310,34 @@ СдвинутьСтроки(Контекст); КонецПроцедуры +&НаКлиенте +Процедура СтруктураВарианта_ПереместитьНаУровеньВыше(Команда) + Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии"); + Контекст.Вставить("Направление", -1); + ОпределитьВыделенныеСтроки(Контекст); + + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + ПереместитьВИерархии(Контекст); +КонецПроцедуры + +&НаКлиенте +Процедура СтруктураВарианта_ПереместитьНаУровеньНиже(Команда) + Контекст = НовыйКонтекст("СтруктураВарианта", "ПереместитьВИерархии"); + Контекст.Вставить("Направление", 1); + ОпределитьВыделенныеСтроки(Контекст); + + Если ЗначениеЗаполнено(Контекст.ПричинаОтказа) Тогда + ПоказатьПредупреждение(, Контекст.ПричинаОтказа); + Возврат; + КонецЕсли; + + ПереместитьВИерархии(Контекст); +КонецПроцедуры + &НаКлиенте Процедура СтруктураВарианта_Изменить(Команда) ТаблицаЭлемент = Элементы.СтруктураВарианта; @@ -1733,6 +1761,19 @@ #Область СлужебныеПроцедурыИФункции +// Параметры: +// Описание - см. ВариантыОтчетов.НастройкиФормыОтчета +// +// Возвращаемое значение: +// см. ВариантыОтчетов.НастройкиФормыОтчета +// +&НаКлиентеНаСервереБезКонтекста +Функция ОписаниеНастроекОтчета(Описание) + + Возврат Описание; + +КонецФункции + #Область ПоляГруппировки // Чтение настроек. @@ -2097,7 +2138,7 @@ Отчет.КомпоновщикНастроек, "Отбор", ИдентификаторЭлементаСтруктурыНастроек); Если ИдентификаторСтроки = Неопределено Тогда - Родитель = Элементы.Отборы.ТекущиеДанные; + Родитель = Элементы.Отборы.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда Родитель = Родитель.ПолучитьРодителя(); КонецЕсли; @@ -2222,11 +2263,12 @@ // Изменение группировки элементов. // Возвращаемое значение: -// Неопределено, Структура: +// Структура: // * Строки - Массив из ДанныеФормыЭлементДерева: // * Родитель - ДанныеФормыЭлементДерева: // ** Идентификатор - ИдентификаторКомпоновкиДанных // * Индекс - Число +// Неопределено // &НаКлиенте Функция ПараметрыГруппировкиОтборов() @@ -2304,11 +2346,12 @@ &НаКлиенте Процедура УдалитьБазовыеЭлементыГруппировкиОтборов(ОтборыУзлаНастроек, ПараметрыГруппировки) - Строки = ПараметрыГруппировки.Родитель.ПолучитьЭлементы(); + Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек + Строки = Родитель.ПолучитьЭлементы(); ЭлементыНастроек = ОтборыУзлаНастроек.Элементы; - Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда - ЭлементыНастроек = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор).Элементы; + Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда + ЭлементыНастроек = ОтборыУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы; КонецЕсли; Индекс = ПараметрыГруппировки.Строки.ВГраница(); @@ -2337,8 +2380,8 @@ Для Каждого Строка Из ПараметрыСдвига.Строки Цикл ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); - ЭлементыНастроек = СвойствоЭлементаСтруктуры.Элементы; + Если ЭлементНастройки.Родитель <> Неопределено Тогда ЭлементыНастроек = ЭлементНастройки.Родитель.Элементы; КонецЕсли; @@ -2532,13 +2575,13 @@ Отчет.КомпоновщикНастроек, "Выбор", ИдентификаторЭлементаСтруктурыНастроек, РасширенныйРежим); Если ИдентификаторСтроки = Неопределено Тогда - Родитель = Элементы.ВыбранныеПоля.ТекущиеДанные; + Родитель = Элементы.ВыбранныеПоля.ТекущиеДанные; // см. ЭлементКоллекцииФормыНастроек Если Родитель = Неопределено Тогда - Родитель = КорневаяСтрокаПоУмолчанию("ВыбранныеПоля"); + Родитель = КорневаяСтрокаПоУмолчанию("ВыбранныеПоля"); // см. ЭлементКоллекцииФормыНастроек КонецЕсли; Если Не Родитель.ЭтоРаздел И Не Родитель.ЭтоГруппа Тогда - Родитель = Родитель.ПолучитьРодителя(); + Родитель = Родитель.ПолучитьРодителя(); // см. ЭлементКоллекцииФормыНастроек КонецЕсли; Строка = Родитель.ПолучитьЭлементы().Добавить(); @@ -2701,8 +2744,10 @@ Строки = ПараметрыГруппировки.Родитель.ПолучитьЭлементы(); ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.Элементы; - Если ТипЗнч(ПараметрыГруппировки.Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда - ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(ПараметрыГруппировки.Родитель.Идентификатор).Элементы; + Родитель = ПараметрыГруппировки.Родитель; // см. ЭлементКоллекцииФормыНастроек + + Если ТипЗнч(Родитель.Идентификатор) = Тип("ИдентификаторКомпоновкиДанных") Тогда + ЭлементыНастроек = ВыбранныеПоляУзлаНастроек.ПолучитьОбъектПоИдентификатору(Родитель.Идентификатор).Элементы; КонецЕсли; Индекс = ПараметрыГруппировки.Строки.ВГраница(); @@ -3063,17 +3108,11 @@ Отчет.КомпоновщикНастроек, ?(Строка.ЭтоПараметр, "ПараметрыДанных", "Отбор")); ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); - Если Не ЗначениеЗаполнено(ЭлементНастройки.ИдентификаторПользовательскойНастройки) Тогда + Если ЭлементНастройки = Неопределено Тогда Возврат ЗначенияДляВыбора; КонецЕсли; - КэшЗначенийОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства, "КэшЗначенийОтборов"); - Если КэшЗначенийОтборов = Неопределено Тогда - Возврат ЗначенияДляВыбора; - КонецЕсли; - - ЗначениеОтбора = КэшЗначенийОтборов.Получить(ЭлементНастройки.ИдентификаторПользовательскойНастройки); + ЗначениеОтбора = ОтчетыКлиент.КэшЗначенияОтбора(Отчет.КомпоновщикНастроек, ЭлементНастройки); Если ЗначениеОтбора <> Неопределено Тогда ОтчетыКлиентСервер.ДополнитьСписок(ЗначенияДляВыбора, ЗначениеОтбора); КонецЕсли; @@ -3117,8 +3156,7 @@ ЭлементНастройки = ЭлементНастройки(СвойствоЭлементаСтруктуры, Строка); ЗаполнитьЗначенияСвойств(ЭлементНастройки, Строка, "Использование, " + ИмяПоляЗначения); - ОтчетыКлиент.КэшироватьЗначениеОтбора( - Список, ЭлементНастройки.ИдентификаторПользовательскойНастройки, КомпоновщикНастроек); + ОтчетыКлиент.КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементНастройки, Список); УстановитьМодифицированность(); КонецПроцедуры @@ -4059,6 +4097,9 @@ ПараметрыВыполнения.Оборачивать = Ложь; ИначеЕсли Строка.ПолучитьЭлементы().Количество() > 1 Тогда ПараметрыВыполнения.Оборачивать = Ложь; + ИначеЕсли Строка.Тип = "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" + И Строка.Подтип = "ТаблицаКолонки" Тогда + ПараметрыВыполнения.Оборачивать = Ложь; КонецЕсли; КонецЕсли; @@ -4371,6 +4412,8 @@ Процедура УстановитьДоступностьКомандСтруктурыВарианта(ИдентификаторСтроки) Строка = СтруктураВарианта.НайтиПоИдентификатору(ИдентификаторСтроки); Родитель = Строка.ПолучитьРодителя(); + ЕстьРодитель = (Родитель <> Неопределено); + ЕстьПотенциальныеРодители = ЕстьРодитель И ПолучитьЭлементы(СтруктураВарианта, Родитель).Индекс(Строка) > 0; ЕстьПодчиненные = (Строка.ПолучитьЭлементы().Количество() > 0); ЕстьСоседние = ПолучитьЭлементы(СтруктураВарианта, Родитель).Количество() > 1; @@ -4398,7 +4441,7 @@ Или Строка.Тип = "НастройкиВложенногоОбъектаКомпоновкиДанных" Или Строка.Тип = "ГруппировкаКомпоновкиДанных"); - РодителяМожноПеремещать = (Родитель <> Неопределено + РодителяМожноПеремещать = (ЕстьРодитель И Родитель.Тип <> "НастройкиКомпоновкиДанных" И Родитель.Тип <> "КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных" И Родитель.Тип <> "КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных"); @@ -4423,6 +4466,10 @@ Элементы.СтруктураВарианта_ПереместитьВверх1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьВниз.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; Элементы.СтруктураВарианта_ПереместитьВниз1.Доступность = МожноУдалятьИПеремещать И ЕстьСоседние; + Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше.Доступность = ЕстьРодитель И РодителяМожноПеремещать; + Элементы.СтруктураВарианта_ПереместитьНаУровеньВыше1.Доступность = ЕстьРодитель И РодителяМожноПеремещать; + Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже.Доступность = ЕстьПотенциальныеРодители; + Элементы.СтруктураВарианта_ПереместитьНаУровеньНиже1.Доступность = ЕстьПотенциальныеРодители; КонецПроцедуры &НаКлиенте @@ -5047,6 +5094,19 @@ КонецЕсли; КонецПроцедуры +// Параметры: +// ТаблицаИмя - Строка +// Действие - Строка +// +// Возвращаемое значение: +// Структура: +// * Действие - Строка +// * ТаблицаИмя - Строка +// * ПричинаОтказа - Строка +// * СтрокиДерева - Массив из ДанныеФормыЭлементДерева +// * ТекущаяСтрока - см. ЭлементКоллекцииФормыНастроек +// * ТекущийРодитель - см. ЭлементКоллекцииФормыНастроек +// &НаКлиенте Функция НовыйКонтекст(Знач ТаблицаИмя, Знач Действие) Результат = Новый Структура; @@ -5072,7 +5132,9 @@ Или Контекст.ТаблицаИмя = "Оформление"); Особенности.МогутБытьПараметры = (Контекст.ТаблицаИмя = "Отборы"); Особенности.МогутБытьПараметрыВывода = (Контекст.ТаблицаИмя = "Оформление"); - Особенности.ТребоватьОдногоРодителя = (Контекст.Действие = "Переместить" Или Контекст.Действие = "Сгруппировать"); + Особенности.ТребоватьОдногоРодителя = (Контекст.Действие = "Переместить" + Или Контекст.Действие = "ПереместитьВИерархии" + Или Контекст.Действие = "Сгруппировать"); Особенности.МогутБытьГруппы = (Контекст.ТаблицаИмя = "Отборы" Или Контекст.ТаблицаИмя = "ВыбранныеПоля"); Если Особенности.ТребоватьОдногоРодителя Тогда Контекст.Вставить("ТекущийРодитель", -1); @@ -5214,6 +5276,52 @@ УстановитьМодифицированность(); КонецПроцедуры +// Параметры: +// Контекст - см. НовыйКонтекст +// +&НаКлиенте +Процедура ПереместитьВИерархии(Контекст) + + Если Контекст.ТекущийРодитель = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Контекст.Направление > 0 Тогда + + Строки = Контекст.ТекущийРодитель.ПолучитьЭлементы(); + Индекс = Строки.Индекс(Контекст.ТекущаяСтрока) - 1; + НовыйРодитель = ?(Индекс < 0, Неопределено, Строки.Получить(Индекс)); + + Иначе + НовыйРодитель = ПолучитьРодителя(Контекст.ТаблицаИмя, Контекст.ТекущийРодитель); + КонецЕсли; + + Если НовыйРодитель = Неопределено + Или НовыйРодитель.Тип = "ТаблицаКомпоновкиДанных" + Или НовыйРодитель.Тип = "ДиаграммаКомпоновкиДанных" Тогда + + Возврат; + КонецЕсли; + + Если Контекст.Направление > 0 Тогда + Индекс = НовыйРодитель.ПолучитьЭлементы().Количество(); + Иначе + Индекс = НовыйРодитель.ПолучитьЭлементы().Индекс(Контекст.ТекущийРодитель) + 1; + КонецЕсли; + + Если Индекс < 0 Тогда + Индекс = 0; + КонецЕсли; + + Результат = ПереместитьЭлементыСтруктурыВарианта(Контекст.ТекущаяСтрока, НовыйРодитель,, Индекс, Индекс); + + Элементы.СтруктураВарианта.Развернуть(НовыйРодитель.ПолучитьИдентификатор(), Истина); + Элементы.СтруктураВарианта.ТекущаяСтрока = Результат.Строка.ПолучитьИдентификатор(); + + УстановитьМодифицированность(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент - Таблицы полей (универсальные точки входа). @@ -5394,21 +5502,24 @@ // - НастройкиКомпоновкиДанных // - НастройкиВложенногоОбъектаКомпоновкиДанных // - СтруктураНастроекКомпоновкиДанных -// - ДиаграммаКомпоновкиДанных -// - ПорядокКомпоновкиДанных // - ГруппировкаКомпоновкиДанных +// - ТаблицаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных // - ГруппировкаТаблицыКомпоновкиДанных +// - ДиаграммаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных // - ГруппировкаДиаграммыКомпоновкиДанных -// - УсловноеОформлениеКомпоновкиДанных -// - ГруппаВыбранныхПолейКомпоновкиДанных -// - ГруппаЭлементовОтбораКомпоновкиДанных +// - ОтборКомпоновкиДанных // - ЭлементОтбораКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных // - ЭлементУсловногоОформленияКомпоновкиДанных // - ЗначенияПараметровВыводаКомпоновкиДанных // - ЗначениеПараметраНастроекКомпоновкиДанных -// - ОтборКомпоновкиДанных // - ВыбранныеПоляКомпоновкиДанных -// - ТаблицаКомпоновкиДанных +// - ГруппаВыбранныхПолейКомпоновкиДанных +// - ПорядокКомпоновкиДанных +// - УсловноеОформлениеКомпоновкиДанных +// - КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных // - Неопределено // &НаКлиентеНаСервереБезКонтекста @@ -5811,6 +5922,8 @@ Элементы.КомандыСтруктурыВарианта_ДвижениеПоИерархии1.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя.Видимость = ЭтоРасширенныйРежим; Элементы.КомандыСтруктурыВарианта_ДвижениеВнутриРодителя1.Видимость = ЭтоРасширенныйРежим; + Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии.Видимость = ЭтоРасширенныйРежим; + Элементы.КомандыСтруктурыВарианта_ДвижениеВИерархии1.Видимость = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.ИзменятьСоставСтрок = ЭтоРасширенныйРежим; Элементы.СтруктураВарианта.ИзменятьПорядокСтрок = ЭтоРасширенныйРежим; @@ -5828,7 +5941,9 @@ #Область ОбщиеСвойстваЭлементов - Если Не ЭтоРасширенныйРежим + Если Параметры.Свойство("ОтображатьСтраницы") Тогда + ОтображатьСтраницы = (Параметры.ОтображатьСтраницы <> Ложь); + ИначеЕсли Не ЭтоРасширенныйРежим И ЭтоМобильныйКлиент Тогда ОтображатьСтраницы = Ложь; Иначе @@ -6635,6 +6750,9 @@ Индекс = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Индекс(ЭлементНастройки); ПутьКСписку = ПутьКДаннымЭлементов.ПоИндексу[Индекс]; + Если ПутьКСписку = Неопределено Тогда + Возврат; + КонецЕсли; Список = Элементы.Найти(ПутьКСписку); Если ЭлементНастройки.Использование Тогда diff --git a/SSL/src/CommonForms/ФормаОтчета/Form.form b/SSL/src/CommonForms/ФормаОтчета/Form.form index 498acad00..4dadf8dcf 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаОтчета/Form.form @@ -2537,7 +2537,6 @@ ОтчетТабличныйДокументКонтекстноеМенюОтчетСкомпоноватьРезультат 168 - true true true @@ -2617,7 +2616,6 @@ Auto InCommandBarAndInAdditionalSubmenu - true true true @@ -2638,7 +2636,1944 @@ - true + + КонтекстноеМенюОбластиЗаголовка + 834 + + КонтекстноеМенюОбластиЗаголовкаИзменитьСоставПолей + 836 + + КонтекстноеМенюОбластиЗаголовкаВставить + 838 + + КонтекстноеМенюОбластиЗаголовкаВставитьПолеСправа + 840 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаВставитьПолеСправаРасширеннаяПодсказка + 841 + Label + true + true + + Left + + + Form.Command.ВставитьПолеСправа + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаВставитьГруппировкуНиже + 842 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаВставитьГруппировкуНижеРасширеннаяПодсказка + 843 + Label + true + true + + Left + + + Form.Command.ВставитьГруппировкуНиже + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Вставить</value> + + + КонтекстноеМенюОбластиЗаголовкаВставитьРасширеннаяПодсказка + 839 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаПереместить + 844 + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВлево + 846 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВлевоРасширеннаяПодсказка + 847 + Label + true + true + + Left + + + Form.Command.ПереместитьПолеВлево + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВправо + 848 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВправоРасширеннаяПодсказка + 849 + Label + true + true + + Left + + + Form.Command.ПереместитьПолеВправо + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВыше + 850 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВышеРасширеннаяПодсказка + 851 + Label + true + true + + Left + + + Form.Command.ПереместитьПолеВыше + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеНиже + 852 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаПереместитьПолеНижеРасширеннаяПодсказка + 853 + Label + true + true + + Left + + + Form.Command.ПереместитьПолеНиже + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Переместить</value> + + + КонтекстноеМенюОбластиЗаголовкаПереместитьРасширеннаяПодсказка + 845 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаСкрытьПоле + 854 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаСкрытьПолеРасширеннаяПодсказка + 855 + Label + true + true + + Left + + + Form.Command.СкрытьПоле + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаПереименоватьПоле + 856 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаПереименоватьПолеРасширеннаяПодсказка + 857 + Label + true + true + + Left + + + Form.Command.ПереименоватьПоле + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Изменить состав полей</value> + + + КонтекстноеМенюОбластиЗаголовкаИзменитьСоставПолейРасширеннаяПодсказка + 837 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаМенюФильтровать + 980 + + КонтекстноеМенюОбластиЗаголовкаФильтровать + 858 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаФильтроватьРасширеннаяПодсказка + 859 + Label + true + true + + Left + + + Form.Command.Фильтровать + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаСнятьФильтр + 982 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаСнятьФильтрРасширеннаяПодсказка + 983 + Label + true + true + + Left + + + Form.Command.СнятьФильтр + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Фильтровать</value> + + + КонтекстноеМенюОбластиЗаголовкаМенюФильтроватьРасширеннаяПодсказка + 981 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаСортировать + 860 + + КонтекстноеМенюОбластиЗаголовкаСортироватьПоВозрастанию + 862 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаСортироватьПоВозрастаниюРасширеннаяПодсказка + 863 + Label + true + true + + Left + + + Form.Command.СортироватьПоВозрастанию + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаСортироватьПоУбыванию + 864 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаСортироватьПоУбываниюРасширеннаяПодсказка + 865 + Label + true + true + + Left + + + Form.Command.СортироватьПоУбыванию + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Сортировать</value> + + + КонтекстноеМенюОбластиЗаголовкаСортироватьРасширеннаяПодсказка + 861 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаМенюОформить + 866 + + КонтекстноеМенюОбластиЗаголовкаОформитьОтрицательныеПоложительные + 868 + + КонтекстноеМенюОбластиЗаголовкаОформитьОтрицательные + 870 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаОформитьОтрицательныеРасширеннаяПодсказка + 871 + Label + true + true + + Left + + + Form.Command.ОформитьОтрицательные + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаОформитьПоложительные + 872 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаОформитьПоложительныеРасширеннаяПодсказка + 873 + Label + true + true + + Left + + + Form.Command.ОформитьПоложительные + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Оформить отрицательные, положительные</value> + + + КонтекстноеМенюОбластиЗаголовкаОформитьОтрицательныеПоложительныеРасширеннаяПодсказка + 869 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаУстановитьВысотуШирину + 874 + + КонтекстноеМенюОбластиЗаголовкаУстановитьВысотуСтроки + 876 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаУстановитьВысотуСтрокиРасширеннаяПодсказка + 877 + Label + true + true + + Left + + + Form.Command.УстановитьВысотуСтроки + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюОбластиЗаголовкаУстановитьШиринуКолонки + 878 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаУстановитьШиринуКолонкиРасширеннаяПодсказка + 879 + Label + true + true + + Left + + + Form.Command.УстановитьШиринуКолонки + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Установить высоту, ширину</value> + + + КонтекстноеМенюОбластиЗаголовкаУстановитьВысотуШиринуРасширеннаяПодсказка + 875 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиЗаголовкаМенюОформитьЕще + 880 + true + true + + true + + + КонтекстноеМенюОбластиЗаголовкаМенюОформитьЕщеРасширеннаяПодсказка + 881 + Label + true + true + + Left + + + Form.Command.ОформитьЕще + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Оформить</value> + + + КонтекстноеМенюОбластиЗаголовкаМенюОформитьРасширеннаяПодсказка + 867 + Label + true + true + + Left + + + Popup + + + StdPicture.DataCompositionConditionalAppearance + + Auto + Normal + + + true + + true + + + <key>ru</key> + <value>Контекстное меню области заголовка</value> + + + КонтекстноеМенюОбластиЗаголовкаРасширеннаяПодсказка + 835 + Label + true + true + + Left + + + + + + КонтекстноеМенюОбластиДанных + 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 + + КонтекстноеМенюОбластиДанныхОформитьКраснымЖелтымЗеленым + 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 + + + + КонтекстноеМенюОбластиДанныхРасшифровать + 978 + true + + true + + + КонтекстноеМенюОбластиДанныхРасшифроватьРасширеннаяПодсказка + 979 + Label + true + true + + Left + + + Form.Command.Расшифровать + Normal + Auto + true + true + UserCmds + Auto + + true + + true + + + <key>ru</key> + <value>Контекстное меню области данных</value> + + + КонтекстноеМенюОбластиДанныхРасширеннаяПодсказка + 883 + Label + true + true + + Left + + + + SpreadsheetDocumentField Enter @@ -4226,6 +6161,19 @@
    + + ОбработкаРасшифровки + 14 + + Boolean + + + true + + + true + + ВсеНастройки @@ -4809,6 +6757,443 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ВставитьПолеСправа</name> + <title> + <key>ru</key> + <value>Вставить поле справа...</value> + + 26 + + true + + + CommonPicture.ВставитьКолонкуСправа + + + + ВставитьПолеСправа + + + Auto + Auto + + + ВставитьГруппировкуНиже + + <key>ru</key> + <value>Вставить группировку ниже...</value> + + 27 + + true + + + CommonPicture.ВставитьГруппировкуНиже + + + + ВставитьГруппировкуНиже + + + Auto + Auto + + + ПереместитьПолеВлево + + <key>ru</key> + <value>Переместить влево</value> + + 28 + + true + + + CommonPicture.ПереместитьКолонкуВлево + + + + ПереместитьПолеВлево + + + Auto + Auto + + + ПереместитьПолеВправо + + <key>ru</key> + <value>Переместить вправо</value> + + 29 + + true + + + CommonPicture.ПереместитьКолонкуВправо + + + + ПереместитьПолеВправо + + + Auto + Auto + + + ПереместитьПолеВыше + + <key>ru</key> + <value>Переместить выше</value> + + 30 + + true + + + CommonPicture.ПереместитьГруппировкуВыше + + + + ПереместитьПолеВыше + + + Auto + Auto + + + ПереместитьПолеНиже + + <key>ru</key> + <value>Переместить ниже</value> + + 31 + + true + + + CommonPicture.ПереместитьГруппировкуНиже + + + + ПереместитьПолеНиже + + + Auto + Auto + + + СкрытьПоле + + <key>ru</key> + <value>Скрыть</value> + + 32 + + true + + + + СкрытьПоле + + + Auto + Auto + + + ПереименоватьПоле + + <key>ru</key> + <value>Переименовать...</value> + + 33 + + true + + + + ПереименоватьПоле + + + Auto + Auto + + + Фильтровать + + <key>ru</key> + <value>Фильтровать...</value> + + 34 + + true + + + StdPicture.DataCompositionFilter + + + + Фильтровать + + + Auto + Auto + + + СортироватьПоВозрастанию + + <key>ru</key> + <value>Сортировать по возрастанию</value> + + 35 + + true + + + CommonPicture.СортироватьСтрокиПоВозрастанию + + + + СортироватьПоВозрастанию + + + Auto + Auto + + + СортироватьПоУбыванию + + <key>ru</key> + <value>Сортировать по убыванию</value> + + 36 + + true + + + CommonPicture.СортироватьСтрокиПоУбыванию + + + + СортироватьПоУбыванию + + + Auto + Auto + + + ОформитьЖелтым + + <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 + + + ОформитьОтрицательные + + <key>ru</key> + <value>Отрицательные красным</value> + + 40 + + ru + Оформить отрицательные значения красным + + + true + + + + ОформитьОтрицательные + + + Auto + Auto + + + ОформитьПоложительные + + <key>ru</key> + <value>Положительные зеленым</value> + + 41 + + ru + Оформить отрицательные значения зеленым + + + true + + + + ОформитьПоложительные + + + Auto + Auto + + + УстановитьВысотуСтроки + + <key>ru</key> + <value>Высота строки...</value> + + 42 + + ru + Установить высоту строки + + + true + + + CommonPicture.ВысотаСтроки + + + + УстановитьВысотуСтроки + + + TextPicture + Auto + Auto + + + УстановитьШиринуКолонки + + <key>ru</key> + <value>Ширина колонки...</value> + + 43 + + ru + Установить ширину колонки + + + true + + + CommonPicture.ШиринаКолонки + + + + УстановитьШиринуКолонки + + + TextPicture + Auto + Auto + + + ОформитьЕще + + <key>ru</key> + <value>Еще...</value> + + 44 + + true + + + + ОформитьЕще + + + Auto + Auto + + + Открыть + + <key>ru</key> + <value>Открыть</value> + + 45 + + true + + Auto + Auto + + + Расшифровать + + <key>ru</key> + <value>Расшифровать...</value> + + 46 + + true + + Auto + Auto + + + СнятьФильтр + + <key>ru</key> + <value>Снять фильтр</value> + + 47 + + true + + + + СнятьФильтр + + + Auto + Auto + Ссылка diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl index 4cf57fa56..d5b50d36b 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl @@ -94,7 +94,7 @@ ПостоянныеКоманды.Добавить(Команда.Имя); КонецЦикла; - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда УстановитьВидимостьДоступность(); КонецЕсли; @@ -179,15 +179,20 @@ // Приемка результата из стандартных форм. Если ТипЗнч(ПодчиненнаяФорма) = Тип("ФормаКлиентскогоПриложения") Тогда + ИмяПодчиненнойФормы = ПодчиненнаяФорма.ИмяФормы; Если ИмяПодчиненнойФормы = "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.НастройкиОтчета" Или ПодчиненнаяФорма.ОписаниеОповещенияОЗакрытии <> Неопределено Тогда + РезультатОбработан = Истина; // См. ВсеНастройкиЗавершение. + ИначеЕсли ТипЗнч(Результат) = Тип("Структура") Тогда + ПозицияТочки = СтрДлина(ИмяПодчиненнойФормы); Пока КодСимвола(ИмяПодчиненнойФормы, ПозицияТочки) <> 46 Цикл // Не точка. ПозицияТочки = ПозицияТочки - 1; КонецЦикла; + СуффиксФормыИсточника = ВРег(Сред(ИмяПодчиненнойФормы, ПозицияТочки + 1)); Если СуффиксФормыИсточника = ВРег("ФормаНастроекОтчета") Или СуффиксФормыИсточника = ВРег("ФормаНастроек") @@ -198,32 +203,13 @@ РезультатОбработан = Истина; КонецЕсли; КонецЕсли; + + ПрименитьНастройкиИзКонтекстногоМеню(Результат); + ИначеЕсли ТипЗнч(ПодчиненнаяФорма) = Тип("КонструкторСхемыКомпоновкиДанных") Тогда -#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда - Если ТипЗнч(Результат) = Тип("СхемаКомпоновкиДанных") Тогда - НастройкиОтчета.АдресСхемы = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); - - Путь = ПолучитьИмяВременногоФайла(); - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.ОткрытьФайл(Путь, "UTF-8"); - СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Результат, "dataCompositionSchema", "http://v8.1c.ru/8.1/data-composition-system/schema"); - ЗаписьXML.Закрыть(); - - ДвоичныеДанные = Новый ДвоичныеДанные(Путь); - НачатьУдалениеФайлов(, Путь); - - Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("СхемаКомпоновкиДанных", ДвоичныеДанные); - Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); - - ПараметрыЗаполнения = Новый Структура; - ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); - ПараметрыЗаполнения.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек); - ПараметрыЗаполнения.Вставить("ИмяСобытия", "НастройкиПоУмолчанию"); - - ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); - КонецЕсли; -#КонецЕсли + + ПрименитьСхемуИзКонструктора(Результат); + КонецЕсли; // Механизмы расширения. @@ -267,6 +253,8 @@ КонецЕсли; + ПрименитьНастройкиИзКонтекстногоМеню(Параметр); + ИнтеграцияПодсистемБСПКлиент.ПриОбработкеОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник, ОповещениеОбработано); ОтчетыКлиентПереопределяемый.ОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник, ОповещениеОбработано); КонецПроцедуры @@ -274,7 +262,9 @@ &НаСервере Процедура ПередЗагрузкойВариантаНаСервере(НовыеНастройкиКД) // Ничего не делать если отчет не на СКД и никаких настроек не загружено. - Если НовыеНастройкиКД = Неопределено Или Не РежимВариантаОтчета() Тогда + Если НовыеНастройкиКД = Неопределено + Или Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда + Возврат; КонецЕсли; @@ -311,7 +301,9 @@ &НаСервере Процедура ПриЗагрузкеВариантаНаСервере(НовыеНастройкиКД) // Ничего не делать если отчет не на СКД и никаких настроек не загружено. - Если Не РежимВариантаОтчета() И НовыеНастройкиКД = Неопределено Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) + И НовыеНастройкиКД = Неопределено Тогда + Возврат; КонецЕсли; @@ -364,7 +356,7 @@ &НаСервере Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(НовыеПользовательскиеНастройкиКД) - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда Возврат; КонецЕсли; @@ -376,7 +368,7 @@ &НаСервере Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка) - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда Возврат; КонецЕсли; @@ -388,7 +380,7 @@ &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда Возврат; КонецЕсли; @@ -430,7 +422,7 @@ &НаСервере Процедура ПриСохраненииВариантаНаСервере(НастройкиКД) - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда Возврат; КонецЕсли; НовыеНастройкиКД = Отчет.КомпоновщикНастроек.ПолучитьНастройки(); @@ -444,7 +436,7 @@ &НаСервере Процедура ПриСохраненииПользовательскихНастроекНаСервере(ПользовательскиеНастройкиКД) - Если Не РежимВариантаОтчета() Тогда + Если Не ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) Тогда Возврат; КонецЕсли; ВариантыОтчетов.ПриСохраненииПользовательскихНастроекНаСервере(ЭтотОбъект, ПользовательскиеНастройкиКД); @@ -461,12 +453,17 @@ &НаКлиенте Процедура ОтчетТабличныйДокументВыбор(Элемент, Область, СтандартнаяОбработка) + ОбработкаРасшифровки = Ложь; + Если СтандартнаяОбработка Тогда ИнтеграцияПодсистемБСПКлиент.ПриОбработкеВыбораТабличногоДокумента(ЭтотОбъект, Элемент, Область, СтандартнаяОбработка); ОтчетыКлиентПереопределяемый.ОбработкаВыбораТабличногоДокумента(ЭтотОбъект, Элемент, Область, СтандартнаяОбработка); КонецЕсли; - Если СтандартнаяОбработка И ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда + Если Не ОбработкаРасшифровки + И СтандартнаяОбработка + И ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") Тогда + Если ПерейтиПоСсылке(Область.Текст) Тогда СтандартнаяОбработка = Ложь; Возврат; @@ -480,30 +477,42 @@ // чтение расшифровки недоступно, поэтому делается попытка-исключение. КонецПопытки; - Если ЗначениеРасшифровки <> Неопределено И ПерейтиПоСсылке(ЗначениеРасшифровки) Тогда + Если ЗначениеРасшифровки <> Неопределено + И ПерейтиПоСсылке(ЗначениеРасшифровки) Тогда + СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; + Если ПерейтиПоСсылке(Область.Маска) Тогда СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; КонецЕсли; + + Если Не ОбработкаРасшифровки + И СтандартнаяОбработка Тогда + + ВариантыОтчетовСлужебныйКлиент.ПоказатьКонтекстнуюНастройкуОтчета(ЭтотОбъект, Элемент, Область, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ОтчетТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) - Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда - МодульАнализЖурналаРегистрацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АнализЖурналаРегистрацииКлиент"); - МодульАнализЖурналаРегистрацииКлиент.ФормаОтчетаОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); - КонецЕсли; ИнтеграцияПодсистемБСПКлиент.ПриОбработкеРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); + + Если СтандартнаяОбработка Тогда + ВариантыОтчетовСлужебныйКлиент.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ОтчетТабличныйДокументОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда МодульАнализЖурналаРегистрацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АнализЖурналаРегистрацииКлиент"); МодульАнализЖурналаРегистрацииКлиент.ФормаОтчетаОбработкаДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); @@ -511,11 +520,20 @@ ИнтеграцияПодсистемБСПКлиент.ПриОбработкеДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); ОтчетыКлиентПереопределяемый.ОбработкаДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); + + Если СтандартнаяОбработка Тогда + Данные = ДанныеЭлементаРасшифровки(Расшифровка); + ВариантыОтчетовСлужебныйКлиент.ОбработкаДополнительнойРасшифровки(ЭтотОбъект, Данные, Элемент, Расшифровка, СтандартнаяОбработка); + КонецЕсли; + КонецПроцедуры &НаКлиенте Процедура ОтчетТабличныйДокументПриАктивизации(Элемент) + + ПодключитьОбработчикОжидания("ПодготовитьКомандыКонтекстнойНастройки", 0.1, Истина); ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -788,6 +806,132 @@ ВариантыОтчетовКлиент.ПоделитьсяПользовательскимиНастройками(ОписаниеНастроек); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики команд контекстного меню табличного документа - результат отчета. + +&НаКлиенте +Процедура ВставитьПолеСправа(Команда) + + ВариантыОтчетовСлужебныйКлиент.ВставитьПолеСправа(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ВставитьГруппировкуНиже(Команда) + + ВариантыОтчетовСлужебныйКлиент.ВставитьГруппировкуНиже(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьПолеВлево(Команда) + + ВариантыОтчетовСлужебныйКлиент.ПереместитьПолеВлево(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьПолеВправо(Команда) + + ВариантыОтчетовСлужебныйКлиент.ПереместитьПолеВправо(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьПолеВыше(Команда) + + ВариантыОтчетовСлужебныйКлиент.ПереместитьПолеВыше(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереместитьПолеНиже(Команда) + + ВариантыОтчетовСлужебныйКлиент.ПереместитьПолеНиже(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура СкрытьПоле(Команда) + + ВариантыОтчетовСлужебныйКлиент.СкрытьПоле(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ПереименоватьПоле(Команда) + + ВариантыОтчетовСлужебныйКлиент.ПереименоватьПоле(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФильтр(Команда) + + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + СвойстваЗаголовка = СвойстваРезультата.Заголовки[Элементы.ОтчетТабличныйДокумент.ТекущаяОбласть.Имя]; + ВариантыОтчетовСлужебныйКлиент.СнятьФильтр(ЭтотОбъект, СвойстваЗаголовка); + +КонецПроцедуры + +&НаКлиенте +Процедура Фильтровать(Команда) + + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + СвойстваЗаголовка = СвойстваРезультата.Заголовки[Элементы.ОтчетТабличныйДокумент.ТекущаяОбласть.Имя]; + ВариантыОтчетовСлужебныйКлиент.ПоказатьРасширеннуюНастройкуФильтра(ЭтотОбъект, СвойстваЗаголовка); + +КонецПроцедуры + +&НаКлиенте +Процедура СортироватьПоВозрастанию(Команда) + + ВариантыОтчетовСлужебныйКлиент.Сортировать(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура СортироватьПоУбыванию(Команда) + + ВариантыОтчетовСлужебныйКлиент.Сортировать(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ОформитьОтрицательные(Команда) + + ВариантыОтчетовСлужебныйКлиент.ОформитьКрасным(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ОформитьПоложительные(Команда) + + ВариантыОтчетовСлужебныйКлиент.ОформитьЗеленым(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьВысотуСтроки(Команда) + + ВариантыОтчетовСлужебныйКлиент.УстановитьВысотуСтроки(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьШиринуКолонки(Команда) + + ВариантыОтчетовСлужебныйКлиент.УстановитьШиринуКолонки(ЭтотОбъект, Команда); + +КонецПроцедуры + +&НаКлиенте +Процедура ОформитьЕще(Команда) + + ВариантыОтчетовСлужебныйКлиент.ОформитьЕще(ЭтотОбъект, Команда); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики команд расчета показателей. @@ -830,7 +974,6 @@ //////////////////////////////////////////////////////////////////////////////// // Подключаемые - // Параметры: // Команда - КомандаФормы // @@ -963,6 +1106,7 @@ ПараметрыФормирования = Новый Структура; ПараметрыФормирования.Вставить("ЗагрузитьРезультат", Ложь); ПараметрыФормирования.Вставить("ИдентификаторЗадания", Результат.ИдентификаторЗадания); + ПараметрыФормирования.Вставить("ВремяНачалаФормирования", ТекущаяУниверсальнаяДатаВМиллисекундах()); Если Результат.Статус <> "Выполняется" Тогда ПослеФормирования(Результат, ПараметрыФормирования); @@ -985,16 +1129,26 @@ КонецЕсли; Если Результат = Неопределено Тогда + ПоказатьОшибкиФормирования(НСтр("ru = 'Формирование отчета прервано администратором'")); ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет не сформирован'"),, Заголовок); + ИначеЕсли Результат.Статус = "Выполнено" Тогда + Если ПараметрыФормирования.ЗагрузитьРезультат Тогда ЗагрузитьРезультатФормированияОтчета(); КонецЕсли; + + НастройкиОтчета.СвойстваРезультата.ВремяФормирования = (ТекущаяУниверсальнаяДатаВМиллисекундах() + - ПараметрыФормирования.ВремяНачалаФормирования) / 1000; + ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет сформирован'"),, Заголовок); + ИначеЕсли Результат.Статус = "Ошибка" Тогда + ПоказатьОшибкиФормирования(Результат.КраткоеПредставлениеОшибки); ПоказатьОповещениеПользователя(НСтр("ru = 'Отчет не сформирован'"),, Заголовок); + КонецЕсли; ФормированиеПриОткрытии = Ложь; @@ -1156,8 +1310,11 @@ КонецЕсли; ОтчетДанныеРасшифровки = ПоместитьВоВременноеХранилище(Результат.Расшифровка, УникальныйИдентификатор); + ВариантыОтчетовСлужебный.ИнициализироватьЗаголовкиОтчета(ЭтотОбъект); + Если Не Результат.ВариантМодифицирован И Не Результат.ПользовательскиеНастройкиМодифицированы Тогда + Возврат; КонецЕсли; @@ -1232,7 +1389,7 @@ ЗначенияДляВыбора = ЗначенияДляВыбора( Элемент.СписокВыбора, - Сведения.ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки, + Сведения.ЭлементПользовательскойНастройки, Элемент.ДоступныеТипы); ОграничиватьВыборУказаннымиЗначениями = ДоступныеЗначения <> Неопределено; @@ -1264,21 +1421,15 @@ КонецПроцедуры &НаКлиенте -Функция ЗначенияДляВыбора(СписокВыбора, ИдентификаторПользовательскойНастройки, ТипЗначения) +Функция ЗначенияДляВыбора(СписокВыбора, ЭлементНастройки, ТипЗначения) ЗначенияДляВыбора = СписокВыбора; - Если Не ЗначениеЗаполнено(ИдентификаторПользовательскойНастройки) Тогда + Если ЭлементНастройки = Неопределено Тогда Возврат ЗначенияДляВыбора; КонецЕсли; ЗначенияДляВыбора.ТипЗначения = ТипЗначения; - КэшЗначенийОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( - Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства, "КэшЗначенийОтборов"); - Если КэшЗначенийОтборов = Неопределено Тогда - Возврат ЗначенияДляВыбора; - КонецЕсли; - - ЗначениеОтбора = КэшЗначенийОтборов.Получить(ИдентификаторПользовательскойНастройки); + ЗначениеОтбора = ОтчетыКлиент.КэшЗначенияОтбора(Отчет.КомпоновщикНастроек, ЭлементНастройки); Если ЗначениеОтбора <> Неопределено Тогда ОтчетыКлиентСервер.ДополнитьСписок(ЗначенияДляВыбора, ЗначениеОтбора); КонецЕсли; @@ -1335,8 +1486,7 @@ КонецЕсли; КонецЕсли; - ОтчетыКлиент.КэшироватьЗначениеОтбора( - Список, ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки, Отчет.КомпоновщикНастроек); + ОтчетыКлиент.КэшироватьЗначениеОтбора(Отчет.КомпоновщикНастроек, ЭлементПользовательскойНастройки, Список); ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(ЭтотОбъект); КонецПроцедуры @@ -1392,6 +1542,11 @@ Сформировать(); КонецПроцедуры +&НаКлиенте +Процедура ПодготовитьКомандыКонтекстнойНастройки() + ВариантыОтчетовСлужебныйКлиент.ПриАктивизацииРезультатаОтчета(ЭтотОбъект, Элементы.ОтчетТабличныйДокумент); +КонецПроцедуры + // Выполняет расчет и вывод показателей выделенной области ячеек. // См. обработчик события ОтчетТабличныйДокументПриАктивизацииОбласти. // @@ -1405,7 +1560,9 @@ &НаСервере Процедура УстановитьВидимостьДоступность(ПриСохраненииВарианта = Ложь) - ПоказыватьКомандыВыбораВариантов = РежимВариантаОтчета() И НастройкиОтчета.РазрешеноВыбиратьВарианты; + ПоказыватьКомандыВыбораВариантов = + ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) + И НастройкиОтчета.РазрешеноВыбиратьВарианты; Если Не ПриСохраненииВарианта Тогда ПоказыватьКомандыИзмененияВарианта = ПоказыватьКомандыВыбораВариантов И НастройкиОтчета.РазрешеноИзменятьВарианты; @@ -1443,7 +1600,9 @@ ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы( Элементы, "ПоделитьсяНастройками", "Видимость", РазрешеноИспользоватьНастройки); - Элементы.ИзменитьУсловияОтборов.Видимость = КоличествоДоступныхНастроек.Итог > 0 И РежимВариантаОтчета(); + Элементы.ИзменитьУсловияОтборов.Видимость = + КоличествоДоступныхНастроек.Итог > 0 + И ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта); Если РазрешеноВыбиратьИНастраиватьВариантыБезСохранения Тогда ВариантМодифицирован = Ложь; @@ -1496,7 +1655,7 @@ &НаСервере Процедура ПроверитьДоступностьОбменаНастройкамиВарианта(МетаданныеОтчета) - ОбменНастройкамиВариантаДоступен = РежимВариантаОтчета() + ОбменНастройкамиВариантаДоступен = ВариантыОтчетовСлужебный.РежимВариантаОтчета(КлючТекущегоВарианта) И ВариантыОтчетов.ОтчетПодключенКХранилищу(МетаданныеОтчета); Элементы.ГруппаОбменНастройкамиЕще.Видимость = ОбменНастройкамиВариантаДоступен; @@ -1712,6 +1871,9 @@ Настройки.Вставить("Безопасный", БезопасныйРежим() <> Ложь); Настройки.Вставить("ИспользуемыеТаблицы", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИспользуемыеТаблицы")); + // Свойства для контекстной настройки отчета. + Настройки.Вставить("СвойстваРезультата", ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета()); + Возврат Настройки; КонецФункции @@ -1784,6 +1946,13 @@ КонецЕсли; КонецПроцедуры +&НаСервере +Функция ДанныеЭлементаРасшифровки(Расшифровка) + + Возврат ВариантыОтчетовСлужебный.ДанныеЭлементаРасшифровки(ЭтотОбъект, Расшифровка); + +КонецФункции + &НаСервере Процедура ОбновитьЭлементыФормыНастроекНаСервере(ПараметрыОбновления = Неопределено) ЗагрузитьНастройкиВКомпоновщик(ПараметрыОбновления); @@ -2100,11 +2269,6 @@ КонецЕсли; КонецПроцедуры -&НаСервере -Функция РежимВариантаОтчета() - Возврат ТипЗнч(КлючТекущегоВарианта) = Тип("Строка") И Не ПустаяСтрока(КлючТекущегоВарианта); -КонецФункции - &НаКлиентеНаСервереБезКонтекста Функция ПустойКлючВарианта() Возврат " - "; @@ -2121,4 +2285,67 @@ КонецПроцедуры +&НаКлиенте +Процедура ПрименитьСхемуИзКонструктора(Результат) + +#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда + Если ТипЗнч(Результат) <> Тип("СхемаКомпоновкиДанных") Тогда + Возврат; + КонецЕсли; + + НастройкиОтчета.АдресСхемы = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); + + Путь = ПолучитьИмяВременногоФайла(); + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.ОткрытьФайл(Путь, "UTF-8"); + СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Результат, "dataCompositionSchema", "http://v8.1c.ru/8.1/data-composition-system/schema"); + ЗаписьXML.Закрыть(); + + ДвоичныеДанные = Новый ДвоичныеДанные(Путь); + НачатьУдалениеФайлов(, Путь); + + Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("СхемаКомпоновкиДанных", ДвоичныеДанные); + Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ОтчетИнициализирован", Ложь); + + ПараметрыЗаполнения = Новый Структура; + ПараметрыЗаполнения.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + ПараметрыЗаполнения.Вставить("КомпоновщикНастроекКД", Отчет.КомпоновщикНастроек); + ПараметрыЗаполнения.Вставить("ИмяСобытия", "НастройкиПоУмолчанию"); + + ОбновитьЭлементыФормыНастроек(ПараметрыЗаполнения); +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ПрименитьНастройкиИзКонтекстногоМеню(Результат) + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Действие = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "Действие"); + + Если Не ВариантыОтчетовСлужебныйКлиент.ЭтоСобытиеКонтекстнойНастройки(Действие) + Или Результат.ИдентификаторВладельца <> УникальныйИдентификатор Тогда + + Возврат; + КонецЕсли; + + Если Не Результат.Переформировать Тогда + Результат.Переформировать = (НастройкиОтчета.СвойстваРезультата.ВремяФормирования <= 5); + КонецЕсли; + + ВсеНастройкиЗавершение(Результат, Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеВыбораПоля(ВыбранноеПоле, ДополнительныеПараметры) Экспорт + + ВариантыОтчетовСлужебныйКлиент.ПослеВыбораПоля(ВыбранноеПоле, ДополнительныеПараметры); + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonForms/ФормаПоиска/Form.form b/SSL/src/CommonForms/ФормаПоиска/Form.form index b202e9561..e0233216d 100644 --- a/SSL/src/CommonForms/ФормаПоиска/Form.form +++ b/SSL/src/CommonForms/ФормаПоиска/Form.form @@ -84,10 +84,6 @@ true - - <key>ru</key> - <value>Состояние поиска</value> - true СостояниеПоискаРасширеннаяПодсказка @@ -256,10 +252,6 @@ true - - <key>ru</key> - <value>Шапка</value> - ШапкаРасширеннаяПодсказка 52 @@ -332,10 +324,6 @@ true - - <key>ru</key> - <value>Область поиска</value> - ОбластьПоискаРасширеннаяПодсказка 74 @@ -433,10 +421,6 @@ true - - <key>ru</key> - <value>Навигация</value> - false ГруппаНавигацияExtendedTooltip @@ -499,10 +483,6 @@ true - - <key>ru</key> - <value>Информация о найденном</value> - true ГруппаИнформацияОНайденномExtendedTooltip diff --git a/SSL/src/CommonModules/GoogleПереводчик/GoogleПереводчик.mdo b/SSL/src/CommonModules/GoogleПереводчик/GoogleПереводчик.mdo new file mode 100644 index 000000000..24a2fd713 --- /dev/null +++ b/SSL/src/CommonModules/GoogleПереводчик/GoogleПереводчик.mdo @@ -0,0 +1,11 @@ + + + GoogleПереводчик + + ru + Google переводчик + + true + true + true + diff --git a/SSL/src/CommonModules/GoogleПереводчик/Module.bsl b/SSL/src/CommonModules/GoogleПереводчик/Module.bsl new file mode 100644 index 000000000..13730c72f --- /dev/null +++ b/SSL/src/CommonModules/GoogleПереводчик/Module.bsl @@ -0,0 +1,211 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ПеревестиТекст(Текст, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + Если Не ЗначениеЗаполнено(Текст) Тогда + Возврат Текст; + КонецЕсли; + + Возврат ПеревестиТексты(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Текст), ЯзыкПеревода, ИсходныйЯзык)[Текст]; + +КонецФункции + +Функция ПеревестиТексты(Тексты, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПеревестиТексты", "Тексты", Тексты, Тип("Массив")); + + Если Не ЗначениеЗаполнено(ЯзыкПеревода) Тогда + ЯзыкПеревода = ОбщегоНазначения.КодОсновногоЯзыка(); + КонецЕсли; + + ИмяХоста = "translation.googleapis.com"; + + УстановитьПривилегированныйРежим(Истина); + HTTPЗапрос = Новый HTTPЗапрос("/language/translate/v2?key=" + НастройкиАвторизации().КлючAPI); + УстановитьПривилегированныйРежим(Ложь); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("format", "text"); + ПараметрыЗапроса.Вставить("q", Тексты); + ПараметрыЗапроса.Вставить("target", ЯзыкПеревода); + + Если ЗначениеЗаполнено(ИсходныйЯзык) Тогда + ПараметрыЗапроса.Вставить("source", ИсходныйЯзык); + КонецЕсли; + + HTTPЗапрос.УстановитьТелоИзСтроки(ЗначениеВJSON(ПараметрыЗапроса)); + РезультатЗапроса = ВыполнитьЗапрос(HTTPЗапрос, ИмяХоста); + + Если Не РезультатЗапроса.ЗапросВыполнен Тогда + ВызватьИсключение ТекстОшибки(НСтр("ru = 'Не удалось выполнить перевод текста.'")); + КонецЕсли; + + ОтветСервера = JSONВЗначение(РезультатЗапроса.ОтветСервера); + + Результат = Новый Соответствие; + Для Индекс = 0 По Тексты.ВГраница() Цикл + Перевод = ОтветСервера["data"]["translations"][Индекс]; + Результат.Вставить(Тексты[Индекс], Перевод["translatedText"]); + Если Не ЗначениеЗаполнено(ИсходныйЯзык) Тогда + ИсходныйЯзык = Перевод["detectedSourceLanguage"]; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция МаксимальныйРазмерПорции() Экспорт + + Возврат 10000; + +КонецФункции + +Функция ДоступныеЯзыки() Экспорт + + ИмяХоста = "translation.googleapis.com"; + + УстановитьПривилегированныйРежим(Истина); + HTTPЗапрос = Новый HTTPЗапрос("/language/translate/v2/languages?key=" + НастройкиАвторизации().КлючAPI); + УстановитьПривилегированныйРежим(Ложь); + + РезультатЗапроса = ВыполнитьЗапрос(HTTPЗапрос, ИмяХоста); + + Если Не РезультатЗапроса.ЗапросВыполнен Тогда + ВызватьИсключение ТекстОшибки(НСтр("ru = 'Не удалось получить список доступных языков.'")); + КонецЕсли; + + Результат = Новый Массив; + ДоступныеЯзыки = JSONВЗначение(РезультатЗапроса.ОтветСервера); + Для Каждого Язык Из ДоступныеЯзыки["data"]["languages"] Цикл + КодЯзыка = Язык["language"]; + Результат.Добавить(КодЯзыка); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ВыполнитьЗапрос(Знач HTTPЗапрос, Знач ИмяХоста) + + Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https"); + ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(); + + Попытка + Соединение = Новый HTTPСоединение(ИмяХоста, , , , Прокси, 60, ЗащищенноеСоединение); + HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); + Исключение + ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить соединение с сервером %1 по причине: + |%2'"), ИмяХоста, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ВызватьИсключение; + КонецПопытки; + + Результат = Новый Структура; + Результат.Вставить("ЗапросВыполнен", Ложь); + Результат.Вставить("ОтветСервера", ""); + + Если HTTPОтвет.КодСостояния <> 200 Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запрос ""%1"" не выполнен. Код состояния: %2.'"), HTTPЗапрос.АдресРесурса, HTTPОтвет.КодСостояния) + Символы.ПС + + HTTPОтвет.ПолучитьТелоКакСтроку(); + ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки); + КонецЕсли; + + Если HTTPОтвет.КодСостояния = 401 + Или HTTPОтвет.КодСостояния = 403 Тогда + ИнформацияОбОшибке = JSONВЗначение(HTTPОтвет.ПолучитьТелоКакСтроку()); + ВызватьИсключение ИнформацияОбОшибке["error"]["message"]; + КонецЕсли; + + Результат.ЗапросВыполнен = HTTPОтвет.КодСостояния = 200; + Результат.ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(); + + Возврат Результат; + +КонецФункции + +Функция НастройкиАвторизации() Экспорт + + ИменаПараметров = "КлючAPI"; + Результат = Новый Структура(ИменаПараметров); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.СервисПереводаТекста"); + Настройки = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, ИменаПараметров); + + Если ТипЗнч(Настройки) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(Результат, Настройки); + ИначеЕсли ТипЗнч(Настройки) = Тип("Строка") Тогда + Результат.КлючAPI = Настройки; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Параметры: +// Настройки - см. ПереводТекстаНаДругиеЯзыки.НастройкиСервисаПереводаТекста +// +Процедура ПриОпределенииНастроек(Настройки) Экспорт + + Настройки.ИнструкцияПоПодключению = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Как настроить: + |1. Активируйте платежный аккаунт в Google Cloud. + |2. На странице Учетные данные нажмите на кнопку Создать учетные данные, выберите Ключ API. + |3. Скопируйте полученную строку из поля Ваш ключ API в поле Ключ API.'")); + + Параметр = Настройки.ПараметрыАвторизации.Добавить(); + Параметр.Имя = "КлючAPI"; + Параметр.Представление = НСтр("ru = 'Ключ API'"); + Параметр.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСверху; + +КонецПроцедуры + +Функция НастройкаВыполнена() Экспорт + + УстановитьПривилегированныйРежим(Истина); + Возврат ЗначениеЗаполнено(НастройкиАвторизации().КлючAPI); + +КонецФункции + +Функция ЗначениеВJSON(Значение) + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + ЗаписатьJSON(ЗаписьJSON, Значение); + Возврат ЗаписьJSON.Закрыть(); +КонецФункции + +Функция JSONВЗначение(Строка, ИменаСвойствСоЗначениямиДата = Неопределено) + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Строка); + Возврат ПрочитатьJSON(ЧтениеJSON, Истина, ИменаСвойствСоЗначениямиДата); +КонецФункции + +Процедура ЗаписатьОшибкуВЖурналРегистрации(Комментарий) + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , Перечисления.СервисыПереводаТекста.ЯндексПереводчик, Комментарий); + +КонецПроцедуры + +Функция ТекстОшибки(ТекстОшибки) + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + Возврат ТекстОшибки + Символы.ПС + НСтр("ru = 'Подробности см. в журнале регистрации.'"); + КонецЕсли; + + Возврат ТекстОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'"); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl index c429efb19..a744894a1 100644 --- a/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРабота/Module.bsl @@ -27,7 +27,7 @@ // - РегистрНакопленияМенеджерЗаписи // - РегистрБухгалтерииМенеджерЗаписи // - РегистрРасчетаМенеджерЗаписи - менеджер записи. -// ТолькоПросмотр - Булево - свойство ТолькоПросмотр формы. +// ТолькоПросмотр - Булево - свойство ТолькоПросмотр формы. // Процедура ОбъектПриЧтенииНаСервере(ТекущийОбъект, ТолькоПросмотр) Экспорт @@ -44,7 +44,7 @@ // и автономным рабочим местом в случаях когда, не задан пароль для установки подключения. // // Параметры: -// Источник - РегистрСведенийНаборЗаписей.НастройкиТранспортаОбменаДанными - запись регистра настроек транспорта, +// Источник - РегистрСведенийНаборЗаписей.НастройкиТранспортаОбменаДанными - запись регистра настроек транспорта, // которая была изменена. // Процедура ОтключитьАвтоматическуюСинхронизациюДанныхСПриложениемВИнтернете(Источник) Экспорт diff --git a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl index 64b356f7c..8bf4ba169 100644 --- a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl @@ -109,16 +109,19 @@ // Функция КоличествоАвтономныхРабочихМест() Экспорт + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтрШаблон(ШаблонТекста, ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = " |ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Количество |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК Таблица + | &ИмяПланаОбмена КАК Таблица |ГДЕ | Таблица.Ссылка <> &ПриложениеВСервисе | И НЕ Таблица.ПометкаУдаления"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ПриложениеВСервисе", ПриложениеВСервисе()); @@ -152,16 +155,19 @@ // Функция АвтономноеРабочееМесто() Экспорт + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтрШаблон(ШаблонТекста, ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 | Таблица.Ссылка КАК АвтономноеРабочееМесто |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК Таблица + | &ИмяПланаОбмена КАК Таблица |ГДЕ | Таблица.Ссылка <> &ПриложениеВСервисе | И НЕ Таблица.ПометкаУдаления"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ПриложениеВСервисе", ПриложениеВСервисе()); @@ -205,15 +211,15 @@ "ВЫБРАТЬ | МИНИМУМ(СостоянияУспешныхОбменовДанными.ДатаОкончания) КАК ДатаСинхронизации |ИЗ - | [СостоянияУспешныхОбменовДанными] КАК СостоянияУспешныхОбменовДанными + | &СостоянияУспешныхОбменовДанными КАК СостоянияУспешныхОбменовДанными |ГДЕ | СостоянияУспешныхОбменовДанными.УзелИнформационнойБазы = &АвтономноеРабочееМесто"; Если ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияУспешныхОбменовДанными]", "РегистрСведений.СостоянияУспешныхОбменовДаннымиОбластейДанных"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СостоянияУспешныхОбменовДанными", "РегистрСведений.СостоянияУспешныхОбменовДаннымиОбластейДанных"); Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияУспешныхОбменовДанными]", "РегистрСведений.СостоянияУспешныхОбменовДанными"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СостоянияУспешныхОбменовДанными", "РегистрСведений.СостоянияУспешныхОбменовДанными"); КонецЕсли; Запрос = Новый Запрос; @@ -230,15 +236,18 @@ // Функция СформироватьНаименованиеАвтономногоРабочегоМестаПоУмолчанию() Экспорт - ТекстЗапроса = " - |ВЫБРАТЬ + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтрШаблон(ШаблонТекста, ПланОбменаАвтономнойРаботы()); + + ТекстЗапроса = + "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Количество |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК Таблица + | &ИмяПланаОбмена КАК Таблица |ГДЕ | Таблица.Наименование ПОДОБНО &ШаблонИмени"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -355,36 +364,35 @@ // Функция МониторАвтономныхРабочихМест() Экспорт - ТекстЗапроса = " - |ВЫБРАТЬ + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтрШаблон(ШаблонТекста, ПланОбменаАвтономнойРаботы()); + + ТекстЗапроса = "ВЫБРАТЬ | СостоянияУспешныхОбменовДанными.УзелИнформационнойБазы КАК АвтономноеРабочееМесто, | МИНИМУМ(СостоянияУспешныхОбменовДанными.ДатаОкончания) КАК ДатаСинхронизации |ПОМЕСТИТЬ СостоянияУспешныхОбменовДанными |ИЗ | РегистрСведений.СостоянияУспешныхОбменовДаннымиОбластейДанных КАК СостоянияУспешныхОбменовДанными - | |СГРУППИРОВАТЬ ПО | СостоянияУспешныхОбменовДанными.УзелИнформационнойБазы |; | + | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПланОбмена.Ссылка КАК АвтономноеРабочееМесто, | ЕСТЬNULL(СостоянияУспешныхОбменовДанными.ДатаСинхронизации, Неопределено) КАК ДатаСинхронизации |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена - | - | ЛЕВОЕ СОЕДИНЕНИЕ СостоянияУспешныхОбменовДанными КАК СостоянияУспешныхОбменовДанными - | ПО ПланОбмена.Ссылка = СостоянияУспешныхОбменовДанными.АвтономноеРабочееМесто - | + | &ИмяПланаОбмена КАК ПланОбмена + | ЛЕВОЕ СОЕДИНЕНИЕ СостоянияУспешныхОбменовДанными КАК СостоянияУспешныхОбменовДанными + | ПО ПланОбмена.Ссылка = СостоянияУспешныхОбменовДанными.АвтономноеРабочееМесто |ГДЕ | ПланОбмена.Ссылка <> &ПриложениеВСервисе | И НЕ ПланОбмена.ПометкаУдаления - | |УПОРЯДОЧИТЬ ПО | ПланОбмена.Представление"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ПланОбменаАвтономнойРаботы()); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ПриложениеВСервисе", ПриложениеВСервисе()); diff --git a/SSL/src/CommonModules/АдминистрированиеКластера/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластера/Module.bsl index 7f80b7f1c..34f071eaf 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластера/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластера/Module.bsl @@ -626,6 +626,53 @@ КонецПроцедуры +// Свойства фильтра сеансов. +// Для использования в функциях СеансыИнформационнойБазы, УдалитьСеансыИнформационнойБазы и аналогичных. +// +// Возвращаемое значение: +// Структура: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация. +// Допустимые значения - см. возвращаемое значение функции АдминистрированиеКластера.СвойстваСеанса. +// * ВидСравнения - ВидСравнения - вид сравнения значений сеансов с указанным в условии фильтра. +// Допустимые значения: +// ВидСравнения.Равно, +// ВидСравнения.НеРавно, +// ВидСравнения.Больше (только для числовых значений), +// ВидСравнения.БольшеИлиРавно (только для числовых значений), +// ВидСравнения.Меньше (только для числовых значений), +// ВидСравнения.МеньшеИлиРавно (только для числовых значений), +// ВидСравнения.ВСписке, +// ВидСравнения.НеВСписке, +// ВидСравнения.Интервал (только для числовых значений), +// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), +// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), +// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений). +// * Значение - Число +// - Строка +// - Дата +// - Булево +// - СписокЗначений +// - Массив +// - Структура - значение, с которым +// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке +// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми +// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, +// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны +// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться +// соответствующее сравнение. +// +Функция ФильтрСеансов() Экспорт + + Результат = Новый Структура(); + + Результат.Вставить("Свойство"); + Результат.Вставить("ВидСравнения", ВидСравнения.Равно); + Результат.Вставить("Значение"); + + Возврат Результат; + +КонецФункции + #КонецОбласти #Область СоединенияСИнформационнойБазой @@ -784,6 +831,53 @@ КонецПроцедуры +// Свойства фильтра соединений. +// Для использования в функциях СоединенияСИнформационнойБазой, РазорватьСоединенияСИнформационнойБазой и аналогичных. +// +// Возвращаемое значение: +// Структура: +// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация. +// Допустимые значения - см. возвращаемое значение функции АдминистрированиеКластера.СвойстваСоединения. +// * ВидСравнения - ВидСравнения - вид сравнения значений сеансов с указанным в условии фильтра. +// Допустимые значения: +// ВидСравнения.Равно, +// ВидСравнения.НеРавно, +// ВидСравнения.Больше (только для числовых значений), +// ВидСравнения.БольшеИлиРавно (только для числовых значений), +// ВидСравнения.Меньше (только для числовых значений), +// ВидСравнения.МеньшеИлиРавно (только для числовых значений), +// ВидСравнения.ВСписке, +// ВидСравнения.НеВСписке, +// ВидСравнения.Интервал (только для числовых значений), +// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), +// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), +// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений). +// * Значение - Число +// - Строка +// - Дата +// - Булево +// - СписокЗначений +// - Массив +// - Структура - значение, с которым +// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке +// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми +// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, +// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны +// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться +// соответствующее сравнение. +// +Функция ФильтрСоединений() Экспорт + + Результат = Новый Структура(); + + Результат.Вставить("Свойство"); + Результат.Вставить("ВидСравнения", ВидСравнения.Равно); + Результат.Вставить("Значение"); + + Возврат Результат; + +КонецФункции + #КонецОбласти #Область ПрофилиБезопасности @@ -1437,100 +1531,6 @@ #Область СлужебныеПроцедурыИФункции -// Свойства фильтра сеансов. -// Для использования в функциях СеансыИнформационнойБазы, УдалитьСеансыИнформационнойБазы и аналогичных. -// -// Возвращаемое значение: -// Структура: -// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация. -// Допустимые значения - см. возвращаемое значение функции АдминистрированиеКластера.СвойстваСеанса. -// * ВидСравнения - ВидСравнения - вид сравнения значений сеансов с указанным в условии фильтра. -// Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений). -// * Значение - Число -// - Строка -// - Дата -// - Булево -// - СписокЗначений -// - Массив -// - Структура - значение, с которым -// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение. -// -Функция ФильтрСеансов() Экспорт - - Результат = Новый Структура(); - - Результат.Вставить("Свойство"); - Результат.Вставить("ВидСравнения", ВидСравнения.Равно); - Результат.Вставить("Значение"); - - Возврат Результат; - -КонецФункции - -// Свойства фильтра соединений. -// Для использования в функциях СоединенияСИнформационнойБазой, РазорватьСоединенияСИнформационнойБазой и аналогичных. -// -// Возвращаемое значение: -// Структура: -// * Свойство - Строка - имя свойства, по которому осуществляется фильтрация. -// Допустимые значения - см. возвращаемое значение функции АдминистрированиеКластера.СвойстваСоединения. -// * ВидСравнения - ВидСравнения - вид сравнения значений сеансов с указанным в условии фильтра. -// Допустимые значения: -// ВидСравнения.Равно, -// ВидСравнения.НеРавно, -// ВидСравнения.Больше (только для числовых значений), -// ВидСравнения.БольшеИлиРавно (только для числовых значений), -// ВидСравнения.Меньше (только для числовых значений), -// ВидСравнения.МеньшеИлиРавно (только для числовых значений), -// ВидСравнения.ВСписке, -// ВидСравнения.НеВСписке, -// ВидСравнения.Интервал (только для числовых значений), -// ВидСравнения.ИнтервалВключаяГраницы (только для числовых значений), -// ВидСравнения.ИнтервалВключаяНачало (только для числовых значений), -// ВидСравнения.ИнтервалВключаяОкончание (только для числовых значений). -// * Значение - Число -// - Строка -// - Дата -// - Булево -// - СписокЗначений -// - Массив -// - Структура - значение, с которым -// сравнивается значение соответствующего свойства сеанса. При ВидСравнения.ВСписке и ВидСравнения.НеВСписке -// в качестве значения должны передаваться СписокЗначений или Массив, содержащие набор значений, с которыми -// будет выполняться сравнение. При ВидСравнения.Интервал, ВидСравнения.ИнтервалВключаяГраницы, -// ВидСравнения.ИнтервалВключаяНачало и ВидСравнения.ИнтервалВключаяОкончание в качестве значения должны -// передаваться структуры с полями С и По, значения которых образуют интервал, с которым будет выполняться -// соответствующее сравнение. -// -Функция ФильтрСоединений() Экспорт - - Результат = Новый Структура(); - - Результат.Вставить("Свойство"); - Результат.Вставить("ВидСравнения", ВидСравнения.Равно); - Результат.Вставить("Значение"); - - Возврат Результат; - -КонецФункции - Процедура ДобавитьУсловиеФильтра(Фильтр, Знач Свойство, Знач ВидСравненияЗначений, Знач Значение) Экспорт Если Фильтр = Неопределено Тогда diff --git a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl index a09164107..d747db024 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераRASКлиентСервер/Module.bsl @@ -609,7 +609,7 @@ // Фильтр - Структура - параметры фильтрации информационных баз. // // Возвращаемое значение: -// Массив(Структура). +// Массив из Структура // Функция СвойстваИнформационныхБаз(Знач ИдентификаторКластера, Знач ПараметрыАдминистрированияКластера, Знач Фильтр = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl index 6f79d12e5..b8ae8d498 100644 --- a/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдминистрированиеКластераКлиентСервер/Module.bsl @@ -624,7 +624,7 @@ // Возвращаемое значение: // Строка - имя профиля безопасности, назначенного для информационной базы в качестве профиля // безопасности безопасного режима. Если для информационной базы не назначен профиль безопасности - возвращается пустая -// строка. +// Строка // Функция ПрофильБезопасностиБезопасногоРежимаИнформационнойБазы(Знач ПараметрыАдминистрированияКластера, Знач ПараметрыАдминистрированияИБ = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl index d31b3d813..e9a83ead2 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -147,18 +147,6 @@ // "САЙТ", "ИТС". // * ПолеОшибки - Строка - имя реквизита для привязки сообщений об ошибке. // -// Возвращаемое значение: -// Структура: -// * КодыРегионов - Массив - содержит числовые значения кодов регионов-субъектов для которых доступны -// все файлы. -// * ЕстьВсеФайлы - Булево - флаг того, что можно загружать все регионы. -// * Ошибки - Структура - см. описание ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю. -// * ФайлыПоРегионам - Соответствие - соответствие файлов регионам. Ключ может быть: -// - числом (код региона), тогда значение - массив имен файлов, необходимых -// для загрузки этого региона -// - символом "*", тогда значение - массив имен файлов, необходимых для -// загрузки всех регионов. -// Процедура АнализДоступностиФайловКлассификатораВКаталоге(ОписаниеЗавершения, КодыРегионов, Каталог, ПараметрыЗагрузки) Экспорт РабочийКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Каталог); @@ -185,7 +173,7 @@ // Параметры загрузки файлов. // // Возвращаемое значение: -// Структура: +// Структура: // * ИндексРегиона - Неопределено - индекс региона; // * ИмяФайла - Строка - имя файла региона; // * КодРегиона - Неопределено -цифровой код региона; diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl index d03e8b2bd..f9494d42d 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебный/Module.bsl @@ -327,7 +327,7 @@ // Проверка адрес на соответствие ФИАС // // Параметры: -// Адреса - Соответствие: +// Адреса - Соответствие из КлючИЗначение: // * Ключ - Число - уникальный ключ адреса, // * Значение - Строка - строка в формате JSON с адресом. // ПроверятьУстареваниеАдресов - Булево @@ -719,8 +719,7 @@ КонецЕсли; - ВариантыДомов.Индексы.Добавить("ДомЧислом, Дом, Корпус, Строение"); - ВариантыДомов.Сортировать("ДомЧислом, Дом, Строение, Корпус"); + ВариантыДомов.Сортировать("ПредставлениеДляСортировки"); Возврат ВариантыДомов; @@ -824,8 +823,6 @@ Возврат ВариантыЗемельныхУчастков; КонецЕсли; - НаименованиеЗданийИСтроений = АдресныйКлассификаторПовтИсп.НаименованиеВладенийИСтроений(); - Для каждого СведенияОДоме Из РезультатВебСервис.Данные Цикл ОписаниеУчастка = ОписаниеДомаИЗемельногоУчастка(); @@ -1034,7 +1031,7 @@ // НаборАдресов - Соответствие // ПроверятьУстареваниеАдресов - Булево // Возвращаемое значение: -// Соответствие из КлючИЗначение - где: +// Соответствие из КлючИЗначение: // * Ключ - Число // * Значение - см. РезультатПроверкиАдреса // @@ -1270,7 +1267,7 @@ КонецФункции // Возвращаемое значение: -// Соответствие Из КлючИЗначение - где: +// Соответствие из КлючИЗначение: // * Ключ - Число // * Значение - Структура: // ** Отказ - Булево - поставщик не доступен. @@ -1683,16 +1680,18 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем конфигурации. - Функция НавигационнаяСсылкаЗагрузкиАдресногоКлассификатора() Экспорт Возврат "e1cib/command/РегистрСведений.АдресныеОбъекты.Команда.ЗагрузитьАдресныйКлассификатор"; КонецФункции -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +Функция ЕстьПравоДобавлениеИзменениеАдресныхСведений() Экспорт + Возврат ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем конфигурации. + +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -1709,10 +1708,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -1761,10 +1756,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт // Заполнение начальных данных. @@ -1777,10 +1768,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1841,10 +1830,6 @@ КонецПроцедуры -Функция ЕстьПравоДобавлениеИзменениеАдресныхСведений() Экспорт - Возврат ПравоДоступа("Изменение", Метаданные.РегистрыСведений.АдресныеОбъекты); -КонецФункции - #Область АдресныйКлассификаторВМоделиСервиса //////////////////////////////////////////////////////////////////////////////// @@ -1857,9 +1842,7 @@ КонецПроцедуры -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.Константы.ИсточникДанныхАдресногоКлассификатора); @@ -4534,16 +4517,16 @@ // Проверка адрес на соответствие ФИАС // // Параметры: -// Адреса - Соответствие: +// Адреса - Соответствие из КлючИЗначение: // * Ключ - Число - уникальный ключ адреса, // * Значение - Строка - строка в формате JSON с адресом. // // Возвращаемое значение: -// Соответствие Из КлючИЗначение- где: +// Соответствие из КлючИЗначение: // * Ключ - Число - уникальный ключ адреса, // * Значение - Структура: // * Ошибки - Массив из Строка - список ошибок -// * Варианты - Массив Из Строка - варианты нового адреса, если адрес устарел +// * Варианты - Массив из Строка - варианты нового адреса, если адрес устарел // * АдресПроверен - Булево - признак, что адрес был проверен // * АдресКорректный - Булево - признак, что адрес корректный // @@ -6560,16 +6543,14 @@ // Получает идентификаторы адреса через веб-сервис. // // Параметры: +// Результат - Структура: +// * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - идентификатор адресного объекта (улицы, нас. пункта). +// * ИдентификаторДома - УникальныйИдентификатор - идентификатор дома адресного объекта. +// * Отказ - Булево - поставщик не доступен. +// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено. +// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено. // АдресДляПроверки - Строка - строка XML контактной информации содержащая адрес. // -// Возвращаемое значение: -// Структура: -// * ИдентификаторАдресногоОбъекта - УникальныйИдентификатор - идентификатор адресного объекта (улицы, нас. пункта). -// * ИдентификаторДома - УникальныйИдентификатор - идентификатор дома адресного объекта. -// * Отказ - Булево - поставщик не доступен. -// * ПодробноеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено. -// * КраткоеПредставлениеОшибки - Строка - описание ошибки, если поставщик недоступен иначе Неопределено. -// Процедура ОпределитьИдентификаторыАдресаСервис1С(Результат, АдресДляПроверки) Сервис = АдресныйКлассификаторПовтИсп.СервисКлассификатора1С(); @@ -6741,7 +6722,7 @@ // Возвращаемое значение: // Структура: -// * Данные - соответствие из КлючИЗначение - где: +// * Данные - Соответствие из КлючИЗначение: // ** Ключ - Число - идентификатор адреса // ** Значение - см. РезультатПроверкиАдреса // * КраткоеПредставлениеОшибки - Строка @@ -7097,10 +7078,10 @@ // Выполняет обратное действие для функции УникальныйИдентификаторВДвоичныеДанные. // // Параметры: -// ДвоичныеДанные - исходные данные. +// ДвоичныеДанные - ДвоичныеДанные - исходные данные // // Возвращаемое значение: -// УникальныйИдентификатор - результат преобразования. +// УникальныйИдентификатор // Функция УникальныйИдентификаторИзДвоичныхДанных(ДвоичныеДанные) @@ -7114,13 +7095,13 @@ КонецФункции // Преобразует строку base64 в УникальныйИдентификатор. +// Возвращаемый идентификатор зависит от регистра букв, передавай строки. // // Параметры: // Строка - Строка - регистрозависимые исходные данные. // // Возвращаемое значение: -// Идентификатор - результат преобразования. -// Возвращаемый идентификатор зависит от регистра букв, передавай строки. +// УникальныйИдентификатор // Функция УникальныйИдентификаторИзСтроки64(Строка) @@ -7131,12 +7112,12 @@ // Преобразует строку в ДвоичныеДанные. // // Параметры: -// Строка - исходные данные. +// Строка - Строка - исходные данные. // // Возвращаемое значение: // ДвоичныеДанные - результат преобразования. // -Функция ДвоичныеДанныеИзСтроки(Строка) +Функция ДвоичныеДанныеИзСтроки(Строка) Возврат XMLЗначение(Тип("ДвоичныеДанные"), Строка); @@ -7186,6 +7167,9 @@ // Имя событие для записи в журнал регистрации. // +// Возвращаемое значение: +// Строка +// Функция СобытиеЖурналаРегистрации() Экспорт Возврат НСтр("ru = 'Адресный классификатор'", ОбщегоНазначения.КодОсновногоЯзыка()); @@ -7334,7 +7318,7 @@ // Параметры: // СтрокаСоСпискомДомов - Строка - описание списка домов из регистра сведения. // СтрокаПоиска - Строка - строка отбора. -// ВариантыДомов - Список значений - список домов. +// ВариантыДомов - СписокЗначений - список домов. // Процедура ИзвлечьСписокДомов(СтрокаСоСпискомДомов, СтрокаПоиска, ВариантыДомов, Запись, ТочноеСовпадение) @@ -7348,15 +7332,10 @@ ОписаниеДома = ОписаниеДомаИЗемельногоУчастка(); ОписаниеДома.Идентификатор = УникальныйИдентификаторИзСтроки64(Лев(Дом, 24)); - Если ЗначениеЗаполнено(НомерДома[0]) Тогда - ОписаниеДома.ВидВладения = ТипЧисло.ПривестиЗначение(Лев(НомерДома[0], 1)); - ОписаниеДома.Дом = Сред(НомерДома[0], 2); - ДомЧислом = Формат(НомерДомаЧислом(ОписаниеДома.Дом), "ЧЦ=4; ЧН=; ЧВН=; ЧГ=0; ЧФ=1Ч"); - Если ЗначениеЗаполнено(ОписаниеДома.ВидВладения) Тогда - ОписаниеДома.НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ОписаниеДома.ВидВладения); - КонецЕсли; - Иначе - ДомЧислом = "10000"; + ОписаниеДома.ВидВладения = ТипЧисло.ПривестиЗначение(Лев(НомерДома[0], 1)); + ОписаниеДома.Дом = СокрЛП(Сред(НомерДома[0], 2)); + Если ЗначениеЗаполнено(ОписаниеДома.ВидВладения) Тогда + ОписаниеДома.НазваниеВладения = НаименованиеЗданийИСтроений.Владения.Получить(ОписаниеДома.ВидВладения); КонецЕсли; ОписаниеДома.Индекс = Формат(Запись.ПочтовыйИндекс, "ЧГ=0"); @@ -7369,18 +7348,16 @@ ОписаниеДома.КодКЛАДР = Формат(Запись.КодКЛАДР, "ЧГ=0"); Если НомерДома.Количество() > 1 Тогда + ОписаниеДома.Корпус = НомерДома[1]; - КорпусЧислом = Формат(НомерДомаЧислом(ОписаниеДома.Корпус), "ЧЦ=4; ЧН=; ЧВН=; ЧГ=0; ЧФ=1Ч"); Если НомерДома.Количество() > 2 Тогда ОписаниеДома.ВидСтроения = ТипЧисло.ПривестиЗначение(НомерДома[2]); Если НомерДома.Количество() > 3 Тогда ОписаниеДома.Строение = НомерДома[3]; КонецЕсли; КонецЕсли; - Иначе - КорпусЧислом = "10000"; + КонецЕсли; - ОписаниеДома.ДомЧислом = ТипЧисло.ПривестиЗначение(ДомЧислом + КорпусЧислом); Если ЗначениеЗаполнено(СтрокаПоиска) Тогда Если ТочноеСовпадение Тогда @@ -7449,9 +7426,9 @@ Если ЗначениеЗаполнено(ОписаниеДома.Корпус) Тогда Если ПустаяСтрока(СтрокаПоиска) Или Не СтрНачинаетсяС(ОписаниеДома.Корпус, СтрокаПоиска) Тогда - ТекстПроСтроения = "корпус" + " " + ОписаниеДома.Корпус; + ТекстПроСтроения = "Корпус" + " " + ОписаниеДома.Корпус; Иначе - ТекстПроСтроения = СтроковыеФункции.ФорматированнаяСтрока("корпус %1%2", + ТекстПроСтроения = СтроковыеФункции.ФорматированнаяСтрока("Корпус %1%2", СтрокаПоиска, Сред(ОписаниеДома.Корпус, СтрДлина(СтрокаПоиска) + 1)); КонецЕсли; @@ -7468,6 +7445,8 @@ Если ЗначениеЗаполнено(ОписаниеДома.Строение) Тогда НазваниеСтроения = ?(ПустаяСтрока(ОписаниеДома.НазваниеСтроения), НРег(НаименованиеЗданийИСтроений.Строения.Получить(ОписаниеДома.ВидСтроения)), ОписаниеДома.НазваниеСтроения); + + НазваниеСтроения = ТРег(НазваниеСтроения); Разделитель = ?(ПустаяСтрока(ТекстПроСтроения), "", ", "); @@ -7497,11 +7476,19 @@ ЗаполнитьЗначенияСвойств(НомерДомаИСтроения, ОписаниеДома, "Идентификатор, Индекс, ОКТМО, ОКАТО, КодИФНСФЛ, КодИФНСЮЛ, КодУчасткаИФНСФЛ, КодУчасткаИФНСЮЛ, КодКЛАДР"); + Если ВариантыДомов.Найти(Строка(ТекстПроДомФормат), "Представление") <> Неопределено Тогда + Возврат; // Дубль дома + КонецЕсли; + ИнформацияОДоме = ВариантыДомов.Добавить(); ЗаполнитьЗначенияСвойств(ИнформацияОДоме, ОписаниеДома); ИнформацияОДоме.Значение = НомерДомаИСтроения; ИнформацияОДоме.Представление = ТекстПроДомФормат; + ИнформацияОДоме.ПредставлениеДляСортировки = СокрЛП(ОписаниеДома.НазваниеВладения) + НомераДляСортировки(ОписаниеДома.Дом) + + ?(ЗначениеЗаполнено(ОписаниеДома.Корпус), "корпус", "") + НомераДляСортировки(ОписаниеДома.Корпус) + + СокрЛП(НазваниеСтроения) + НомераДляСортировки(ОписаниеДома.Строение); + КонецПроцедуры // Возвращаемое значение: @@ -7535,14 +7522,22 @@ КонецФункции -Функция НомерДомаЧислом(ИсходнаяСтрока) +Функция НомераДляСортировки(ИсходнаяСтрока) НаборСимволов = СтрРазделить(ИсходнаяСтрока, "0123456789", Ложь); СимволыДляУдаления = СтрСоединить(НаборСимволов); НаборЦифр = СтрРазделить(ИсходнаяСтрока, СимволыДляУдаления, Ложь); ИтоговоеЧисло = СтрСоединить(НаборЦифр); - Возврат ?(ПустаяСтрока(ИтоговоеЧисло), 0, Число(ИтоговоеЧисло)); + ТипЧисло = ОбщегоНазначения.ОписаниеТипаЧисло(6); + Результат = ТипЧисло.ПривестиЗначение(ИтоговоеЧисло); + + Если Результат = 0 Тогда + Возврат ""; + КонецЕсли; + + Возврат Формат(Результат ,"ЧЦ=6; ЧН=; ЧВН=; ЧГ=0" ); + КонецФункции Функция КодыДомовВладенийИСтроений() @@ -7777,7 +7772,8 @@ // Проверяет наличие обновлений адресного классификатора на веб сервере // для тех объектов, которые ранее уже загружались. // -// Возвращаемое значение - ТаблицаЗначений - описание добавленных и измененных субъектов. Содержит Колонки: +// Возвращаемое значение: +// ТаблицаЗначений - описание добавленных и измененных субъектов. Содержит Колонки: // * КодСубъектаРФ - Число - код субъекта РФ. // * Наименование - Строка - наименование субъекта РФ. // * Сокращение - Строка - сокращение субъекта РФ. @@ -8006,7 +8002,6 @@ Если ФайлЗагрузки = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'"); - Возврат; КонецЕсли; ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения; @@ -8190,7 +8185,6 @@ Процедура ЗагрузитьСвязиАдресныхОбъектов(КодСубъектаРФ, КаталогФайлов, ЗагружатьОднимНабором) - Сжатие = Новый СжатиеДанных(9); ФайлЗагрузки = ФайлЗагрузкиСубъектаРФ(КодСубъектаРФ, КаталогФайлов, "LINK", "Links"); Если ФайлЗагрузки = Неопределено Тогда @@ -8303,7 +8297,6 @@ Если ФайлЗагрузки = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Загрузка адресных сведений прервана. В загружаемых файлах не найден файл с адресными сведениями.'"); - Возврат; КонецЕсли; ТекущаяЗапись = ФайлЗагрузки.ФайлЧтения; @@ -8572,7 +8565,7 @@ Попытка БлокировкаДанных = Новый БлокировкаДанных; - ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.УровниСокращенийАдресныхСведений"); + БлокировкаДанных.Добавить("РегистрСведений.УровниСокращенийАдресныхСведений"); БлокировкаДанных.Заблокировать(); // Т.к. адресный классификатор не содержит сведений, то очищаем таблицу адресных сведений. @@ -9105,27 +9098,30 @@ // Возвращаемое значение: // ТаблицаЗначений: -// * ДомЧислом - Число +// * ПредставлениеДляСортировки - Строка // * Дом - Строка // * Корпус - Строка // * Строение - Строка // * Значение - см. ОписаниеДомаИСтроения // * Представление - Строка -// * Идентификатор - Строка +// * Идентификатор - УникальныйИдентификатор // Функция КонструкторСпискаДомов() Экспорт ВариантыДомов = Новый ТаблицаЗначений; - ВариантыДомов.Колонки.Добавить("ДомЧислом", ОбщегоНазначения.ОписаниеТипаЧисло(12)); + ВариантыДомов.Колонки.Добавить("ПредставлениеДляСортировки", ОбщегоНазначения.ОписаниеТипаСтрока(250)); ВариантыДомов.Колонки.Добавить("Дом", ОбщегоНазначения.ОписаниеТипаСтрока(20)); ВариантыДомов.Колонки.Добавить("Корпус", ОбщегоНазначения.ОписаниеТипаСтрока(20)); ВариантыДомов.Колонки.Добавить("Строение", ОбщегоНазначения.ОписаниеТипаСтрока(20)); - ВариантыДомов.Колонки.Добавить("Значение"); - ВариантыДомов.Колонки.Добавить("Представление"); - ВариантыДомов.Колонки.Добавить("Идентификатор"); + ВариантыДомов.Колонки.Добавить("Значение", Новый ОписаниеТипов("Структура")); + ВариантыДомов.Колонки.Добавить("Представление", ОбщегоНазначения.ОписаниеТипаСтрока(250)); + ВариантыДомов.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); + + ВариантыДомов.Индексы.Добавить("ПредставлениеДляСортировки"); + ВариантыДомов.Индексы.Добавить("Представление"); Возврат ВариантыДомов; - + КонецФункции Функция СопоставлениеУровнейАдреса() diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl index 7d8092c7a..daa03e259 100644 --- a/SSL/src/CommonModules/Анкетирование/Module.bsl +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -24,10 +24,6 @@ КонецПроцедуры // См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей -// -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -50,10 +46,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -361,7 +353,7 @@ // СтрокаРодитель - СтрокаДереваЗначений - родительская строка дерева значений: // * Наименование - Строка // -Процедура ДобавитьСтрокиДереваАнкеты(Выборка,СтрокаРодитель,УровеньРекурсии,Форма) +Процедура ДобавитьСтрокиДереваАнкеты(Выборка,СтрокаРодитель, УровеньРекурсии, Форма) Пока Выборка.Следующий() Цикл @@ -493,7 +485,7 @@ // ТекущиеДанныеДеревоРазделов - ДанныеФормыЭлементДерева - текущий раздел, для которого строится форма заполнения, где: // * Ссылка - СправочникСсылка.ВопросыШаблонаАнкеты // -Процедура ПостроениеФормыЗаполненияПоРазделу(Форма,ТекущиеДанныеДеревоРазделов) Экспорт +Процедура ПостроениеФормыЗаполненияПоРазделу(Форма, ТекущиеДанныеДеревоРазделов) Экспорт ДобавляемыеРеквизиты = Новый Массив; Форма.ТаблицаВопросовРаздела.Очистить(); @@ -549,9 +541,9 @@ // // Параметры: // ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования создаваемых реквизитов формы. -// Форма - Управляемая форма - форма для которой формируется массив реквизитов. +// Форма - ФормаКлиентскогоПриложения - форма, для которой формируется массив реквизитов. // -Процедура СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты,Форма) +Процедура СформироватьДобавляемыеРеквизитыДляРаздела(ДобавляемыеРеквизиты, Форма) Для каждого Строка Из Форма.ТаблицаВопросовРаздела Цикл @@ -567,7 +559,7 @@ // СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты. // ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы. // -Процедура ДобавитьРеквизитыДляВопроса(СтрокаДерева,ДобавляемыеРеквизиты,Форма) +Процедура ДобавитьРеквизитыДляВопроса(СтрокаДерева, ДобавляемыеРеквизиты, Форма) ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); @@ -653,7 +645,7 @@ // СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты. // ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы. // -Процедура ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева,ДобавляемыеРеквизиты,Форма) +Процедура ДобавитьРеквизитыТабличныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма) ТипТабличногоВопроса = СтрокаДерева.ТипТабличногоВопроса; ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); @@ -737,10 +729,10 @@ // СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты. // ДобавляемыеРеквизиты - Массив - предназначен для аккумулирования добавляемых реквизитов формы. // -Процедура ДобавитьРеквизитыКомплексныйВопрос(СтрокаДерева,ДобавляемыеРеквизиты,Форма) +Процедура ДобавитьРеквизитыКомплексныйВопрос(СтрокаДерева, ДобавляемыеРеквизиты, Форма) ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаДерева.КлючСтроки); - Для каждого СтрокаКомплексногоВопроса Из СтрокаДерева.СоставКомплексногоВопроса Цикл + Для каждого СтрокаКомплексногоВопроса Из СтрокаДерева.СоставКомплексногоВопроса Цикл // СтрокаТабличнойЧасти: см. СправочникТабличнаяЧасть.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",СтрокаКомплексногоВопроса.ЭлементарныйВопрос)); Если НайденныеСтроки.Количество() > 0 Тогда @@ -798,11 +790,8 @@ Процедура СформироватьЭлементыФормыДляРаздела(Форма) Для каждого СтрокаТаблицы Из Форма.ТаблицаВопросовРаздела Цикл - ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы,Форма.Элементы.ГруппаТелоАнкеты,Форма); - КонецЦикла; - СпозиционироватьсяНаПервомВопросеРаздела(Форма); КонецПроцедуры @@ -810,7 +799,7 @@ // Устанавливает фокус на первом вопросе открывшегося раздела. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма для которой выполняется действие. +// Форма - см. Документ.Анкета.Форма.ФормаДокумента // Процедура СпозиционироватьсяНаПервомВопросеРаздела(Форма) @@ -842,60 +831,50 @@ // Параметры: // СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты. // ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты. -// УровеньРекурсии - Число - уровень рекурсии вызова процедуры. -// Форма - Управляемая форма - форма для которой добавляются элементы. +// Форма - ФормаКлиентскогоПриложения - форма, для которой добавляются элементы. // -// Возвращаемое значение: -// ГруппаФормы - группа созданных элементов. -// -Функция ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы,ЭлементГруппы,Форма) +Процедура ДобавитьЭлементыФормыПоСтрокеТаблицы(СтрокаТаблицы, ЭлементГруппы, Форма) Если СтрокаТаблицы.ТипСтроки = "Раздел" Тогда - Возврат ДобавитьЭлементыРаздел(СтрокаТаблицы,ЭлементГруппы,Форма); + ДобавитьЭлементыРаздел(СтрокаТаблицы, ЭлементГруппы, Форма); ИначеЕсли СтрокаТаблицы.ТипСтроки = "Вопрос" Тогда - ДобавитьЭлементыВопрос(СтрокаТаблицы,ЭлементГруппы,Форма); + ДобавитьЭлементыВопрос(СтрокаТаблицы, ЭлементГруппы, Форма); КонецЕсли; -КонецФункции +КонецПроцедуры // Добавляет элементы формы для разделов. // // Параметры: // СтрокаДерева - СтрокаДереваЗначений - строка дерева шаблона анкеты. // ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты. -// УровеньРекурсии - Число - уровень рекурсии вызова процедуры. -// Форма - Управляемая форма - форма для которой добавляются элементы. +// Форма - ФормаКлиентскогоПриложения - форма, для которой добавляются элементы. // -// Возвращаемое значение: -// ГруппаФормы - группа созданных элементов. -// -Функция ДобавитьЭлементыРаздел(СтрокаТаблицы,ЭлементГруппы,Форма) +Процедура ДобавитьЭлементыРаздел(СтрокаТаблицы, ЭлементГруппы, Форма) - ИмяРаздела = "Раздел_" + СтрЗаменить(СтрокаТаблицы.КлючСтроки,"-","_"); + ИмяРаздела = "Раздел_" + СтрЗаменить(СтрокаТаблицы.КлючСтроки, "-", "_"); - ЭлементРаздел = Форма.Элементы.Добавить(ИмяРаздела,Тип("ГруппаФормы"),ЭлементГруппы); + ЭлементРаздел = Форма.Элементы.Добавить(ИмяРаздела, Тип("ГруппаФормы"), ЭлементГруппы); ЭлементРаздел.Вид = ВидГруппыФормы.ОбычнаяГруппа; ЭлементРаздел.Заголовок = ПолныйКодНаименование(СтрокаТаблицы); ЭлементРаздел.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; ЭлементРаздел.РастягиватьПоВертикали = Ложь; - Возврат ЭлементРаздел; - -КонецФункции +КонецПроцедуры // Добавляет элементы формы для вопросов. // // Параметры: // СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела. // ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты. -// Форма - ФормаКлиентскогоПриложения- - форма для которой добавляются элементы. +// Форма - ФормаКлиентскогоПриложения - форма для которой добавляются элементы. // -Процедура ДобавитьЭлементыВопрос(СтрокаТаблицы,ЭлементГруппа,Форма) +Процедура ДобавитьЭлементыВопрос(СтрокаТаблицы, ЭлементГруппа, Форма) ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); // Зададим элемент группы для вопроса. - ЭлементГруппаВопроса = Форма.Элементы.Добавить(ИмяВопроса + "_Группа" ,Тип("ГруппаФормы"),ЭлементГруппа); + ЭлементГруппаВопроса = Форма.Элементы.Добавить(ИмяВопроса + "_Группа", Тип("ГруппаФормы"), ЭлементГруппа); ЭлементГруппаВопроса.Вид = ВидГруппыФормы.ОбычнаяГруппа; ЭлементГруппаВопроса.ОтображатьЗаголовок = Ложь; ЭлементГруппаВопроса.Отображение = ОтображениеОбычнойГруппы.Нет; @@ -1126,9 +1105,9 @@ // Параметры: // СтрокаТаблицы - ДанныеФормыЭлементКоллекции - строка таблицы вопросов раздела. // ЭлементГруппы - ГруппаФормы - группа формы, для которой будут подчиняться добавляемые реквизиты. -// Форма - Управляемая форма. +// Форма - ФормаКлиентскогоПриложения // -Процедура ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы,ЭлементГруппа,Форма) +Процедура ДобавитьЭлементыТабличныйВопрос(СтрокаТаблицы, ЭлементГруппа, Форма) ТипТабличногоВопроса = СтрокаТаблицы.ТипТабличногоВопроса; ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); @@ -1311,10 +1290,10 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения // -Процедура ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы,ЭлементГруппа,Форма) +Процедура ДобавитьЭлементыКомплексныйВопрос(СтрокаТаблицы, ЭлементГруппа, Форма) ИмяВопроса = АнкетированиеКлиентСервер.ПолучитьИмяВопроса(СтрокаТаблицы.КлючСтроки); - Для каждого СтрокаКомплексногоВопроса Из СтрокаТаблицы.СоставКомплексногоВопроса Цикл + Для каждого СтрокаКомплексногоВопроса Из СтрокаТаблицы.СоставКомплексногоВопроса Цикл // СтрокаТабличнойЧасти: см. СправочникТабличнаяЧасть.ВопросыШаблонаАнкеты.СоставКомплексногоВопроса НайденныеСтроки = Форма.ВопросыПредставлениеТипы.НайтиСтроки(Новый Структура("Вопрос",СтрокаКомплексногоВопроса.ЭлементарныйВопрос)); Если НайденныеСтроки.Количество() > 0 Тогда @@ -1526,14 +1505,14 @@ // // Параметры: // ЭлементарныйВопрос - ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования - вопрос для которого получаются ответы. -// Форма - Управляемая форма - форма из которой происходит вызов. +// Форма - ФормаКлиентскогоПриложения - форма, из которой происходит вызов. // // Возвращаемое значение: -// Массив - массив строк таблицы значений, в которых содержаться варианты ответов на вопрос. +// Массив - строки таблицы значений, в которых содержатся варианты ответов на вопрос. // -Функция ПолучитьВариантыОтветовНаВопрос(ЭлементарныйВопрос,Форма) Экспорт +Функция ПолучитьВариантыОтветовНаВопрос(ЭлементарныйВопрос, Форма) Экспорт - Возврат (Форма.ВариантыОтветовНаВопросы.НайтиСтроки(Новый Структура("Вопрос",ЭлементарныйВопрос))); + Возврат (Форма.ВариантыОтветовНаВопросы.НайтиСтроки(Новый Структура("Вопрос", ЭлементарныйВопрос))); КонецФункции @@ -1583,11 +1562,11 @@ // Удаляет ранее динамически сформированные элементы формы заполнения анкеты. // // Параметры: -// Форма - Управляемая форма - форма у которой удаляются элементы. -// УдаляемыеРеквизиты - массив - массив имен удаляемых реквизитов формы, на основании которого удаляются +// Форма - ФормаКлиентскогоПриложения - форма, у которой удаляются элементы. +// УдаляемыеРеквизиты - Массив из Строка - имена удаляемых реквизитов формы, на основании которых удаляются // элементы формы. // -Процедура УдалитьЭлементыФормыЗаполнения(Форма,УдаляемыеРеквизиты) +Процедура УдалитьЭлементыФормыЗаполнения(Форма, УдаляемыеРеквизиты) Для каждого УдаляемыйРеквизит Из УдаляемыеРеквизиты Цикл @@ -1610,10 +1589,10 @@ // Заполняет дерево разделов на форме. // // Параметры: -// Форма - Управляемая форма - форма для которой выполняется операция. +// Форма - ФормаКлиентскогоПриложения - форма, для которой выполняется операция. // ДеревоРазделов - ДанныеФормыДерево - дерево, для которого получаются данные. // -Процедура ЗаполнитьДеревоРазделов(Форма,ДеревоРазделов) Экспорт +Процедура ЗаполнитьДеревоРазделов(Форма, ДеревоРазделов) Экспорт ВыборкаРазделы = ПолучитьВыборкуРазделовПоШаблонуАнкеты(Форма.ШаблонАнкеты); ДобавитьСтрокиВДеревоРазделов(ВыборкаРазделы, ДеревоРазделов); @@ -2083,7 +2062,9 @@ // ШаблонАнкеты - СправочникСсылка.ШаблоныАнкет, по которому проводился опрос. // // ВозвращаемоеЗначение: -// Соответствие - в качестве ключа выступает ссылка на вопрос, в качестве значения его формулировка. +// Соответствие из КлючИЗначение: +// * Ключ - ссылка на вопрос +// * Значение - его формулировка // Функция ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса(ШаблонАнкеты) Экспорт diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl index 022946790..aa60a3072 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl @@ -11,10 +11,10 @@ // Получить структуру с описанием формы выполнения задачи. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // // Возвращаемое значение: -// Структура - структуру с описанием формы выполнения задачи. +// Структура // Функция ФормаВыполненияЗадачи(Знач ЗадачаСсылка) Экспорт @@ -41,8 +41,8 @@ КонецФункции -// Проверяет, находится ли в ячейке отчета ссылка на задачу и в параметре. -// ЗначениеРасшифровки возвращает значение расшифровки. +// Проверяет, находится ли в ячейке отчета ссылка на задачу и в параметре +// ЗначениеРасшифровки возвращает значение расшифровки. // // Параметры: // Расшифровка - Строка - имя ячейки. @@ -51,7 +51,7 @@ // - Произвольный - значение расшифровки из ячейки. // // Возвращаемое значение: -// Булево -если Истина, то это задача исполнителю. +// Булево - Истина, если это задача исполнителю. // Функция ЭтоЗадачаИсполнителю(Знач Расшифровка, Знач ДанныеРасшифровкиОтчета, ЗначениеРасшифровки) Экспорт @@ -62,12 +62,12 @@ КонецФункции // Выполнить задачу ЗадачаСсылка, при необходимости выполнив обработчик. -// ОбработкаВыполненияПоУмолчанию модуля менеджера бизнес-процесса, -// к которому относится задача ЗадачаСсылка. +// ОбработкаВыполненияПоУмолчанию модуля менеджера бизнес-процесса, +// к которому относится задача ЗадачаСсылка. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка - ссылка на задачу. -// ДействиеПоУмолчанию - Булево -признак необходимости вызова процедуры +// ЗадачаСсылка - ЗадачаСсылка +// ДействиеПоУмолчанию - Булево - признак необходимости вызова процедуры // ОбработкаВыполненияПоУмолчанию у бизнес-процесса задачи. // Процедура ВыполнитьЗадачу(ЗадачаСсылка, ДействиеПоУмолчанию = Ложь) Экспорт @@ -98,29 +98,27 @@ КонецПроцедуры -// Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре. -// ИнфоОПеренаправлении. +// Перенаправить задачи МассивЗадач новому исполнителю, указанному в структуре ИнфоОПеренаправлении. // // Параметры: -// МассивЗадач - Массив - массив задач для перенаправления. -// ИнфоОПеренаправлении - Структура - содержит новые значения реквизитов адресации задачи. -// ТолькоПроверка - Булево - если Истина, то функция не будет выполнять -// физического перенаправления задач, а только -// проверит возможность перенаправления. -// МассивПеренаправленныхЗадач - Массив - массив перенаправленных задач. -// Может отличаться по составу элементов от -// массива МассивЗадач, если какие-то задачи -// не удалось перенаправить. +// ПеренаправляемыеЗадачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя +// ИнфоОПеренаправлении - Структура - новые значения реквизитов адресации задачи. +// ТолькоПроверка - Булево - если Истина, то функция не будет выполнять +// физического перенаправления задач, а только +// проверит возможность перенаправления. +// ПеренаправленныеЗадачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя - перенаправленные задачи. +// Может отличаться по составу элементов от массива +// ПеренаправляемыеЗадачи, если не все задачи удалось перенаправить. // // Возвращаемое значение: // Булево - Истина, если перенаправление выполнено успешно. // -Функция ПеренаправитьЗадачи(Знач МассивЗадач, Знач ИнфоОПеренаправлении, Знач ТолькоПроверка = Ложь, - МассивПеренаправленныхЗадач = Неопределено) Экспорт +Функция ПеренаправитьЗадачи(Знач ПеренаправляемыеЗадачи, Знач ИнфоОПеренаправлении, Знач ТолькоПроверка = Ложь, + ПеренаправленныеЗадачи = Неопределено) Экспорт Результат = Истина; - СведенияОЗадачах = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивЗадач, "БизнесПроцесс,Выполнена"); + СведенияОЗадачах = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ПеренаправляемыеЗадачи, "БизнесПроцесс,Выполнена"); НачатьТранзакцию(); Попытка Для Каждого Задача Из СведенияОЗадачах Цикл @@ -152,8 +150,8 @@ Для Каждого Задача Из СведенияОЗадачах Цикл - Если НЕ ЗначениеЗаполнено(МассивПеренаправленныхЗадач) Тогда - МассивПеренаправленныхЗадач = Новый Массив(); + Если НЕ ЗначениеЗаполнено(ПеренаправленныеЗадачи) Тогда + ПеренаправленныеЗадачи = Новый Массив(); КонецЕсли; // Не устанавливаем объектную блокировку на задачу Задача для того, чтобы @@ -168,7 +166,7 @@ НоваяЗадача.Записать(); УстановитьПривилегированныйРежим(Ложь); - МассивПеренаправленныхЗадач.Добавить(НоваяЗадача.Ссылка); + ПеренаправленныеЗадачи.Добавить(НоваяЗадача.Ссылка); ЗадачаОбъект.РезультатВыполнения = ИнфоОПеренаправлении.Комментарий; ЗадачаОбъект.Выполнена = Ложь; @@ -211,7 +209,7 @@ // Отмечает указанные бизнес-процессы как активные. // // Параметры: -// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы. +// БизнесПроцессы - Массив из ОпределяемыйТип.БизнесПроцесс // Процедура СделатьАктивнымБизнесПроцессы(БизнесПроцессы) Экспорт @@ -234,7 +232,7 @@ // Отмечает указанный бизнес-процесс как активный. // // Параметры: -// БизнесПроцесс - БизнесПроцессСсылка - ссылка на бизнес-процесс. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс // Процедура СделатьАктивнымБизнесПроцесс(БизнесПроцесс) Экспорт @@ -274,7 +272,7 @@ // Отмечает указанные бизнес-процессы как остановленные. // // Параметры: -// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы. +// БизнесПроцессы - Массив из ОпределяемыйТип.БизнесПроцесс // Процедура ОстановитьБизнесПроцессы(БизнесПроцессы) Экспорт @@ -298,7 +296,7 @@ // Отмечает указанный бизнес-процесс как остановленный. // // Параметры: -// БизнесПроцесс - БизнесПроцессСсылка - ссылка на бизнес-процесс. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс // Процедура ОстановитьБизнесПроцесс(БизнесПроцесс) Экспорт @@ -338,7 +336,7 @@ // Отмечает указанные задачи как принятые к исполнению. // // Параметры: -// Задачи - Массив - массив ссылок на задачи. +// Задачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя // Процедура ПринятьЗадачиКИсполнению(Задачи) Экспорт @@ -383,7 +381,7 @@ // Отмечает указанные задачи как не принятые к исполнению. // // Параметры: -// Задачи - Массив - массив ссылок на задачи. +// Задачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя // Процедура ОтменитьПринятиеЗадачКИсполнению(Задачи) Экспорт @@ -428,7 +426,7 @@ // Проверяет, является ли указанная задача ведущей. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // // Возвращаемое значение: // Булево - если Истина, то задача является ведущей. @@ -442,7 +440,7 @@ КонецФункции // Формирует список подбора для указания исполнителя в полях -// ввода составного типа (Пользователь и Роль). +// ввода составного типа (Пользователь и Роль). // // Параметры: // Текст - Строка - фрагмент текста для поиска возможных исполнителей. @@ -496,6 +494,9 @@ // Возвращает число невыполненных задач по указанным бизнес-процессам. // +// Возвращаемое значение: +// Число +// Функция КоличествоНевыполненныхЗадачБизнесПроцессов(БизнесПроцессы) Экспорт КоличествоЗадач = 0; @@ -516,6 +517,9 @@ // Возвращает число невыполненных задач по указанному бизнес-процессу. // +// Возвращаемое значение: +// Число +// Функция КоличествоНевыполненныхЗадачБизнесПроцесса(БизнесПроцесс) Экспорт Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда @@ -542,7 +546,12 @@ // Помечает на удаление указанные бизнес-процессы. // +// Возвращаемое значение: +// БизнесПроцессСсылка +// Неопределено +// Функция ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки) Экспорт + Количество = 0; Для Каждого СтрокаТаблицы Из ВыделенныеСтроки Цикл БизнесПроцессСсылка = СтрокаТаблицы.Владелец; diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl index d5b823664..97f2735d2 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl @@ -11,11 +11,11 @@ //////////////////////////////////////////////////////////////////////////////// // Команды работы с бизнес-процессами. -// Отмечает указанный бизнес-процесс как остановленный. +// Отмечает указанные бизнес-процессы как остановленные. // // Параметры: -// ПараметрКоманды - Массив -// - БизнесПроцессСсылка - массив ссылок на бизнес процессы или ссылка на бизнес-процесс. +// ПараметрКоманды - Массив из ОпределяемыйТип.БизнесПроцесс +// - ОпределяемыйТип.БизнесПроцесс // Процедура Остановить(Знач ПараметрКоманды) Экспорт @@ -82,7 +82,7 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения // - РасширениеУправляемойФормыДляОбъектов - форма бизнес-процесса, где: -// * Объект - БизнесПроцессОбъект - бизнес-процесс. +// * Объект - ОпределяемыйТип.БизнесПроцессОбъект - бизнес-процесс. // Процедура ОстановитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт Форма.Объект.Состояние = ПредопределенноеЗначение("Перечисление.СостоянияБизнесПроцессов.Остановлен"); @@ -97,12 +97,12 @@ КонецПроцедуры -// Отмечает указанный бизнес-процесс как активный. +// Отмечает указанные бизнес-процессы как активные. // // Параметры: -// ПараметрКоманды - Массив +// ПараметрКоманды - Массив из ОпределяемыйТип.БизнесПроцесс // - СтрокаГруппировкиДинамическогоСписка -// - БизнесПроцессСсылка - бизнес процесс. +// - ОпределяемыйТип.БизнесПроцесс - бизнес процесс. // Процедура СделатьАктивным(Знач ПараметрКоманды) Экспорт @@ -152,12 +152,12 @@ КонецПроцедуры // Отмечает указанный бизнес-процесс как активный. -// Предназначена для вызова из формы бизнес-процесса. +// Предназначена для вызова из формы бизнес-процесса. // // Параметры: // Форма - ФормаКлиентскогоПриложения // - РасширениеУправляемойФормыДляОбъектов - форма бизнес-процесса, где: -// * Объект - БизнесПроцессОбъект - бизнес-процесс. +// * Объект - ОпределяемыйТип.БизнесПроцессОбъект - бизнес-процесс. // Процедура ПродолжитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт @@ -176,7 +176,7 @@ // Отмечает указанные задачи как принятые к исполнению. // // Параметры: -// МассивЗадач - Массив - массив ссылок на задачи. +// МассивЗадач - Массив из ЗадачаСсылка.ЗадачаИсполнителя // Процедура ПринятьЗадачиКИсполнению(Знач МассивЗадач) Экспорт @@ -230,7 +230,7 @@ // Отмечает указанные задачи как не принятые к исполнению. // // Параметры: -// МассивЗадач - Массив - массив ссылок на задачи. +// МассивЗадач - Массив из ЗадачаСсылка.ЗадачаИсполнителя // Процедура ОтменитьПринятиеЗадачКИсполнению(Знач МассивЗадач) Экспорт @@ -306,9 +306,8 @@ // Открывает форму для настройки отложенного старта бизнес процесса. // // Параметры: -// БизнесПроцесс - - БизнесПроцессСсылка - процесс, для которого следует открыть форму настройки -// отложенного старта. -// СрокИсполнения - Дата - дата, указывающая на срок исполнения. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс +// СрокИсполнения - Дата // Процедура НастроитьОтложенныйСтарт(БизнесПроцесс, СрокИсполнения) Экспорт @@ -444,29 +443,29 @@ // Открыть форму для перенаправления одной или нескольких задач другому исполнителю. // // Параметры: -// МассивЗадач - Массив - список задач, которые необходимо перенаправить. +// ПеренаправляемыеЗадачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя // ВладелецФорма - ФормаКлиентскогоПриложения - форма, которая должна быть владельцем для открываемой -// формы перенаправления задач. +// формы перенаправления задач. // -Процедура ПеренаправитьЗадачи(МассивЗадач, ВладелецФорма) Экспорт +Процедура ПеренаправитьЗадачи(ПеренаправляемыеЗадачи, ВладелецФорма) Экспорт - Если МассивЗадач = Неопределено Тогда + Если ПеренаправляемыеЗадачи = Неопределено Тогда ПоказатьПредупреждение(,НСтр("ru = 'Не выбраны задачи.'")); Возврат; КонецЕсли; ЗадачиМогутБытьПеренаправлены = БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи( - МассивЗадач, Неопределено, Истина); - Если НЕ ЗадачиМогутБытьПеренаправлены И МассивЗадач.Количество() = 1 Тогда + ПеренаправляемыеЗадачи, Неопределено, Истина); + Если НЕ ЗадачиМогутБытьПеренаправлены И ПеренаправляемыеЗадачи.Количество() = 1 Тогда ПоказатьПредупреждение(,НСтр("ru = 'Невозможно перенаправить уже выполненную задачу или направленную другому исполнителю.'")); Возврат; КонецЕсли; - Оповещение = Новый ОписаниеОповещения("ПеренаправитьЗадачиЗавершение", ЭтотОбъект, МассивЗадач); + Оповещение = Новый ОписаниеОповещения("ПеренаправитьЗадачиЗавершение", ЭтотОбъект, ПеренаправляемыеЗадачи); ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ПеренаправитьЗадачи", Новый Структура("Задача,КоличествоЗадач,ЗаголовокФормы", - МассивЗадач[0], МассивЗадач.Количество(), - ?(МассивЗадач.Количество() > 1, НСтр("ru = 'Перенаправить задачи'"), + ПеренаправляемыеЗадачи[0], ПеренаправляемыеЗадачи.Количество(), + ?(ПеренаправляемыеЗадачи.Количество() > 1, НСтр("ru = 'Перенаправить задачи'"), НСтр("ru = 'Перенаправить задачу'"))), ВладелецФорма,,,,Оповещение); @@ -475,11 +474,8 @@ // Открыть форму с дополнительной информацией о задаче. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка - ссылка на задачу. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // -// Возвращаемое значение: -// ФормаКлиентскогоПриложения - форма дополнительной задачи исполнителя. -// Процедура ОткрытьДопИнформациюОЗадаче(Знач ЗадачаСсылка) Экспорт ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.Дополнительно", @@ -546,13 +542,13 @@ // Открывает форму выбора исполнителя. // // Параметры: -// ЭлементИсполнитель - элемент формы, в которой выполняется выбора исполнителя, +// ЭлементИсполнитель - ПолеФормы - элемент формы, в которой выполняется выбора исполнителя, // который будет указан как владелец формы выбора исполнителя. -// РеквизитИсполнитель - выбранное ранее значение исполнителя. +// РеквизитИсполнитель - СправочникСсылка.Пользователи - выбранное ранее значение исполнителя. // Используется для установки текущей строки в форме выбора исполнителя. // ТолькоПростыеРоли - Булево - если Истина, то указывает что для выбора нужно // использовать только роли без объектов адресации. -// БезВнешнихРолей - Булево - если Истина, то указывает, что для выбора надо +// БезВнешнихРолей - Булево - если Истина, то указывает, что для выбора надо // использовать только роли, у которых не установлен признак ВнешняяРоль. // Процедура ВыбратьИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли = Ложь, БезВнешнихРолей = Ложь) Экспорт diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl index a0c663162..874630780 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl @@ -9,16 +9,16 @@ #Область ПрограммныйИнтерфейс // Вызывается при открытии формы выбор исполнителя. -// Позволяет переопределить стандартную форму выбора. +// Позволяет переопределить стандартную форму выбора. // // Параметры: // ЭлементИсполнитель - ЭлементФормы - элемент формы, в которой выбирается исполнитель. // РеквизитИсполнитель - СправочникСсылка.Пользователи - выбранный ранее исполнитель. // Используется для установки текущей строки в форме выбора исполнителя. // ТолькоПростыеРоли - Булево - если Истина, то указывает что для выбора нужно -// использовать только роли без объектов адресации. +// использовать только роли без объектов адресации. // БезВнешнихРолей - Булево - если Истина, то указывает, что для выбора надо использовать только роли, -// у которых не установлен признак ВнешняяРоль. +// у которых не установлен признак ВнешняяРоль. // СтандартнаяОбработка - Булево - если Ложь, то не требуется выводить стандартную форму выбора исполнителя. // Процедура ПриВыбореИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли, diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl index 896713848..2c716efe4 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентСервер/Module.bsl @@ -50,7 +50,7 @@ Представление = НСтр("ru = 'Бизнес-процесс'"); #КонецЕсли - ПолученияПредставленияБизнесПроцесса(МенеджерОбъекта, Данные, Дата, Представление, СтандартнаяОбработка); + ПредставлениеБизнесПроцесса(МенеджерОбъекта, Данные, Дата, Представление, СтандартнаяОбработка); КонецПроцедуры @@ -71,7 +71,7 @@ // СтандартнаяОбработка - Булево - если установить Ложь, то стандартная обработка заполнения не будет // выполнена. // -Процедура ПолученияПредставленияБизнесПроцесса(МенеджерОбъекта, Данные, Дата, Представление, СтандартнаяОбработка) +Процедура ПредставлениеБизнесПроцесса(МенеджерОбъекта, Данные, Дата, Представление, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ШаблонПредставления = НСтр("ru = '%1 от %2 (%3)'"); diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl index 1988278be..c620daa5b 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиПереопределяемый/Module.bsl @@ -21,9 +21,9 @@ // у текущего пользователя. // // Параметры: -// БизнесПроцесс - БизнесПроцессСсылка - ссылка на бизнес-процесс. -// ЕстьПрава - Булево - если установить Ложь, то прав нет. -// СтандартнаяОбработка - Булево - если установить Ложь, то стандартная проверка прав не будет выполнена. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцессОбъект +// ЕстьПрава - Булево - если установить Ложь, то прав нет. +// СтандартнаяОбработка - Булево - если установить Ложь, то стандартная проверка прав не будет выполнена. // Процедура ПриПроверкеПравНаОстановкуБизнесПроцесса(БизнесПроцесс, ЕстьПрава, СтандартнаяОбработка) Экспорт @@ -32,7 +32,7 @@ // Вызывается для заполнения реквизита ГлавнаяЗадача из данных заполнения. // // Параметры: -// БизнесПроцессОбъект - БизнесПроцессОбъект - бизнес-процесс. +// БизнесПроцессОбъект - ОпределяемыйТип.БизнесПроцессОбъект // ДанныеЗаполнения - Произвольный - данные заполнения, которые передаются в обработчик заполнения. // СтандартнаяОбработка - Булево - если установить Ложь, то стандартная обработка заполнения не будет // выполнена. @@ -45,9 +45,9 @@ // // Параметры: // ИмяБизнесПроцесса - Строка - название бизнес-процесса. -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // ТочкаМаршрутаБизнесПроцесса - ТочкаМаршрутаБизнесПроцессаСсылка.Задание - действие. -// ПараметрыФормы - Структура - описание выполнения задачи со свойствами: +// ПараметрыФормы - Структура: // * ИмяФормы - имя формы, передаваемое в метод ОткрытьФорму. // * ПараметрыФормы - содержит параметры открываемой формы. // @@ -69,9 +69,9 @@ // - ОбработкаВыполненияПоУмолчанию. // // Параметры: -// ПодключенныеБизнесПроцессы - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Бизнес-процессы и задачи". -// В качестве значения - пустую строку. +// ПодключенныеБизнесПроцессы - Соответствие из КлючИЗначение: +// * Ключ - Строка - полное имя объекта метаданных, подключенного к подсистеме; +// * Значение - Строка - пустая строка. // // Пример: // ПодключенныеБизнесПроцессы.Вставить(Метаданные.БизнесПроцессы.ЗаданиеСРолевойАдресацией.ПолноеИмя(), ""); @@ -102,7 +102,7 @@ // ролей исполнителей в прикладном решении. // // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. +// КодыЯзыков - Массив из Строка - список языков конфигурации. Актуально для мультиязычных конфигураций. // Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов // справочника РолиИсполнителей. // ТабличныеЧасти - Структура - описание табличных частей объекта, где: @@ -138,7 +138,7 @@ // Стандартный реквизит ТипЗначения следует заполнять в процедуре ПриНачальномЗаполненииЭлементаОбъектаАдресацииЗадачи. // // Параметры: -// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. +// КодыЯзыков - Массив из Строка - список языков конфигурации. Актуально для мультиязычных конфигураций. // Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов объекта ПВХ ОбъектыАдресацииЗада. // ТабличныеЧасти - Структура - описание табличных частей объекта, где: // * Ключ - Строка - имя табличной части; diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl index 1cb3d1cf7..e1a853d95 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -77,8 +77,7 @@ // // Параметры: // СписокЗадачИлиЕгоУсловноеОформление - ДинамическийСписок -// - УсловноеОформлениеКомпоновкиДанных - условное -// оформление списка задач. +// - УсловноеОформлениеКомпоновкиДанных - условное оформление списка задач. // Процедура УстановитьОформлениеЗадач(Знач СписокЗадачИлиЕгоУсловноеОформление) Экспорт @@ -237,8 +236,8 @@ // либо указанного в параметрах РольИсполнителя, ОсновнойОбъектАдресации и ДополнительныйОбъектАдресации. // // Параметры: -// Исполнитель - ПользовательСсылка - исполнитель задачи. -// РольИсполнителя - Справочники.РолиИсполнителей - роль. +// Исполнитель - СправочникСсылка.Пользователи - исполнитель задачи. +// РольИсполнителя - СправочникСсылка.РолиИсполнителей - роль. // ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. // ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. // @@ -265,7 +264,7 @@ // Возвращает строковое представление роли РольИсполнителя и ее объектов адресации, если они заданы. // // Параметры: -// РольИсполнителя - Справочники.РолиИсполнителей - роль. +// РольИсполнителя - СправочникСсылка.РолиИсполнителей - роль. // ОсновнойОбъектАдресации - ЛюбаяСсылка - ссылка на основной объект адресации. // ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. // @@ -297,7 +296,7 @@ // Помечает на удаление все задачи указанного бизнес-процесса (или снимает отметку). // // Параметры: -// БизнесПроцессСсылка - БизнесПроцессСсылка - бизнес-процесс, задачи которого нужно пометить на удаление. +// БизнесПроцессСсылка - ОпределяемыйТип.БизнесПроцесс - бизнес-процесс, задачи которого нужно пометить на удаление. // ПометкаУдаления - Булево - значение свойства ПометкаУдаления для задач. // Процедура УстановитьПометкуУдаленияЗадач(БизнесПроцессСсылка, ПометкаУдаления) Экспорт @@ -334,7 +333,7 @@ КонецПроцедуры // Установить формат отображения и редактирования поля формы типа Дата -// в зависимости от настроек подсистемы. +// в зависимости от настроек подсистемы. // // Параметры: // ПолеДаты - ПолеФормы - элемент управления формы, поле со значением типа Дата. @@ -359,7 +358,7 @@ // ДляИзменения - Булево - если Истина, то следует установить исключительную управляемую блокировку // на все бизнес-процессы указанной ведущей задачи. По умолчанию, Ложь. // Возвращаемое значение: -// Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>). +// Массив из ОпределяемыйТип.БизнесПроцесс // Функция БизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт @@ -369,13 +368,13 @@ КонецФункции // Возвращает дату завершения указанного бизнес-процесса, -// полученную как максимальная дата исполнения задач бизнес-процесса. +// полученную как максимальная дата исполнения задач бизнес-процесса. // // Параметры: -// БизнесПроцессСсылка - БизнесПроцессСсылка - ссылка на бизнес- процесс. +// БизнесПроцессСсылка - ОпределяемыйТип.БизнесПроцесс // // Возвращаемое значение: -// Дата - дата завершения указанного бизнес-процесса. +// Дата // Функция ДатаЗавершенияБизнесПроцесса(БизнесПроцессСсылка) Экспорт @@ -406,12 +405,12 @@ // Возвращает массив подчиненных указанной задаче бизнес-процессов. // // Параметры: -// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя // ДляИзменения - Булево - если Истина, то следует установить исключительную управляемую блокировку // на все бизнес-процессы, подчиненные указанной задаче. По умолчанию, Ложь. // // Возвращаемое значение: -// Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>). +// Массив из ОпределяемыйТип.БизнесПроцесс // Функция БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт @@ -441,14 +440,18 @@ Продолжить; КонецЕсли; - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | %1.Ссылка КАК Ссылка + ТекстЗапроса = " + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Таблица.Ссылка КАК Ссылка |ИЗ - | %2 КАК %1 + | #Таблица КАК Таблица |ГДЕ - | %1.ГлавнаяЗадача = &ГлавнаяЗадача", - МетаданныеБизнесПроцесса.Имя, МетаданныеБизнесПроцесса.ПолноеИмя()); + | Таблица.ГлавнаяЗадача = &ГлавнаяЗадача"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, + "#Таблица", + МетаданныеБизнесПроцесса.ПолноеИмя()); + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ГлавнаяЗадача", ЗадачаСсылка); @@ -467,7 +470,7 @@ // Проверяет у текущего пользователя наличие прав на изменение состояния бизнес-процесса. // // Параметры: -// БизнесПроцессОбъект - БизнесПроцессОбъект - объект бизнес-процесса. +// БизнесПроцессОбъект - ОпределяемыйТип.БизнесПроцессОбъект // Процедура ПроверитьПраваНаИзменениеСостоянияБизнесПроцесса(БизнесПроцессОбъект) Экспорт @@ -521,8 +524,8 @@ // Строки группировки динамического списка игнорируются. // // Параметры: -// БизнесПроцессы - Массив - ссылки на бизнес-процессы (БизнесПроцессСсылка.<Имя бизнес-процесса>), -// или одна ссылка на бизнес-процесс. +// БизнесПроцессы - ОпределяемыйТип.БизнесПроцесс +// - Массив из ОпределяемыйТип.БизнесПроцесс // Процедура ЗаблокироватьБизнесПроцессы(БизнесПроцессы) Экспорт @@ -553,8 +556,8 @@ // Строки группировки динамического списка игнорируются. // // Параметры: -// Задачи - Массив -// - ЗадачаСсылка.ЗадачаИсполнителя - ссылки на задачи, или одна ссылка. +// Задачи - Массив из ЗадачаСсылка.ЗадачаИсполнителя +// - ЗадачаСсылка.ЗадачаИсполнителя // Процедура ЗаблокироватьЗадачи(Задачи) Экспорт @@ -584,7 +587,7 @@ // См. также БизнесПроцессыИЗадачиПереопределяемый.ПриЗаполненииГлавнойЗадачиБизнесПроцесса. // // Параметры: -// БизнесПроцессОбъект - БизнесПроцессОбъект - бизнес-процесс, который требуется заполнить. +// БизнесПроцессОбъект - ОпределяемыйТип.БизнесПроцессОбъект // ДанныеЗаполнения - ЗадачаСсылка // - Произвольный - данные заполнения, которые передаются в обработчик заполнения. // @@ -615,7 +618,7 @@ // ДополнительныйОбъектАдресации - ЛюбаяСсылка - ссылка на дополнительный объект адресации. // // Возвращаемое значение: -// СправочникСсылка.ГруппыИсполнителейЗадач - найденная по роли группа исполнителей задач. +// СправочникСсылка.ГруппыИсполнителейЗадач // Функция ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Экспорт @@ -667,7 +670,7 @@ // Добавляет процесс в очередь для отложенного старта. // // Параметры: -// Процесс - БизнесПроцессСсылка - бизнес процесс для отложенного старта. +// Процесс - ОпределяемыйТип.БизнесПроцесс // ДатаСтарта - Дата - дата отложенного старта. // Процедура ДобавитьПроцессДляОтложенногоСтарта(Процесс, ДатаСтарта) Экспорт @@ -691,7 +694,7 @@ // Отключает отложенный старт процесса. // // Параметры: -// Процесс - БизнесПроцессСсылка -бизнес-процесс, у которого требуется отключить отложенный старт. +// Процесс - ОпределяемыйТип.БизнесПроцесс // Процедура ОтключитьОтложенныйСтартПроцесса(Процесс) Экспорт @@ -712,7 +715,7 @@ // Стартует отложенный бизнес-процесс, устанавливая признак старта. // // Параметры: -// - БизнесПроцесс - БизнесПроцессОбъект - процесс, который следует запустить отложенно. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцессОбъект // Процедура СтартоватьОтложенныйПроцесс(БизнесПроцесс) Экспорт @@ -734,17 +737,13 @@ Исключение ОтменитьТранзакцию(); - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстОшибки = НСтр("ru = 'Во время отложенного старта этого процесса произошла ошибка: |%1 |Попробуйте запустить процесс вручную, а не отложенно.'"); - Описание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ТекстОшибки, ОписаниеОшибки); - РегистрыСведений.ПроцессыДляЗапуска.ЗарегистрироватьОтменуСтарта(БизнесПроцесс, Описание); КонецПопытки; @@ -754,12 +753,12 @@ // Возвращает сведения о запуске для процесса. // // Параметры: -// Процесс - БизнесПроцессСсылка -бизнес процесс у которого требуется получить сведения о запуске. +// Процесс - ОпределяемыйТип.БизнесПроцесс // // Возвращаемое значение: -// - Неопределено - возвращается, если сведений нет. +// - Неопределено - если сведений нет. // - Структура: -// * БизнесПроцесс - БизнесПроцессСсылка. +// * БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс. // * ДатаОтложенногоСтарта - ДатаИВремя. // * Состояние - ПеречислениеСсылка.СостоянияПроцессовДляЗапуска. // * ПричинаОтменыСтарта - Строка - причина отмены старта. @@ -802,10 +801,10 @@ // ожидает отложенного старта. В противном случае возвращает пустую дату. // // Параметры: -// БизнесПроцесс - БизнесПроцессСсылка -бизнес процесс для которого требуется получить дату отложенного старта. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцесс // // Возвращаемое значение: -// Дата - дата отложенного старта. +// Дата // Функция ДатаОтложенногоСтартаПроцесса(БизнесПроцесс) Экспорт @@ -913,7 +912,7 @@ // // Параметры: // Параметры - Структура - структура параметров отложенного обработчика обновления. -// БизнесПроцесс - ОбъектМетаданных.БизнесПроцесс - метаданные бизнес-процесса, наборы значений доступа +// БизнесПроцесс - ОбъектМетаданныхБизнесПроцесс - метаданные бизнес-процесса, наборы значений доступа // которого требуется обновить. // ИмяПроцедуры - Строка - имя процедуры отложенного обработчика обновления для журнала регистрации. // РазмерПорции - Число - количество объектов, обрабатываемых за один вызов. @@ -927,9 +926,9 @@ | КОЛИЧЕСТВО(ТаблицаСНаборамиЗначенийДоступа.Ссылка) КАК Количество, | МАКСИМУМ(ТаблицаСНаборамиЗначенийДоступа.Дата) КАК Дата |ИЗ - | %1 КАК ТаблицаСНаборамиЗначенийДоступа"; + | #Таблица КАК ТаблицаСНаборамиЗначенийДоступа"; - Запрос.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Запрос.Текст, БизнесПроцесс.ПолноеИмя()); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Таблица", БизнесПроцесс.ПолноеИмя()); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); Параметры.ПрогрессВыполнения.ВсегоОбъектов = РезультатЗапроса[0].Количество; @@ -949,18 +948,19 @@ Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ %1 + "ВЫБРАТЬ ПЕРВЫЕ 1 | ТаблицаСНаборамиЗначенийДоступа.Ссылка КАК Ссылка, | ТаблицаСНаборамиЗначенийДоступа.Дата КАК Дата |ИЗ - | %2 КАК ТаблицаСНаборамиЗначенийДоступа + | #Таблица КАК ТаблицаСНаборамиЗначенийДоступа |ГДЕ ТаблицаСНаборамиЗначенийДоступа.Дата <= &НачальнаяДатаКОбработке | И ТаблицаСНаборамиЗначенийДоступа.Ссылка > &НачальнаяСсылкаКОбработке |УПОРЯДОЧИТЬ ПО | Дата УБЫВ, | Ссылка"; - Запрос.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Запрос.Текст, Формат(РазмерПорции, "ЧГ=0"), БизнесПроцесс.ПолноеИмя()); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ВЫБРАТЬ ПЕРВЫЕ 1", "ВЫБРАТЬ ПЕРВЫЕ " + Формат(РазмерПорции, "ЧГ=0")); //@Query-part-1, @Query-part-2 + Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Таблица", БизнесПроцесс.ПолноеИмя()); Запрос.УстановитьПараметр("НачальнаяДатаКОбработке", Параметры.НачальнаяДатаКОбработке); Запрос.УстановитьПараметр("НачальнаяСсылкаКОбработке", Параметры.НачальнаяСсылкаКОбработке); @@ -997,7 +997,7 @@ // Для вызова из отложенных обработчиков обновления при изменении логики формирования наборов значений доступа. // // Параметры: -// Параметры - Структура - структура параметров отложенного обработчика обновления. +// Параметры - Структура - параметры отложенного обработчика обновления. // Процедура ЗавершитьОбновлениеПорцииНаборовЗначенийДоступа(Параметры) Экспорт @@ -1030,10 +1030,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1123,9 +1119,7 @@ Объекты.Вставить(Метаданные.Справочники.РолиИсполнителей.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// Параметры: -// Настройки - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки -// +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт Настройка = Настройки.Добавить(); Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.МониторингЗадач; @@ -1144,9 +1138,7 @@ КонецПроцедуры -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ИсполнителиЗадач.ПолноеИмя()); @@ -1154,9 +1146,8 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов +// Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("МониторингЗадач"); @@ -1175,9 +1166,7 @@ КонецПроцедуры -// Параметры: -// ЗависимостиПрав - см. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа.ЗависимостиПрав -// +// См. УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа. Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт // Задача исполнителя может быть изменена, когда бизнес-процесс доступен только для чтения, @@ -1238,10 +1227,8 @@ МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ПросроченныеЗадачи); КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1319,10 +1306,10 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек -// +// // Параметры: -// Объекты - Массив -// +// Объекты - Массив из ОбъектМетаданных +// Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.РолиИсполнителей); @@ -1330,9 +1317,7 @@ КонецПроцедуры -// Параметры: -// Объекты - см. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.Объекты -// +// См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.БизнесПроцессы.Задание); @@ -1822,9 +1807,6 @@ //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. -// Выбрать список ролей, которые могут быть назначены в ОсновнойОбъектАдресации, -// и посчитать список назначений. -// Функция ВыбратьРолиСКоличествомИсполнителей(ОсновнойОбъектАдресации) Экспорт Если ОсновнойОбъектАдресации <> Неопределено Тогда ТекстЗапроса = @@ -1891,7 +1873,7 @@ // Есть ли хотя бы один исполнитель, назначенный на указанную роль. // -// Результат: +// Возвращаемое значение: // Булево // Функция ЕстьИсполнителиРоли(РольСсылка, ОсновнойОбъектАдресации = Неопределено, @@ -1931,8 +1913,6 @@ КонецФункции -// Выбрать одного любого исполнителя, назначенного на РольИсполнителя в ОсновнойОбъектАдресации. -// Функция ВыбратьИсполнителя(ОсновнойОбъектАдресации, РольИсполнителя) Экспорт Запрос = Новый Запрос( @@ -1952,7 +1932,6 @@ Функция ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт - Итерация = 1; ТекстЗапроса = ""; Для Каждого МетаданныеБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл @@ -1970,28 +1949,28 @@ |"; КонецЕсли; - ФрагментЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - "ВЫБРАТЬ %3 - | %1.Ссылка КАК Ссылка + + ФрагментЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Таблица.Ссылка КАК Ссылка |ИЗ - | %2 КАК %1 + | &ИмяТаблицы КАК Таблица |ГДЕ - | %1.ВедущаяЗадача = &ВедущаяЗадача", - МетаданныеБизнесПроцесса.Имя, МетаданныеБизнесПроцесса.ПолноеИмя(), - ?(Итерация = 1, "РАЗРЕШЕННЫЕ", "")); + | Таблица.ВедущаяЗадача = &ВедущаяЗадача"; + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "ВЫБРАТЬ РАЗРЕШЕННЫЕ", "ВЫБРАТЬ"); //@Query-part-1, @Query-part-2 + КонецЕсли; + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&ИмяТаблицы", МетаданныеБизнесПроцесса.ПолноеИмя()); + ТекстЗапроса = ТекстЗапроса + ФрагментЗапроса; - Итерация = Итерация + 1; - КонецЦикла; + КонецЦикла; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ВедущаяЗадача", ЗадачаСсылка); Результат = Запрос.Выполнить(); Возврат Результат; - -КонецФункции + +КонецФункции -// Вид события журнала регистрации для событий данной подсистемы. -// Функция СобытиеЖурналаРегистрации() Экспорт Возврат НСтр("ru = 'Бизнес-процессы и задачи'", ОбщегоНазначения.КодОсновногоЯзыка()); КонецФункции @@ -2001,8 +1980,8 @@ // бизнес-процесса. // // Параметры: -// БизнесПроцессОбъект - БизнесПроцессОбъект -// СтароеСостояние - ПеречислениеСсылка.СостоянияБизнесПроцессов +// БизнесПроцессОбъект - ОпределяемыйТип.БизнесПроцессОбъект +// СтароеСостояние - ПеречислениеСсылка.СостоянияБизнесПроцессов // Процедура ПриИзмененииСостоянияБизнесПроцесса(БизнесПроцессОбъект, СтароеСостояние) Экспорт @@ -2129,7 +2108,7 @@ // регистра сведений ИсполнителиЗадач. // // Возвращаемое значение: -// Массив - с элементами типа СправочникСсылка.ГруппыИсполнителейЗадач. +// Массив из СправочникСсылка.ГруппыИсполнителейЗадач. // Функция ГруппыИсполнителейЗадач(НовыеИсполнителиЗадач) Экспорт @@ -2234,10 +2213,10 @@ // как остановленный или активный. // // Параметры: -// БизнесПроцесс - бизнес-процесс ссылка. +// БизнесПроцесс - ОпределяемыйТип.БизнесПроцессОбъект // -// ВозвращаемоеЗначение -// Если права есть - Истина, иначе Ложь. +// Возвращаемое значение: +// Булево - Истина, если права есть. // Функция ЕстьПраваНаОстановкуБизнесПроцесса(БизнесПроцесс) @@ -2261,7 +2240,7 @@ КонецФункции // Параметры: -// Список - ДинамическийСписок +// Список - ДинамическийСписок // Процедура УстановитьПараметрыСпискаМоихЗадач(Список) Экспорт diff --git a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl index d22e37184..318cb7828 100644 --- a/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl +++ b/SSL/src/CommonModules/БлокировкаРаботыСВнешнимиРесурсами/Module.bsl @@ -356,85 +356,40 @@ Процедура ОтключитьРегламентноеЗадание(ПараметрыБлокировки, РегламентноеЗадание) - Если ОбщегоНазначения.РазделениеВключено() Тогда - - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - ОбластьДанных = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - ИмяМетода = РегламентноеЗадание.ИмяМетода; - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ОбластьДанных", ОбластьДанных); - ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода); - ПараметрыЗадания.Вставить("Использование", Истина); - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); - - ПараметрыЗадания = Новый Структура("Использование", Ложь); - Для Каждого Задание Из СписокЗаданий Цикл - МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания); - ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.Идентификатор); - КонецЦикла; - КонецЕсли; - - Иначе - - Отбор = Новый Структура; - Отбор.Вставить("Метаданные", РегламентноеЗадание); - Отбор.Вставить("Использование", Истина); - МассивЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор); // Массив из РегламентноеЗадание - - Для Каждого Задание Из МассивЗаданий Цикл - - Задание.Использование = Ложь; - Задание.Записать(); - - ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.УникальныйИдентификатор); - - КонецЦикла; - - КонецЕсли; + Отбор = Новый Структура; + Отбор.Вставить("Метаданные", РегламентноеЗадание); + Отбор.Вставить("Использование", Истина); + + НайденныеЗадания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор); + + Для Каждого Задание Из НайденныеЗадания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Новый Структура("Использование", Ложь)); + ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.УникальныйИдентификатор); + КонецЦикла; КонецПроцедуры Процедура ВключитьОтключенныеРегламентныеЗадания(ПараметрыБлокировки) + РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); + Для Каждого ИдентификаторЗадания Из ПараметрыБлокировки.ОтключенныеЗадания Цикл - Если ОбщегоНазначения.РазделениеВключено() Тогда - Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ОчередьЗаданий") Тогда - Если ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор") Тогда - Продолжить; - КонецЕсли; - МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - - ПараметрыЗадания = Новый Структура; - ПараметрыЗадания.Вставить("ОбластьДанных", МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); - ПараметрыЗадания.Вставить("Идентификатор", ИдентификаторЗадания); - ПараметрыЗадания.Вставить("Использование", Ложь); - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); - - ПараметрыЗадания = Новый Структура("Использование", Истина); - Для Каждого Задание Из СписокЗаданий Цикл - МодульОчередьЗаданий.ИзменитьЗадание(Задание.Идентификатор, ПараметрыЗадания); - КонецЦикла; - КонецЕсли; - Иначе - Если ТипЗнч(ИдентификаторЗадания) <> Тип("УникальныйИдентификатор") Тогда - Продолжить; - КонецЕсли; - - Отбор = Новый Структура("УникальныйИдентификатор"); - Отбор.УникальныйИдентификатор = ИдентификаторЗадания; - НайденныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор); - - Для Каждого ОтключенноеЗадание Из НайденныеЗадания Цикл - ОтключенноеЗадание.Использование = Истина; - ОтключенноеЗадание.Записать(); - КонецЦикла; + Если РазделениеВключено = (ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор")) Тогда + Продолжить; КонецЕсли; + Отбор = Новый Структура; + Отбор.Вставить("УникальныйИдентификатор", ИдентификаторЗадания); + Отбор.Вставить("Использование", Ложь); + + НайденныеЗадания = РегламентныеЗаданияСервер.НайтиЗадания(Отбор); + + Для Каждого Задание Из НайденныеЗадания Цикл + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание, Новый Структура("Использование", Истина)); + ПараметрыБлокировки.ОтключенныеЗадания.Добавить(Задание.УникальныйИдентификатор); + КонецЦикла; + КонецЦикла; КонецПроцедуры diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl index 0b860d4e3..f2f18f925 100644 --- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -149,7 +149,7 @@ // Для вызова из процедуры ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: -// Настройки - см. ВариантыОтчетов.КоллекцияПредопределенныхВариантовОтчетов +// Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. // ОтчетМетаданные - ОбъектМетаданных - метаданные отчета, в модуле менеджера которого расположена // экспортная процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета). // @@ -172,7 +172,7 @@ // в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: -// Настройки - см. КоллекцияПредопределенныхВариантовОтчетов +// Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. // Отчет - ОбъектМетаданныхОтчет // - СправочникСсылка.ИдентификаторыОбъектовМетаданных - метаданные или ссылка отчета. // @@ -180,12 +180,12 @@ // СтрокаДереваЗначений - настройки отчета и настройки "по умолчанию" для вариантов этого отчета, где: // * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме. // * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// * Размещение - Соответствие - настройки размещения варианта отчета в разделах, где: +// * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где: // ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. // ** Значение - Строка - настройки размещения в подсистеме (группе), с вариантами значений: -// *** "" - вывод отчета в подсистеме без специального выделение. -// *** "Важный" - вывод отчета в подсистеме с выделением жирным шрифтом. -// *** "СмТакже" - вывод отчета в группе "См. также". +// "" - вывод отчета в подсистеме без специального выделение. +// "Важный" - вывод отчета в подсистеме с выделением жирным шрифтом. +// "СмТакже" - вывод отчета в группе "См. также". // * ФункциональныеОпции - Массив из Строка - имена функциональных опций варианта отчета. // * НастройкиДляПоиска - Структура - дополнительные настройки для поиска этого варианта отчета, где: // ** НаименованияПолей - Строка - имена полей варианта отчета. @@ -247,7 +247,7 @@ // Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов. // // Параметры: -// Настройки - см. ВариантыОтчетов.КоллекцияПредопределенныхВариантовОтчетов +// Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. // Отчет - СтрокаДерева // - ОбъектМетаданных - описание настроек, метаданные или ссылка отчета. // КлючВарианта - Строка - имя варианта отчета как оно задано в схеме компоновки данных. @@ -258,12 +258,12 @@ // * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. // * Наименование - Строка - наименование варианта отчета. // * Описание - Строка - подсказка к варианту отчета. -// * Размещение - Соответствие - настройки размещения варианта отчета в разделах, где: +// * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах, где: // ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. // ** Значение - Строка - настройки размещения в подсистеме (группе), с вариантами значений: -// *** "" - вывод варианта в подсистеме без специального выделение. -// *** "Важный" - вывод варианта в подсистеме с выделением жирным шрифтом. -// *** "СмТакже" - вывод варианта в группе "См. также". +// "" - вывод варианта в подсистеме без специального выделение. +// "Важный" - вывод варианта в подсистеме с выделением жирным шрифтом. +// "СмТакже" - вывод варианта в группе "См. также". // * ФункциональныеОпции - Массив из Строка - имена функциональных опций варианта отчета. // * НастройкиДляПоиска - Структура - дополнительные настройки для поиска этого варианта отчета, где: // ** НаименованияПолей - Строка - имена полей варианта отчета. @@ -291,8 +291,9 @@ // // Код процедуры. // КонецПроцедуры // -// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - полное имя или ссылка на отчет. -// * Метаданные - ОбъектМетаданных: Отчет - метаданные отчета. +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - полное имя или ссылка на отчет. +// * Описание - Строка +// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. // * КлючВарианта - Строка - имя варианта отчета. // * ОписаниеПолучено - Булево - флажок что описание строки уже получено. // Описание получается методом ОписаниеВарианта(). @@ -334,7 +335,7 @@ // и из процедуры НастроитьВариантыОтчета модуля объекта отчета. // // Параметры: -// Настройки - см. ВариантыОтчетов.КоллекцияПредопределенныхВариантовОтчетов +// Настройки - см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. // ОтчетИлиПодсистема - СтрокаДереваЗначений // - ОбъектМетаданныхОтчет // - ОбъектМетаданныхПодсистема - описание отчета или @@ -587,7 +588,7 @@ // - Строка - полное имя варианта отчета, для которого требуется сбросить настройки. // Заполняется в формате "<ИмяОтчета>/<ИмяВарианта>". // Если передать "*", то будут сброшены настройки всех отчетов конфигурации. -// ТипыНастроек - Структура - необязательный. Типы пользовательских настроек, которые требуется сбросить. +// ТипыНастроек - Структура - типы пользовательских настроек, которые требуется сбросить. // Ключи структуры тоже являются необязательными. Значение по умолчанию указано в скобках: // * ЭлементОтбора - Булево - (Ложь) сбрасывать настройку "ЭлементОтбораКомпоновкиДанных". // * ЗначениеПараметраНастроек - Булево - (Ложь) сбрасывать настройку "ЗначениеПараметраНастроекКомпоновкиДанных". @@ -1015,7 +1016,7 @@ // * СсылкаОтчета - Произвольный - ссылка отчета. // * ПолноеИмя - Строка - полное имя отчета. // * Метаданные - ОбъектМетаданных - метаданные отчета. -// * Объект - ОтчетОбъект.<Имя отчета> +// * Объект - ОтчетОбъект // - ВнешнийОтчет - объект отчета: // ** КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных - настройки отчета. // ** СхемаКомпоновкиДанных - СхемаКомпоновкиДанных - схема отчета. @@ -1272,10 +1273,20 @@ ПредопределенныеВарианты.Удалить(ВариантОтчета.КлючВарианта); ВариантОбъект = ВариантОтчета.Ссылка.ПолучитьОбъект(); - МультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ВариантОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриЧтенииПредставленийНаСервере(ВариантОбъект); + КонецЕсли; + ВариантОбъект.Наименование = Представление; ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект); - МультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект); + КонецЕсли; + ВариантОбъект.Записать(); КонецЕсли; КонецЦикла; @@ -1290,7 +1301,12 @@ ВариантОбъект.Наименование = Представление.Значение; ВариантОбъект.Пользовательский = Ложь; ВариантОбъект.ДополнительныеСвойства.Вставить("ОтчетОбъект", ВнешнийОбъект); - МультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПередЗаписьюНаСервере(ВариантОбъект); + КонецЕсли; + ВариантОбъект.Записать(); КонецЦикла; КонецЕсли; @@ -1873,7 +1889,7 @@ // * ТипОтчета - Перечисления.ТипыОтчетов // * ОтчетИмя - Строка - например, "ДинамикаИзмененийФайлов". // * ОтчетПолноеИмя - Строка - например, "Отчет.ДинамикаИзмененийФайлов". -// * ОтчетМетаданные - ОбъектМетаданных: Отчет +// * ОтчетМетаданные - ОбъектМетаданныхОтчет // * ТекстОшибки - Строка - текст ошибки. // Функция ИнформацияОбОтчете(Знач ОтчетПолноеИмя, Знач ВызыватьИсключение = Ложь) Экспорт @@ -1984,7 +2000,7 @@ //////////////////////////////////////////////////////////////////////////////// // Для отчета по внедрению. -Функция ПредопределенныеВариантыОтчетов(ТипОтчетов = "Внутренний") Экспорт +Функция ПредопределенныеВариантыОтчетов(ТипОтчетов = "Внутренний", ПодключенныеКХранилищу = Истина) Экспорт Результат = КоллекцияПредопределенныхВариантовОтчетов(); ГруппироватьПоОтчетам = ГлобальныеНастройки().ВыводитьОтчетыВместоВариантов; @@ -2004,7 +2020,8 @@ Продолжить; КонецЕсли; - Если Не ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажкаХранилища) Тогда + Если ПодключенныеКХранилищу + И Не ОтчетПодключенКХранилищу(ОтчетМетаданные, КэшФлажкаХранилища) Тогда Продолжить; КонецЕсли; @@ -2098,11 +2115,13 @@ // Обработка отчетов, включенных в состав подсистемы ПодключаемыеОтчетыИОбработки. Если ЕстьПодключаемыеКоманды И СоставПодключаемыхОтчетовИОбработок.Содержит(ОтчетМетаданные) Тогда НастройкиПоставщика = МодульПодключаемыеКоманды.НастройкиПодключаемогоОбъекта(ОтчетМетаданные.ПолноеИмя()); - Если НастройкиПоставщика.ОпределитьНастройкиФормы Тогда - ОписаниеОтчета.ОпределитьНастройкиФормы = Истина; - КонецЕсли; - Если НастройкиПоставщика.НастроитьВариантыОтчета Тогда - НастроитьОтчетВМодулеМенеджера(Результат, ОтчетМетаданные); + Если НастройкиПоставщика <> Неопределено Тогда + Если НастройкиПоставщика.ОпределитьНастройкиФормы Тогда + ОписаниеОтчета.ОпределитьНастройкиФормы = Истина; + КонецЕсли; + Если НастройкиПоставщика.НастроитьВариантыОтчета Тогда + НастроитьОтчетВМодулеМенеджера(Результат, ОтчетМетаданные); + КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; @@ -2229,11 +2248,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// Добавляет в список процедуры-обработчики обновления данных ИБ. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт //////////////////////////////////////////////////////////////////////////////// @@ -2338,11 +2353,7 @@ КонецПроцедуры -// Определяет объекты метаданных и отдельные реквизиты, которые исключаются из результатов поиска ссылок. -// -// Параметры: -// ИсключенияПоискаСсылок - Массив - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВариантыОтчетов.ТабличныеЧасти.Размещение.Реквизиты.Подсистема); @@ -2361,13 +2372,7 @@ КонецПроцедуры -// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок -// при загрузке данных в другую информационную базу. -// см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. -// -// Параметры: -// Типы - Массив Из ОбъектМетаданных - массив типов ОбъектМетаданных. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов); @@ -2379,12 +2384,7 @@ Параметры.Вставить("ВариантыОтчетов", Новый ФиксированнаяСтруктура(ПараметрыКлиента())); КонецПроцедуры -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. -// -// Параметры: -// Типы - Массив - массив типов ОбъектМетаданных. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений); @@ -2411,12 +2411,7 @@ Объекты.Вставить(Метаданные.Справочники.ПредопределенныеВариантыОтчетовРасширений.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// -// Параметры: -// НазначениеРолей - Структура: -// * СовместноДляПользователейИВнешнихПользователей - Массив - имена ролей. -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -2450,11 +2445,6 @@ КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. -// -// Параметры: -// НастройкиПрограммногоИнтерфейса - ТаблицаЗначений - для добавления нового свойства в параметр Настройки. -// -// Процедура ПриОпределенииСоставаНастроекПодключаемыхОбъектов(НастройкиПрограммногоИнтерфейса) Экспорт Настройка = НастройкиПрограммногоИнтерфейса.Добавить(); Настройка.Ключ = "ДобавитьКомандыОтчетов"; @@ -2474,13 +2464,6 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды -// -// -// Параметры: // ВидыПодключаемыхКоманд - ТаблицаЗначений - поддерживаемые виды команд, где: // * Имя - Строка - имя вида команд. // * ИмяПодменю - Строка - имя подменю для размещения команд этого вида на формах объектов. @@ -2500,13 +2483,6 @@ КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. -// -// Параметры: -// НастройкиФормы - Структура - сведения о форме, в которой выводятся команды. -// Источники - ДеревоЗначений - сведения о поставщиках команд этой формы. -// ПодключенныеОтчетыИОбработки - ТаблицаЗначений - отчеты и обработки, предоставляющие свои команды. -// Команды - ТаблицаЗначений - записать в этот параметр сформированные команды для вывода в подменю. -// Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт КомандыОтчетов = Команды.СкопироватьКолонки(); КомандыОтчетов.Колонки.Добавить("КлючВарианта", Новый ОписаниеТипов("Строка, Null")); @@ -2640,7 +2616,7 @@ // // Возвращаемое значение: // Структура - параметры отчета, в том числе Объект отчета: -// * Объект - ОтчетОбъект.<Имя отчета> +// * Объект - ОтчетОбъект // - ВнешнийОтчет - объект отчета. // * Имя - Строка - имя объекта отчета. // * ПолноеИмя - Строка - полное имя объекта отчета. @@ -2799,11 +2775,11 @@ // // Параметры: // Настройки - ТаблицаЗначений - передается "как есть" из процедуры НастроитьВариантыОтчетов. -// Отчет - СтрокаТаблицыЗначений +// Отчет - СтрокаТаблицыЗначений: // - ОбъектМетаданныхОтчет - описание настроек или метаданные отчета. // ГруппироватьПоОтчетам - Булево - режим вывода в панели отчетов: -// - Истина - По отчетам (варианты скрыты, а отчет включен и видим). -// - Ложь - По вариантам (варианты видимы, а отчет отключен). +// - Истина - по отчетам (варианты скрыты, а отчет включен и видим). +// - Ложь - по вариантам (варианты видимы, а отчет отключен). // Процедура УстановитьРежимВыводаОтчетаВПанеляхОтчетов(Настройки, Отчет, ГруппироватьПоОтчетам) Если ТипЗнч(Отчет) = Тип("СтрокаТаблицыЗначений") Тогда @@ -2825,7 +2801,7 @@ // // Возвращаемое значение: // ТаблицаЗначений - таблица изменений имен вариантов. Колонки: -// * ОтчетМетаданные - ОбъектМетаданных: Отчет - метаданные отчета, в схеме которого изменилось имя варианта. +// * ОтчетМетаданные - ОбъектМетаданныхОтчет - метаданные отчета, в схеме которого изменилось имя варианта. // * СтароеИмяВарианта - Строка - старое имя варианта, до изменения. // * АктуальноеИмяВарианта - Строка - текущее (последнее актуальное) имя варианта. // * Отчет - СправочникСсылка.ИдентификаторыОбъектовМетаданных @@ -2895,9 +2871,9 @@ // // Возвращаемое значение: // ТаблицаЗначений - результат - ТаблицаЗначений - Настройки размещения отчетов по подсистемам: -// * ОтчетМетаданные - ОбъектМетаданных: Отчет. +// * ОтчетМетаданные - ОбъектМетаданныхОтчет // * ОтчетПолноеИмя - Строка. -// * ПодсистемаМетаданные - ОбъектМетаданных: Подсистема. +// * ПодсистемаМетаданные - ОбъектМетаданныхПодсистема // * ПодсистемаПолноеИмя - Строка. // Функция РазмещениеОтчетовВПодсистемах(Результат = Неопределено, РодительскаяПодсистема = Неопределено) @@ -3672,8 +3648,6 @@ ?(Режим = "ОбщиеДанныеКонфигурации", НСтр("ru = 'метаданные конфигурации'"), НСтр("ru = 'метаданные расширений'"))); ЗаписатьВЖурналЗапускПроцедуры(ПредставлениеПроцедуры); - РеквизитыВариантов = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; - Если Режим = "ОбщиеДанныеКонфигурации" Тогда ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.ПредопределенныеВариантыОтчетов УПОРЯДОЧИТЬ ПО ПометкаУдаления"; ПустаяСсылка = Справочники.ПредопределенныеВариантыОтчетов.ПустаяСсылка(); @@ -4272,11 +4246,11 @@ ИмяТаблицы = "Справочник.ВариантыОтчетов"; Если Режим = "ОбщиеДанныеКонфигурации" Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ВариантыОтчетов", ".ПредопределенныеВариантыОтчетов"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И ВариантыОтчетов.ТипОтчета = &ТипОтчета", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.ТипОтчета = &ТипОтчета", "Истина"); ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетов"; ИначеЕсли Режим = "ОбщиеДанныеРасширений" Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".ВариантыОтчетов", ".ПредопределенныеВариантыОтчетовРасширений"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И ВариантыОтчетов.ТипОтчета = &ТипОтчета", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВариантыОтчетов.ТипОтчета = &ТипОтчета", "Истина"); ИмяТаблицы = "Справочник.ПредопределенныеВариантыОтчетовРасширений"; ИначеЕсли Режим = "РазделенныеДанныеКонфигурации" Тогда Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний); @@ -4644,7 +4618,7 @@ ПользовательИБ.ПоказыватьВСпискеВыбора = Ложь; КонецЕсли; - ПользовательИБ.Язык = МультиязычностьСервер.ЯзыкПоКоду(КодЯзыка); + ПользовательИБ.Язык = ЯзыкПоКоду(КодЯзыка); ПользовательИБ.Записать(); // Обновление пользователя - элемента справочника Пользователи. @@ -4699,6 +4673,23 @@ КонецФункции +// Возвращает метаданные по коду языка конфигурации. +// +// Параметры: +// КодЯзыка - Строка - код языка, например "en" (как задано в свойстве КодЯзыка метаданных ОбъектМетаданных: Язык). +// +// Возвращаемое значение: +// ОбъектМетаданныхЯзык - если найден по переданному коду языка, иначе Неопределено. +// +Функция ЯзыкПоКоду(Знач КодЯзыка) + Для каждого Язык Из Метаданные.Языки Цикл + Если Язык.КодЯзыка = КодЯзыка Тогда + Возврат Язык; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + Функция ИмяСлужебногоПользователя() Возврат "СлужебныйПользовательДляОбновленияПредставлений"; @@ -5393,6 +5384,10 @@ КонецФункции // Представления группировок и полей из СКД. +// +// Параметры: +// КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных +// Функция СформироватьПредставленияПолей(КомпоновщикНастроекКД) Результат = СтрРазделить(Строка(КомпоновщикНастроекКД.Настройки.Выбор), ",", Ложь); @@ -5524,7 +5519,6 @@ // Извлекает текстовую информацию из макета. Функция ИзвлечьТекстМакета(ОтчетОбъект, ИменаМакетов) - ИзвлеченныйТекст = ""; Если ТипЗнч(ИменаМакетов) = Тип("Строка") Тогда ИменаМакетов = СтрРазделить(ИменаМакетов, ",", Ложь); КонецЕсли; @@ -5698,15 +5692,15 @@ // а пользователю только доступные ему варианты отчетов. // Если Истина, то администратору также возвращаются только личные варианты отчетов как и для // неполноправного пользователя. -// ПолучатьИтоговуюТаблицу - Булево - необязательный. Если Истина, то в возвращаемом значении заполняется свойство ТаблицаЗначений. -// ПолучатьПодсветку - Булево - необязательный. Если Истина, то в возвращаемом значении заполняются свойства +// ПолучатьИтоговуюТаблицу - Булево - если Истина, то в возвращаемом значении заполняется свойство ТаблицаЗначений. +// ПолучатьПодсветку - Булево - если Истина, то в возвращаемом значении заполняются свойства // ПодсветкаВариантов, Подсистемы, ПодсветкаПодсистем, ВариантыСвязанныеСПодсистемами, РодителиСвязанныеСВариантами. // // Возвращаемое значение: // Структура: // * Ссылки - Массив из СправочникСсылка.ВариантыОтчетов - вариантами отчетов, в названиях и описаниях которых, // найдены все искомые слова. -// * ПодсветкаВариантов - Соответствие - подсветка найденных слов (если задана СтрокаПоиска), где: +// * ПодсветкаВариантов - Соответствие из КлючИЗначение - подсветка найденных слов (если задана СтрокаПоиска), где: // ** Ключ - СправочникСсылка.ВариантыОтчетов. // ** Значение - Структура: // *** Ссылка - СправочникСсылка.ВариантыОтчетов @@ -5724,14 +5718,14 @@ // * Подсистемы - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - заполняется подсистемами, // в наименованиях которых найдены все искомые слова. // Для таких подсистем должны выводиться все вложенные варианты отчетов. -// * ПодсветкаПодсистем - Соответствие - подсветка найденных слов (если задана СтрокаПоиска), где: +// * ПодсветкаПодсистем - Соответствие из КлючИЗначение - подсветка найденных слов (если задана СтрокаПоиска), где: // ** Ключ - СправочникСсылка.ВариантыОтчетов // ** Значение - Структура: // *** Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных // *** НаименованиеПодсистемы - Строка -// * ВариантыСвязанныеСПодсистемами - Соответствие - варианты отчетов и их подсистемы, где: +// * ВариантыСвязанныеСПодсистемами - Соответствие из КлючИЗначение - варианты отчетов и их подсистемы, где: // ** Ключ - СправочникСсылка.ВариантыОтчетов - вариант. -// ** Значение - Массив Из СправочникСсылка.ИдентификаторыОбъектовМетаданных - подсистемы. +// ** Значение - Массив из СправочникСсылка.ИдентификаторыОбъектовМетаданных - подсистемы. // * ТаблицаЗначений - ТаблицаЗначений - заполняется, если задан ПараметрыПоиска.ПолучатьИтоговуюТаблицу: // ** Ссылка - СправочникСсылка.ВариантыОтчетов // ** Родитель - СправочникСсылка.ВариантыОтчетов @@ -5774,8 +5768,6 @@ ЕстьОтборПоПодсистемам = ПараметрыПоиска.Свойство("Подсистемы") И ЗначениеЗаполнено(ПараметрыПоиска.Подсистемы); ЕстьОтборПоКонтексту = ПараметрыПоиска.Свойство("Контекст"); - ЖесткийОтборПоПодсистемам = ЕстьОтборПоПодсистемам - И ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыПоиска, "ЖесткийОтборПоПодсистемам", Истина); ЕстьОтборПоТипамОтчетов = ПараметрыПоиска.Свойство("ТипыОтчетов") И ЗначениеЗаполнено(ПараметрыПоиска.ТипыОтчетов); Результат = Новый Структура; @@ -5831,7 +5823,7 @@ Запрос.УстановитьПараметр("НеПолучатьОписания", Не ЕстьСтрокаПоиска И Не ПолучатьИтоговуюТаблицу); Запрос.УстановитьПараметр("ПолучатьИтоговуюТаблицу", ПолучатьИтоговуюТаблицу); Запрос.УстановитьПараметр("ПоказыватьЛичныеВариантыОтчетовДругихАвторов", ПоказыватьЛичныеВариантыОтчетовДругихАвторов); - Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ЭтоОсновнойЯзык()); + Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); Запрос.УстановитьПараметр("ПредставленияПодсистем", ВариантыОтчетовПовтИсп.ПредставленияПодсистем()); Запрос.УстановитьПараметр("Контекст", ?(ЕстьОтборПоКонтексту, ПараметрыПоиска.Контекст, "")); @@ -7081,7 +7073,7 @@ Запрос.УстановитьПараметр("МассивПодсистем", МассивПодсистем); Запрос.УстановитьПараметр("ТаблицаПодсистем", ТаблицаПодсистем); Запрос.УстановитьПараметр("РазделСсылка", ПараметрыЗаполнения.ТекущийРазделСсылка); - Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ЭтоОсновнойЯзык()); + Запрос.УстановитьПараметр("ЭтоОсновнойЯзык", ОбщегоНазначения.ЭтоОсновнойЯзык()); Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); Запрос.УстановитьПараметр("ВариантыНайденныеПоиском", РезультатПоиска.Ссылки); Запрос.УстановитьПараметр("ПодсистемыНайденныеПоиском", РезультатПоиска.Подсистемы); @@ -7198,12 +7190,6 @@ КонецПроцедуры -Функция ЭтоОсновнойЯзык() Экспорт - - Возврат СтрСравнить(ОбщегоНазначения.КодОсновногоЯзыка(), ТекущийЯзык().КодЯзыка) = 0; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Определение используемых таблиц. @@ -7462,7 +7448,7 @@ // * ПользовательскиеНастройки - СписокЗначений // * Значение - Строка // * Представление - Строка -// * ХранилищеПользовательскихНастроек - Соответствие +// * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение // * Ключ - Строка // * Значение - ПользовательскиеНастройкиКомпоновкиДанных // * Ссылка - см. ВариантОтчетаПоОписанию @@ -7667,7 +7653,7 @@ // * ПользовательскиеНастройки - СписокЗначений - список пользовательских настроек, где: // * Значение - Строка - ключ пользовательских настроек. // * Представление - Строка - представление пользовательских настроек. -// * ХранилищеПользовательскихНастроек - Соответствие - список пользовательских настроек, где: +// * ХранилищеПользовательскихНастроек - Соответствие из КлючИЗначение - список пользовательских настроек, где: // * Ключ - Строка - ключ пользовательских настроек. // * Значение - ПользовательскиеНастройкиКомпоновкиДанных - настройки. // @@ -7718,7 +7704,7 @@ // * КлючВарианта - Строка // * Настройки - Неопределено // * ИмяОтчета - Строка -// ВариантОтчетаОснование - СправочникСсылка.ВариантыОтчетов +// ВариантОтчетаОснование - СправочникСсылка.ВариантыОтчетов // // Возвращаемое значение: // СправочникСсылка.ВариантыОтчетов @@ -7736,7 +7722,7 @@ Попытка Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); + Блокировка.Добавить(Метаданные.Справочники.ВариантыОтчетов.ПолноеИмя()); Блокировка.Заблокировать(); ВариантОтчета = ПользовательскийВариантОтчета(ИнформацияОбОтчете.Отчет, ОписаниеВариантаОтчета.КлючВарианта, Автор); @@ -8053,6 +8039,7 @@ КонецЕсли; + ВыбранныеПользователи.Добавить(ТекущийПользователь); ПроверитьДоступностьВариантаОтчета(ШаблонОписанияНастроек.ВариантОтчета, ВыбранныеПользователи); НормализоватьШаблонОписанияНастроек(ШаблонОписанияНастроек, ТекущийПользователь); @@ -8078,6 +8065,19 @@ КонецПроцедуры +// Параметры: +// ВыбранныеПользователи - СписокЗначений: +// * Значение - СправочникСсылка.Пользователи +// - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей +// ТекущийПользователь - СправочникСсылка.ВнешниеПользователи +// - СправочникСсылка.Пользователи +// +// Возвращаемое значение: +// Структура: +// * Недействительных - Массив из Структура +// * Действительных - Массив из Структура +// Функция СвойстваПользователейНастроек(ВыбранныеПользователи, ТекущийПользователь) СвойстваПользователей = Новый Структура(); @@ -8144,11 +8144,7 @@ КонецЕсли; - СвойстваПользователя = Новый Структура(); - СвойстваПользователя.Вставить("Ссылка", Выборка.Ссылка); - СвойстваПользователя.Вставить("Имя", ПользовательИБ.Имя); - СвойстваПользователя.Вставить("ИдентификаторПользователяИБ", Выборка.ИдентификаторПользователяИБ); - + СвойстваПользователя = СвойстваПользователя(Выборка.Ссылка, ПользовательИБ.Имя, Выборка.ИдентификаторПользователяИБ); СвойстваПользователей.Действительных.Добавить(СвойстваПользователя); КонецЦикла; @@ -8157,6 +8153,30 @@ КонецФункции +// Параметры: +// Ссылка - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// ИмяПользователяИБ - Строка +// ИдентификаторПользователяИБ - УникальныйИдентификатор +// +// Возвращаемое значение: +// Структура: +// * Ссылка - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// * Имя - Строка +// * ИдентификаторПользователяИБ - УникальныйИдентификатор +// +Функция СвойстваПользователя(Ссылка, ИмяПользователяИБ, ИдентификаторПользователяИБ) + + СвойстваПользователя = Новый Структура; + СвойстваПользователя.Вставить("Ссылка", Ссылка); + СвойстваПользователя.Вставить("Имя", ИмяПользователяИБ); + СвойстваПользователя.Вставить("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ); + + Возврат СвойстваПользователя; + +КонецФункции + Процедура ПроверитьДоступностьВариантаОтчета(ВариантОтчета, ВыбранныеПользователи) ВыборкаПользователей = РегистрыСведений.НастройкиВариантовОтчетов.ПользователиВариантаОтчета( @@ -8280,6 +8300,7 @@ КонецЕсли; МодульОбсужденияСлужебный = ОбщегоНазначения.ОбщийМодуль("ОбсужденияСлужебный"); + МодульОбсуждения = ОбщегоНазначения.ОбщийМодуль("Обсуждения");; Если Не МодульОбсужденияСлужебный.Подключены() Тогда Возврат; @@ -8292,16 +8313,7 @@ Получатели = Новый Массив; Для Каждого СвойстваПользователя Из СвойстваПользователей Цикл - - Попытка - ИдентификаторПользователя = СистемаВзаимодействия.ПолучитьИдентификаторПользователя( - СвойстваПользователя.ИдентификаторПользователяИБ); - Исключение - Продолжить; - КонецПопытки; - - Получатели.Добавить(ИдентификаторПользователя); - + Получатели.Добавить(СвойстваПользователя.Ссылка); КонецЦикла; Если Получатели.Количество() = 0 Тогда @@ -8312,26 +8324,6 @@ #Область ГенерацияОповещенияНовыхПользователейНастроек - ПредставлениеВариантаОтчета = Строка(ОписаниеНастроек.ВариантОтчета); - - ЗаголовокОбсуждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Доступ к настройкам отчета ""%1""'"), ПредставлениеВариантаОтчета); - - Обсуждение = МодульОбсужденияСлужебный.ОбсуждениеКонтекстное( - ОписаниеНастроек.ВариантОтчета, ПредставлениеВариантаОтчета); // ОбсуждениеСистемыВзаимодействия - - Если СистемаВзаимодействия.ПолучитьРежимНаблюдения(Обсуждение.Идентификатор) Тогда - СистемаВзаимодействия.УстановитьРежимНаблюдения(Обсуждение.Идентификатор, Ложь); - КонецЕсли; - - Сообщение = СистемаВзаимодействия.СоздатьСообщение(Обсуждение.Идентификатор); - - Для Каждого Получатель Из Получатели Цикл - Сообщение.Получатели.Добавить(Получатель); - КонецЦикла; - - Сообщение.Автор = СистемаВзаимодействия.ИдентификаторТекущегоПользователя(); - Если ЗначениеЗаполнено(ОписаниеНастроек.Представление) Тогда Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -8340,17 +8332,22 @@ Текст = НСтр("ru = 'Предоставлены настройки отчета'"); КонецЕсли; - ИмяДействия = ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки(); - - Сообщение.Текст = Текст; - Сообщение.Действия.Добавить(ИмяДействия, НСтр("ru = 'Применить настройки?'")); + Сообщение = МодульОбсуждения.ОписаниеСообщения(Текст); Сообщение.Данные = ОписаниеНастроек; - + Сообщение.Действия.Добавить( + ВариантыОтчетовКлиентСервер.ИмяДействияПрименитьПереданныеНастройки(), + НСтр("ru = 'Применить настройки?'")); + Попытка - Сообщение.Записать(); + МодульОбсуждения.ОтправитьСообщение( + Пользователи.ТекущийПользователь(), + Получатели, + Сообщение, + ОписаниеНастроек.ВариантОтчета); Исключение КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + ПредставлениеВариантаОтчета = Строка(ОписаниеНастроек.ВариантОтчета); ЗаписьЖурналаРегистрации( НСтр("ru = 'Варианты отчетов.Оповещение о предоставлении доступа к настройкам отчета'", КодОсновногоЯзыка), @@ -8374,52 +8371,9 @@ // Конструктор коллекции предопределенных вариантов отчетов. // // Возвращаемое значение: -// ТаблицаЗначений - коллекция предопределенных вариантов отчетов, где: -// * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений -// - СправочникСсылка.ДополнительныеОтчетыИОбработки -// - СправочникСсылка.ИдентификаторыОбъектовМетаданных -// - Строка - полное имя или ссылка на идентификатор отчета. -// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. -// * ИспользуетСКД - Булево - признак использования в отчете основной СКД. -// * КлючВарианта - Строка - идентификатор варианта отчета. -// * ОписаниеПолучено - Булево - признак того, что описание строки уже получено. -// * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме -// * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// * Наименование - Строка - наименование варианта отчета. -// * Описание - Строка - пояснение назначения отчета. -// * Размещение - Соответствие - настройки размещения варианта отчета в разделах (подсистемах), где: -// ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. -// ** Значение - Строка - настройки размещения в подсистеме (группе) - "", "Важный", "СмТакже". -// * НастройкиДляПоиска - Структура - дополнительные настройки для поиска этого варианта отчета, где: -// ** НаименованияПолей - Строка - имена полей варианта отчета. -// ** НаименованияПараметровИОтборов - Строка - имена настроек варианта отчета. -// ** КлючевыеСлова - Строка - дополнительная терминология (в т.ч. специализированная или устаревшая). -// ** ИменаМакетов - Строка - используется вместо НаименованияПолей. -// * СистемнаяИнформация - Структура - другая служебная информация. -// * Тип - Строка - перечень идентификаторов типов. -// * ЭтоВариант - Булево - признак того, что описание отчета относится к варианту отчета. -// * ФункциональныеОпции - Массив из Строка - коллекция идентификаторов функциональных опций, где: -// * ГруппироватьПоОтчету - Булево - признак необходимости группировки вариантов по отчету-основанию. -// * КлючЗамеров - Строка - идентификатор замера производительности отчета. -// * ОсновнойВариант - Строка - идентификатор основного варианта отчета. -// * ФорматНастроекСКД - Булево - признак хранения настроек в формате СКД. -// * ОпределитьНастройкиФормы - Булево - отчет имеет программный интерфейс для тесной интеграции с формой отчета, -// в том числе может переопределять некоторые настройки формы и подписываться на ее события. -// Если Истина и отчет подключен к общей форме ФормаОтчета, -// тогда в модуле объекта отчета следует определить процедуру по шаблону: -// -// // Задать настройки формы отчета. -// // -// // Параметры: -// // Форма - ФормаКлиентскогоПриложения, Неопределено - -// // КлючВарианта - Строка, Неопределено - -// // Настройки - см. значение ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию -// // -// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт -// // Код процедуры. -// КонецПроцедуры +// см. ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов.Настройки. // -Функция КоллекцияПредопределенныхВариантовОтчетов() Экспорт // АПК:581 Для типизации в EDT. +Функция КоллекцияПредопределенныхВариантовОтчетов() РеквизитыСправочника = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl index 4d5cd3cbc..da91b33c7 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl @@ -28,7 +28,7 @@ // Параметры: // Структура - Структура - дополняемая структура. // Ключ - Строка - имя свойства. -// Значение - Произвольный - необязательный. Значение свойства если оно отсутствует в структуре. +// Значение - Произвольный - значение свойства если оно отсутствует в структуре. // Процедура ДополнитьСтруктуруКлючом(Структура, Ключ, Значение = Неопределено) Экспорт Если Не Структура.Свойство(Ключ) Тогда diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl index bde2f49f5..3fd7713c3 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl @@ -56,7 +56,7 @@ // // Параметры: // Разделы - СписокЗначений - разделы, в которые выведены команды открытия панели отчетов: -// * Значение - ОбъектМетаданных: Подсистема +// * Значение - ОбъектМетаданныхПодсистема // - Строка - подсистема раздела глобального командного интерфейса, // либо ВариантыОтчетовКлиентСервер.ИдентификаторНачальнойСтраницы для начальной страницы. // * Представление - Строка - заголовок панели отчетов в этом разделе. @@ -100,7 +100,50 @@ // - они отключаются только с отключением всего отчета. // // Параметры: -// Настройки - см. ВариантыОтчетов.КоллекцияПредопределенныхВариантовОтчетов +// Настройки - ТаблицаЗначений - коллекция предопределенных вариантов отчетов, где: +// * Отчет - СправочникСсылка.ИдентификаторыОбъектовРасширений +// - СправочникСсылка.ДополнительныеОтчетыИОбработки +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// - Строка - полное имя или ссылка на идентификатор отчета. +// * Метаданные - ОбъектМетаданныхОтчет - метаданные отчета. +// * ИспользуетСКД - Булево - признак использования в отчете основной СКД. +// * КлючВарианта - Строка - идентификатор варианта отчета. +// * ОписаниеПолучено - Булево - признак того, что описание строки уже получено. +// * Включен - Булево - если Ложь, то вариант отчета не регистрируется в подсистеме +// * ВидимостьПоУмолчанию - Булево - если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * Наименование - Строка - наименование варианта отчета. +// * Описание - Строка - пояснение назначения отчета. +// * Размещение - Соответствие из КлючИЗначение - настройки размещения варианта отчета в разделах (подсистемах), где: +// ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. +// ** Значение - Строка - настройки размещения в подсистеме (группе) - "", "Важный", "СмТакже". +// * НастройкиДляПоиска - Структура - дополнительные настройки для поиска этого варианта отчета, где: +// ** НаименованияПолей - Строка - имена полей варианта отчета. +// ** НаименованияПараметровИОтборов - Строка - имена настроек варианта отчета. +// ** КлючевыеСлова - Строка - дополнительная терминология (в т.ч. специализированная или устаревшая). +// ** ИменаМакетов - Строка - используется вместо НаименованияПолей. +// * СистемнаяИнформация - Структура - другая служебная информация. +// * Тип - Строка - перечень идентификаторов типов. +// * ЭтоВариант - Булево - признак того, что описание отчета относится к варианту отчета. +// * ФункциональныеОпции - Массив из Строка - коллекция идентификаторов функциональных опций, где: +// * ГруппироватьПоОтчету - Булево - признак необходимости группировки вариантов по отчету-основанию. +// * КлючЗамеров - Строка - идентификатор замера производительности отчета. +// * ОсновнойВариант - Строка - идентификатор основного варианта отчета. +// * ФорматНастроекСКД - Булево - признак хранения настроек в формате СКД. +// * ОпределитьНастройкиФормы - Булево - отчет имеет программный интерфейс для тесной интеграции с формой отчета, +// в том числе может переопределять некоторые настройки формы и подписываться на ее события. +// Если Истина и отчет подключен к общей форме ФормаОтчета, +// тогда в модуле объекта отчета следует определить процедуру по шаблону: +// +// // Задать настройки формы отчета. +// // +// // Параметры: +// // Форма - ФормаКлиентскогоПриложения, Неопределено - +// // КлючВарианта - Строка, Неопределено - +// // Настройки - см. значение ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию +// // +// Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт +// // Код процедуры. +// КонецПроцедуры // // Пример: // diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl new file mode 100644 index 000000000..a3ab98a02 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/Module.bsl @@ -0,0 +1,1480 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Свойства результата отчета (табличного документа и настроек) для контекстной настройки. +// +// Возвращаемое значение: +// Структура: +// * Заголовки - Соответствие +// * ГраницыРазделов - см. ГраницыРазделовОтчета +// * РолиПолей - см. РолиПолейОтчета +// * ИндексПолей - см. ИндексПолейСтруктурыОтчета +// * ОсновныеПоля - Массив из см. ОсновныеПоляОтчета +// * ИтоговыеНастройки - НастройкиКомпоновкиДанных - см. синтакс-помощник КомпоновщикНастроекКомпоновкиДанных.ПолучитьНастройки(); +// +Функция СвойстваРезультатаОтчета() Экспорт + + СвойстваРезультата = Новый Структура; + СвойстваРезультата.Вставить("Заголовки", Новый Соответствие); + СвойстваРезультата.Вставить("ГраницыРазделов", Новый СписокЗначений); + СвойстваРезультата.Вставить("РолиПолей", Новый Структура); + СвойстваРезультата.Вставить("ИндексПолей", Новый Соответствие); + СвойстваРезультата.Вставить("ОсновныеПоля", Новый Массив); + СвойстваРезультата.Вставить("ИтоговыеНастройки", Неопределено); + СвойстваРезультата.Вставить("ВремяФормирования", 0); + + Возврат СвойстваРезультата; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета +// +Процедура ИнициализироватьЗаголовкиОтчета(Форма) Экспорт + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + + Если Не РежимВариантаОтчета(Форма.КлючТекущегоВарианта) + Или Не НастройкиОтчета.РазрешеноИзменятьВарианты Тогда + + Возврат; + КонецЕсли; + + Заголовки = Новый Соответствие; + + Элементы = Форма.Элементы; + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + РезультатОтчета = Форма.ОтчетТабличныйДокумент; + + РазрезСвойствЗаголовков = СтандартныйРазрезСвойствЗаголовковОтчета(); + + Для НомерСтроки = 1 По РезультатОтчета.ВысотаТаблицы Цикл + + Для НомерКолонки = 1 По РезультатОтчета.ШиринаТаблицы Цикл + + Ячейка = РезультатОтчета.Область(НомерСтроки, НомерКолонки); + + Если Ячейка.РежимИзмененияРазмераКолонки <> РежимИзмененияРазмера.БыстроеИзменение Тогда + Продолжить; + КонецЕсли; + + Ячейка.ГиперСсылка = Истина; + + ЗаполнитьЗначенияСвойств(РазрезСвойствЗаголовков.Добавить(), Ячейка); + + СвойстваЗаголовка = СтандартныеСвойстваЗаголовкаОтчета(); + ЗаполнитьЗначенияСвойств(СвойстваЗаголовка, Ячейка); + + Заголовки.Вставить(Ячейка.Имя, СвойстваЗаголовка); + + КонецЦикла; + + КонецЦикла; + + ОпределитьИерархиюЗаголовковОтчета(РазрезСвойствЗаголовков, Заголовки); + ГраницыРазделов = ГраницыРазделовОтчета(РезультатОтчета, РазрезСвойствЗаголовков); + + ИндексСтруктурыОтчета = ИндексСтруктурыОтчета(Форма); + ДополнитьСвойстваЗаголовковОтчета(Форма, РезультатОтчета, Заголовки, РазрезСвойствЗаголовков, ИндексСтруктурыОтчета, ГраницыРазделов); + + Ячейка = Элементы.ОтчетТабличныйДокумент.ТекущаяОбласть; + + Если Ячейка <> Неопределено Тогда + ВариантыОтчетовСлужебныйКлиентСервер.ОпределитьДоступностьДействийКонтекстногоМеню(Форма, Заголовки[Ячейка.Имя]); + КонецЕсли; + + СвойстваРезультата.Заголовки = Заголовки; + СвойстваРезультата.ГраницыРазделов = ГраницыРазделов; + +КонецПроцедуры + +Функция РежимВариантаОтчета(КлючВарианта) Экспорт + + Возврат ТипЗнч(КлючВарианта) = Тип("Строка") + И Не ПустаяСтрока(КлючВарианта); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ИндексацияРазделовОтчета + +Функция ИндексСтруктурыОтчета(Форма) + + НастройкиОтчета = Форма.НастройкиОтчета; + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; + + ИндексСтруктурыОтчета = НовыйИндексСтруктурыОтчета(); + СвойстваРезультата.ИтоговыеНастройки = Форма.Отчет.КомпоновщикНастроек.ПолучитьНастройки(); + СвойстваРезультата.РолиПолей = РолиПолейОтчета(НастройкиОтчета.АдресСхемы); + + ИндексироватьРазделыОтчета(СвойстваРезультата, СвойстваРезультата.ИтоговыеНастройки, ИндексСтруктурыОтчета); + ИндексироватьГруппировкиОтчета(СвойстваРезультата, ИндексСтруктурыОтчета); + + УдалитьНеидентифицированныеПоля(ИндексСтруктурыОтчета); + УточнитьПорядокРазделов(ИндексСтруктурыОтчета); + ОпределитьРолиПолей(ИндексСтруктурыОтчета, СвойстваРезультата.РолиПолей); + УстановитьИдентификаторыИндексаСтруктурыОтчета(ИндексСтруктурыОтчета); + ОпределитьДоступныеДействияПолейОтчета(ИндексСтруктурыОтчета); + + СвойстваРезультата.ИндексПолей = ИндексПолейСтруктурыОтчета(ИндексСтруктурыОтчета); + СвойстваРезультата.ОсновныеПоля = ОсновныеПоляОтчета(Форма); + + Возврат ИндексСтруктурыОтчета; + +КонецФункции + +Процедура ИндексироватьРазделыОтчета(СвойстваРезультата, Настройки, ИндексСтруктурыОтчета, ПорядокРаздела = 0) + + Для Каждого Раздел Из Настройки.Структура Цикл + + Если Не Раздел.Использование + Или ТипЗнч(Раздел) = Тип("ДиаграммаКомпоновкиДанных") Тогда + + Продолжить; + КонецЕсли; + + Если ТипЗнч(Раздел) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда + + ИндексироватьРазделыОтчета(СвойстваРезультата, Раздел.Настройки, ИндексСтруктурыОтчета, ПорядокРаздела); + + Иначе + + ПорядокРаздела = ПорядокРаздела + 1; + + ИндексРаздела = ИндексСтруктурыОтчета.Добавить(); + ИндексРаздела.ПорядокРаздела = ПорядокРаздела; + ИндексРаздела.ИдентификаторНастроек = СвойстваРезультата.ИтоговыеНастройки.ПолучитьИдентификаторПоОбъекту(Настройки); + ИндексРаздела.ИдентификаторРаздела = Настройки.ПолучитьИдентификаторПоОбъекту(Раздел); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ИндексироватьГруппировкиОтчета(СвойстваРезультата, ИндексСтруктурыОтчета) + + ИндексРазделовОтчетов = ИндексСтруктурыОтчета.Скопировать(); + + Для Каждого ИндексРаздела Из ИндексРазделовОтчетов Цикл + + Настройки = СвойстваРезультата.ИтоговыеНастройки.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторНастроек); + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(ИндексРаздела.ИдентификаторРаздела); // ГруппировкаКомпоновкиДанных, ТаблицаКомпоновкиДанных + + Если ТипЗнч(Раздел) = Тип("ДиаграммаКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + ПорядокГруппировки = 0; + ПорядокПоля = 0; + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + ПоляСортировки = Новый Соответствие; + + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Строки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Колонки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + Иначе + + ИндексГруппировки = ИндексГруппировкиОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел, ПорядокГруппировки); + + ПоляСортировки(Раздел, Настройки, ПоляСортировки); + + ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, Раздел, ПорядокПоля, ПоляСортировки); + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Раздел.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ИндексироватьГруппировкиРазделаОтчета(ИндексСтруктурыОтчета, ИндексРаздела, Настройки, + Группировки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки = Неопределено) + + Для Каждого Элемент Из Группировки Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + ТипЭлемента = ТипЗнч(Элемент); + + Если ТипЭлемента = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда + + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Элемент.Настройки, Элемент.Настройки.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда + + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Строки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Колонки, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + ИначеЕсли ТипЭлемента <> Тип("ДиаграммаКомпоновкиДанных") Тогда + + ПоляСортировки(Элемент, Настройки, ПоляСортировки); + + ИндексГруппировки = ИндексГруппировкиОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент, ПорядокГруппировки); + + ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, Элемент, ПорядокПоля, ПоляСортировки); + ИндексироватьГруппировкиРазделаОтчета( + ИндексСтруктурыОтчета, ИндексРаздела, Настройки, Элемент.Структура, ПорядокГруппировки, ПорядокПоля, ПоляСортировки); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// Группировка - НастройкиКомпоновкиДанных +// - ГруппировкаКомпоновкиДанных +// - ГруппировкаТаблицыКомпоновкиДанных +// Настройки - НастройкиКомпоновкиДанных +// ПоляСортировки - Соответствие +// - Неопределено +// Замещать - Булево +// +// Возвращаемое значение: +// Соответствие +// +Функция ПоляСортировки(Группировка, Настройки, ПоляСортировки = Неопределено, Замещать = Истина) + + Если ПоляСортировки = Неопределено Тогда + ПоляСортировки = Новый Соответствие; + КонецЕсли; + + ТипГруппировки = ТипЗнч(Группировка); + + Если ТипГруппировки <> Тип("НастройкиКомпоновкиДанных") + И ТипГруппировки <> Тип("ГруппировкаКомпоновкиДанных") + И ТипГруппировки <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + Возврат ПоляСортировки; + КонецЕсли; + + ЭлементыСортировки = Группировка.Порядок.Элементы; + + Для Каждого Элемент Из ЭлементыСортировки Цикл + + Если Не Элемент.Использование Тогда + Продолжить; + КонецЕсли; + + Если ТипЗнч(Элемент) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда + + ПоляСортировки(Настройки, Настройки, ПоляСортировки, Ложь); + + ИначеЕсли Замещать + Или ПоляСортировки[Элемент.Поле] = Неопределено Тогда + + ПоляСортировки.Вставить(Элемент.Поле, Элемент.ТипУпорядочивания); + + КонецЕсли; + + КонецЦикла; + + Возврат ПоляСортировки; + +КонецФункции + +Функция ИндексГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексРаздела, Настройки, + Группировка, ПорядокГруппировки) + + ПорядокГруппировки = ПорядокГруппировки + 1; + + ИндексГруппировки = ИндексСтруктурыОтчета.Добавить(); + ЗаполнитьЗначенияСвойств(ИндексГруппировки, ИндексРаздела); + + ИндексГруппировки.ПорядокГруппировки = ПорядокГруппировки; + ИндексГруппировки.ИдентификаторГруппировки = Настройки.ПолучитьИдентификаторПоОбъекту(Группировка); + ИндексГруппировки.ПредставлениеГруппировки = Строка(Группировка.ПоляГруппировки); + + Возврат ИндексГруппировки; + +КонецФункции + +Процедура ИндексироватьПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки) + + ИспользуемыеПоляГруппировки = Новый Соответствие; + + ИспользуетсяАвтоПоле = ИспользуетсяАвтоПоле(Группировка.Выбор); + ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка); + + ПоляГруппировки = Группировка.ПоляГруппировки; + + Для Каждого Элемент Из ПоляГруппировки.Элементы Цикл + + Если ТипЗнч(Элемент) <> Тип("ПолеГруппировкиКомпоновкиДанных") + Или Не Элемент.Использование Тогда + + Продолжить; + КонецЕсли; + + ИспользуемыеПоляГруппировки.Вставить(Элемент.Поле, Элемент); + + Если ИспользуетсяАвтоПоле + И Не ПолеСодержитсяВВыбранныхПоляхОтчета(Группировка.Выбор, Элемент.Поле, Истина) + И Не ПолеСодержитсяВВыбранныхПоляхОтчета(ИспользуемыеНастройки.Выбор, Элемент.Поле, Истина) Тогда + + ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, ПоляГруппировки, + Элемент, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + + КонецЕсли; + + КонецЦикла; + + ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + +КонецПроцедуры + +Функция ИспользуетсяАвтоПоле(Поля) + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") + Или ТипЗнч(Элемент) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда + + Возврат Элемент.Использование; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Процедура ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) + + Если Поля = Неопределено Тогда + Поля = Группировка.Выбор; + КонецЕсли; + + Если Родитель = Неопределено Тогда + Родитель = Группировка.Выбор; + КонецЕсли; + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + + ИндексироватьВыбранныеПоляНастроекОтчета( + ИндексСтруктурыОтчета, + ИндексГруппировки, + Настройки, + Группировка, + ПорядокПоля, + ПоляСортировки, + ИспользуемыеПоляГруппировки); + + ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + ИндексироватьВыбранныеПоляГруппировкиОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Элемент, Родитель); + + ИначеЕсли РазрешеноИспользоватьПолеВГруппировке(Группировка, Элемент.Поле) Тогда + + ДобавитьПолеОтчетаВИндекс( + ИндексСтруктурыОтчета, + ИндексГруппировки, + Родитель, + Элемент, + ПорядокПоля, + ПоляСортировки, + ИспользуемыеПоляГруппировки); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура ИндексироватьВыбранныеПоляНастроекОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Поля = Неопределено, Родитель = Неопределено) + + ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка); + + Если Поля = Неопределено Тогда + Поля = ИспользуемыеНастройки.Выбор; + КонецЕсли; + + Если Родитель = Неопределено Тогда + Родитель = ИспользуемыеНастройки.Выбор; + КонецЕсли; + + ПоляСортировки(Группировка, Настройки, ПоляСортировки); + + Для Каждого Элемент Из Поля.Элементы Цикл + + ТипЭлемента = ТипЗнч(Элемент); + + Если ТипЭлемента = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + ИндексироватьВыбранныеПоляНастроекОтчета(ИндексСтруктурыОтчета, ИндексГруппировки, Настройки, + Группировка, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки, Элемент, Родитель); + + ИначеЕсли ТипЭлемента <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") + И РазрешеноИспользоватьПолеВГруппировке(Группировка, Элемент.Поле) + И Не ПолеСодержитсяВВыбранныхПоляхОтчета(Группировка.Выбор, Элемент.Поле) Тогда + + ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, Родитель, Элемент, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция РазрешеноИспользоватьПолеВГруппировке(Группировка, Поле) + + Элементы = Группировка.ПоляГруппировки.Элементы; + + Если Элементы.Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + + ДоступноеПоле = Группировка.Выбор.ДоступныеПоляВыбора.НайтиПоле(Поле); + + Если ДоступноеПоле = Неопределено Тогда + ДоступноеПоле = Группировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок.НайтиПоле(Поле); + КонецЕсли; + + Если ДоступноеПоле <> Неопределено + И ДоступноеПоле.Ресурс Тогда + + Возврат Истина; + КонецЕсли; + + Для Каждого Элемент Из Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ПолеГруппировкиКомпоновкиДанных") + И Элемент.Поле = Поле + И Элемент.Использование Тогда + + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ПолеСодержитсяВВыбранныхПоляхОтчета(Поля, Поле, ПроверятьИспользование = Ложь) + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + Возврат ПолеСодержитсяВВыбранныхПоляхОтчета(Элемент, Поле, ПроверятьИспользование); + + ИначеЕсли ТипЗнч(Элемент) <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") + И Элемент.Поле = Поле Тогда + + Возврат Не ПроверятьИспользование + Или ПроверятьИспользование И Элемент.Использование; + + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция ИспользуемыеНастройкиГруппировкиОтчета(Настройки, Группировка) + + Если ТипЗнч(Группировка.Родитель) = Тип("НастройкиКомпоновкиДанных") Тогда + Возврат Группировка.Родитель; + КонецЕсли; + + Возврат Настройки; + +КонецФункции + +Процедура ДобавитьПолеОтчетаВИндекс(ИндексСтруктурыОтчета, ИндексГруппировки, Родитель, Поле, ПорядокПоля, ПоляСортировки, ИспользуемыеПоляГруппировки) + + Если Не Поле.Использование Тогда + Возврат; + КонецЕсли; + + ОписаниеПоля = ОписаниеПоляОтчета(Родитель, Поле, ИспользуемыеПоляГруппировки); + + Если ОписаниеПоля.Ресурс + И СтрНайти(ИндексГруппировки.ИдентификаторГруппировки, "/row/") > 0 Тогда + + Возврат; + КонецЕсли; + + Поиск = Новый Структура("ПорядокРаздела, ПорядокГруппировки, Поле"); + ЗаполнитьЗначенияСвойств(Поиск, ИндексГруппировки); + Поиск.Поле = Поле.Поле; + + НайденныеИндексыПоля = ИндексСтруктурыОтчета.НайтиСтроки(Поиск); + + Если НайденныеИндексыПоля.Количество() > 0 Тогда + + ИндексПоля = НайденныеИндексыПоля[0]; + + Иначе + + ПорядокПоля = ПорядокПоля + 1; + + ИндексПоля = ИндексСтруктурыОтчета.Добавить(); + ЗаполнитьЗначенияСвойств(ИндексПоля, ИндексГруппировки); + ИндексПоля.ПорядокПоля = ПорядокПоля; + + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ИндексПоля, ОписаниеПоля); + + ИндексПоля.ПредставлениеПоля = ВРег(ИндексПоля.ПредставлениеПоля); + ИндексПоля.НаправлениеСортировки = ПоляСортировки[Поле.Поле]; + ИндексПоля.ПолеСортируется = (ИндексПоля.НаправлениеСортировки <> Неопределено); + +КонецПроцедуры + +Функция ОписаниеПоляОтчета(Родитель, Поле, ИспользуемыеПоляГруппировки) + + ОписаниеПоля = Новый Структура; + ОписаниеПоля.Вставить("Поле", Поле.Поле); + ОписаниеПоля.Вставить("ИдентификаторПоля", Родитель.ПолучитьИдентификаторПоОбъекту(Поле)); + ОписаниеПоля.Вставить("ПредставлениеПоля", Строка(Поле.Поле)); + ОписаниеПоля.Вставить("ТипПоля", ТипЗнч(Поле)); + ОписаниеПоля.Вставить("ИспользуетсяВПоляхГруппировки", ИспользуемыеПоляГруппировки[Поле.Поле] <> Неопределено); + ОписаниеПоля.Вставить("ТипЗначения", Новый ОписаниеТипов("Неопределено")); + ОписаниеПоля.Вставить("Ресурс", Ложь); + + ДоступноеПоле = Неопределено; + + Если ОписаниеПоля.ТипПоля = Тип("ПолеГруппировкиКомпоновкиДанных") Тогда + + ДоступноеПоле = Родитель.ДоступныеПоляПолейГруппировок.НайтиПоле(Поле.Поле); + + ИначеЕсли ОписаниеПоля.ТипПоля = Тип("ВыбранноеПолеКомпоновкиДанных") Тогда + + ДоступноеПоле = Родитель.ДоступныеПоляВыбора.НайтиПоле(Поле.Поле); + + КонецЕсли; + + Если ДоступноеПоле <> Неопределено Тогда + + ОписаниеПоля.ПредставлениеПоля = ДоступноеПоле.Заголовок; + ОписаниеПоля.Ресурс = ДоступноеПоле.Ресурс; + ОписаниеПоля.ТипЗначения = ДоступноеПоле.ТипЗначения; + + КонецЕсли; + + Если ОписаниеПоля.ТипПоля = Тип("ВыбранноеПолеКомпоновкиДанных") + И ЗначениеЗаполнено(Поле.Заголовок) Тогда + + ОписаниеПоля.ПредставлениеПоля = Поле.Заголовок; + КонецЕсли; + + Возврат ОписаниеПоля; + +КонецФункции + +Процедура УдалитьНеидентифицированныеПоля(ИндексСтруктурыОтчета) + + НайденныеЗаписи = ИндексСтруктурыОтчета.НайтиСтроки(Новый Структура("ИдентификаторПоля", Неопределено)); + Для Каждого Запись Из НайденныеЗаписи Цикл + ИндексСтруктурыОтчета.Удалить(Запись); + КонецЦикла; + +КонецПроцедуры + +Процедура УточнитьПорядокРазделов(ИндексСтруктурыОтчета) + + ИндексСтруктурыОтчета.Сортировать("ПорядокРаздела, ПорядокГруппировки, ПорядокПоля"); + + Разделы = ИндексСтруктурыОтчета.Скопировать(); + Разделы.Свернуть("ПорядокРаздела"); + + Поиск = Новый Структура("ПорядокРаздела"); + + Для ПорядокРаздела = 1 По Разделы.Количество() Цикл + + Поиск.ПорядокРаздела = Разделы[ПорядокРаздела - 1].ПорядокРаздела; + НайденныеЗаписи = ИндексСтруктурыОтчета.НайтиСтроки(Поиск); + + Для Каждого Запись Из НайденныеЗаписи Цикл + Запись.ПорядокРаздела = ПорядокРаздела; + КонецЦикла; + + КонецЦикла; + + ИндексСтруктурыОтчета.ЗаполнитьЗначения(Разделы.Количество(), "КоличествоРазделов"); + +КонецПроцедуры + +Процедура ОпределитьРолиПолей(ИндексСтруктурыОтчета, РолиПолей) + + Для Каждого Запись Из ИндексСтруктурыОтчета Цикл + + Запись.Период = (РолиПолей.Периоды[Запись.Поле] <> Неопределено); + Запись.Измерение = (РолиПолей.Измерения[Запись.Поле] <> Неопределено); + + КонецЦикла; + +КонецПроцедуры + +Функция РолиПолейОтчета(АдресСхемы) + + РолиПолей = Новый Структура; + РолиПолей.Вставить("Периоды", Новый Соответствие); + РолиПолей.Вставить("Измерения", Новый Соответствие); + РолиПолей.Вставить("Остатки", Новый Соответствие); + + Схема = ПолучитьИзВременногоХранилища(АдресСхемы); + + Для Каждого НаборДанных Из Схема.НаборыДанных Цикл + + Для Каждого Поле Из НаборДанных.Поля Цикл + + Если ТипЗнч(Поле) = Тип("ПапкаПолейНабораДанныхСхемыКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + Если Поле.Роль.НомерПериода > 0 Тогда + + РолиПолей.Периоды.Вставить(Новый ПолеКомпоновкиДанных(Поле.Поле), ОписаниеРолиПоляОтчета(Поле.Роль)); + + ИначеЕсли Поле.Роль.Измерение Тогда + + РолиПолей.Измерения.Вставить(Новый ПолеКомпоновкиДанных(Поле.Поле), ОписаниеРолиПоляОтчета(Поле.Роль)); + + ИначеЕсли Поле.Роль.Остаток Тогда + + РолиПолей.Остатки.Вставить(Новый ПолеКомпоновкиДанных(Поле.Поле), ОписаниеРолиПоляОтчета(Поле.Роль)); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат РолиПолей; + +КонецФункции + +Функция ОписаниеРолиПоляОтчета(Роль) + + ОписаниеРоли = Новый Структура("ВыражениеВидаСчета, ГруппаОстатка, ИгнорироватьЗначенияNULL, Измерение, + |НомерПериода, Обязательное, Остаток, ПолеСчета, РеквизитИзмерения, РодительскоеИзмерение, Счет"); + + ЗаполнитьЗначенияСвойств(ОписаниеРоли, Роль); + + ОписаниеРоли.Вставить("ТипБухгалтерскогоОстатка", Строка(Роль.ТипБухгалтерскогоОстатка)); + ОписаниеРоли.Вставить("РодительскоеИзмерение", Строка(Роль.РодительскоеИзмерение)); + ОписаниеРоли.Вставить("ТипПериода", Строка(Роль.ТипПериода)); + + Возврат ОписаниеРоли; + +КонецФункции + +Процедура УстановитьИдентификаторыИндексаСтруктурыОтчета(ИндексСтруктурыОтчета) + + Для Каждого Индекс Из ИндексСтруктурыОтчета Цикл + Индекс.ИдентификаторИндекса = Новый УникальныйИдентификатор(); + КонецЦикла; + + ИндексСтруктурыОтчета.Индексы.Добавить("ИдентификаторИндекса"); + +КонецПроцедуры + +Процедура ОпределитьДоступныеДействияПолейОтчета(ИндексСтруктурыОтчета) + + Разделы = ИндексСтруктурыОтчета.Скопировать(); + Разделы.Свернуть("ПорядокРаздела"); + ПорядокРазделов = Разделы.ВыгрузитьКолонку("ПорядокРаздела"); + + Для Каждого ПорядокРаздела Из ПорядокРазделов Цикл + + ОпределитьДоступныеДействияПолейРазделаОтчета(ИндексСтруктурыОтчета, ПорядокРаздела); + ОпределитьДоступныеДействияПолейРазделаОтчета(ИндексСтруктурыОтчета, ПорядокРаздела, Истина); + + КонецЦикла; + +КонецПроцедуры + +Процедура ОпределитьДоступныеДействияПолейРазделаОтчета(ИндексСтруктурыОтчета, ПорядокРаздела, ЭтоРесурс = Ложь) + + ПоискПолейРаздела = Новый Структура("ПорядокРаздела, Ресурс", ПорядокРаздела, ЭтоРесурс); + ПоляГруппировок = ИндексСтруктурыОтчета.Скопировать(ПоискПолейРаздела); + + ПоискПолейГруппировки = Новый Структура("ПорядокГруппировки"); + + Группировки = ПоляГруппировок.Скопировать(); + Группировки.Свернуть("ПорядокГруппировки"); + ПорядокГруппировок = Группировки.ВыгрузитьКолонку("ПорядокГруппировки"); + + Для Каждого ПорядокГруппировки Из ПорядокГруппировок Цикл + + ПоискПолейГруппировки.ПорядокГруппировки = ПорядокГруппировки; + ПоляГруппировки = ПоляГруппировок.Скопировать(ПоискПолейГруппировки); + + ПоляГруппировки.Сортировать("ПорядокГруппировки"); + + Для Каждого ПолеГруппировки Из ПоляГруппировки Цикл + + Индекс = ИндексСтруктурыОтчета.Найти(ПолеГруппировки.ИдентификаторИндекса, "ИдентификаторИндекса"); + Индекс.ВставитьПолеСлева = Истина; + Индекс.ВставитьПолеСправа = Истина; + Индекс.ВставитьГруппировкуВыше = Не ЭтоРесурс; + Индекс.ВставитьГруппировкуНиже = Не ЭтоРесурс; + + Индекс.ПереместитьПолеВыше = Не ЭтоРесурс И ПолеГруппировки.ПорядокГруппировки > 1; + Индекс.ПереместитьПолеНиже = Не ЭтоРесурс И ПолеГруппировки.ПорядокГруппировки < ПорядокГруппировок.Количество(); + + Если ПоляГруппировки.Индекс(ПолеГруппировки) > 0 Тогда + Индекс.ПереместитьПолеВлево = Истина; + КонецЕсли; + + Если ПоляГруппировки.Индекс(ПолеГруппировки) < ПоляГруппировки.Количество() - 1 Тогда + Индекс.ПереместитьПолеВправо = Истина; + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция ИндексПолейСтруктурыОтчета(ИндексСтруктурыОтчета) + + ИндексПолей = Новый Соответствие; + + Разделы = ИндексСтруктурыОтчета.Скопировать(); + Разделы.Свернуть("ПорядокРаздела"); + + ПорядокРазделов = Разделы.ВыгрузитьКолонку("ПорядокРаздела"); + + ПоискГруппировок = Новый Структура("ПорядокРаздела"); + ПоискПоля = Новый Структура("ПорядокРаздела, ПорядокГруппировки"); + + Для Каждого ПорядокРаздела Из ПорядокРазделов Цикл + + ПоискГруппировок.ПорядокРаздела = ПорядокРаздела; + Группировки = ИндексСтруктурыОтчета.Скопировать(ПоискГруппировок); + Группировки.Свернуть("ПорядокГруппировки"); + + ПорядокГруппировок = Группировки.ВыгрузитьКолонку("ПорядокГруппировки"); + + ИндексПолейРаздела = ИндексПолей[ПорядокРаздела]; + Если ИндексПолейРаздела = Неопределено Тогда + ИндексПолейРаздела = Новый Соответствие; + КонецЕсли; + + Для Каждого ПорядокГруппировки Из ПорядокГруппировок Цикл + + ПоискПоля.ПорядокРаздела = ПорядокРаздела; + ПоискПоля.ПорядокГруппировки = ПорядокГруппировки; + ПоляГруппировки = ИндексСтруктурыОтчета.НайтиСтроки(ПоискПоля); + + ИндексПолейГруппировки = ИндексПолейРаздела[ПорядокГруппировки]; + Если ИндексПолейГруппировки = Неопределено Тогда + ИндексПолейГруппировки = Новый Соответствие; + КонецЕсли; + + Для Каждого ПолеГруппировки Из ПоляГруппировки Цикл + + СвойстваПоля = СтандартныеСвойстваПоляОтчета(); + ЗаполнитьЗначенияСвойств(СвойстваПоля, ПолеГруппировки); + + ИндексПолейГруппировки.Вставить(ПолеГруппировки.Поле, СвойстваПоля); + + КонецЦикла; + + ИндексПолейРаздела.Вставить(ПорядокГруппировки, ИндексПолейГруппировки); + + КонецЦикла; + + ИндексПолей.Вставить(ПорядокРаздела, ИндексПолейРаздела); + + КонецЦикла; + + Возврат ИндексПолей; + +КонецФункции + +Функция ОсновныеПоляОтчета(Форма) + + ОсновныеПоля = Новый Массив; + + ОтчетыПереопределяемый.ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля); + + // Локальное переопределение для отчета. + Если Форма.НастройкиОтчета.События.ПриОпределенииОсновныхПолей Тогда + + Отчет = ОтчетыСервер.ОтчетОбъект(Форма.НастройкиОтчета.ПолноеИмя); + Отчет.ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля); + + КонецЕсли; + + Возврат ОсновныеПоля; + +КонецФункции + +#Область Конструкторы + +Функция НовыйИндексСтруктурыОтчета() + + ОписаниеЧисла = Новый ОписаниеТипов("Число"); + ОписаниеСтроки = Новый ОписаниеТипов("Строка"); + ОписаниеПризнака = Новый ОписаниеТипов("Булево"); + ОписаниеПоля = Новый ОписаниеТипов("ПолеКомпоновкиДанных"); + ОписаниеТипов = Новый ОписаниеТипов("ОписаниеТипов"); + ОписаниеТипа = Новый ОписаниеТипов("Тип"); + ОписаниеИдентификатора = Новый ОписаниеТипов("УникальныйИдентификатор"); + + Индекс = Новый ТаблицаЗначений; + Индекс.Колонки.Добавить("ПорядокРаздела", ОписаниеЧисла); + Индекс.Колонки.Добавить("КоличествоРазделов", ОписаниеЧисла); + Индекс.Колонки.Добавить("ПорядокГруппировки", ОписаниеЧисла); + Индекс.Колонки.Добавить("ПорядокПоля", ОписаниеЧисла); + + Индекс.Колонки.Добавить("ИдентификаторНастроек"); + Индекс.Колонки.Добавить("ИдентификаторРаздела"); + Индекс.Колонки.Добавить("ИдентификаторГруппировки"); + Индекс.Колонки.Добавить("ИдентификаторПоля"); + + Индекс.Колонки.Добавить("Поле", ОписаниеПоля); + Индекс.Колонки.Добавить("ТипПоля", ОписаниеТипа); + Индекс.Колонки.Добавить("ИспользуетсяВПоляхГруппировки", ОписаниеПризнака); + + Индекс.Колонки.Добавить("ПредставлениеГруппировки", ОписаниеСтроки); + Индекс.Колонки.Добавить("ПредставлениеПоля", ОписаниеСтроки); + + Индекс.Колонки.Добавить("Период", ОписаниеПризнака); + Индекс.Колонки.Добавить("Измерение", ОписаниеПризнака); + Индекс.Колонки.Добавить("Ресурс", ОписаниеПризнака); + + Индекс.Колонки.Добавить("ТипЗначения", ОписаниеТипов); + Индекс.Колонки.Добавить("ПолеСортируется", ОписаниеПризнака); + Индекс.Колонки.Добавить("НаправлениеСортировки"); + + Индекс.Колонки.Добавить("ВставитьПолеСлева", ОписаниеПризнака); + Индекс.Колонки.Добавить("ВставитьПолеСправа", ОписаниеПризнака); + Индекс.Колонки.Добавить("ВставитьГруппировкуВыше", ОписаниеПризнака); + Индекс.Колонки.Добавить("ВставитьГруппировкуНиже", ОписаниеПризнака); + + Индекс.Колонки.Добавить("ПереместитьПолеВлево", ОписаниеПризнака); + Индекс.Колонки.Добавить("ПереместитьПолеВправо", ОписаниеПризнака); + Индекс.Колонки.Добавить("ПереместитьПолеВыше", ОписаниеПризнака); + Индекс.Колонки.Добавить("ПереместитьПолеНиже", ОписаниеПризнака); + + Индекс.Колонки.Добавить("ИдентификаторИндекса", ОписаниеИдентификатора); + + Возврат Индекс; + +КонецФункции + +Функция СтандартныеСвойстваПоляОтчета() + + Индекс = Новый Структура; + Индекс.Вставить("ПорядокПоля", 0); + Индекс.Вставить("ИдентификаторПоля", Неопределено); + Индекс.Вставить("ПредставлениеПоля", ""); + + Индекс.Вставить("ПолеСортируется", Ложь); + Индекс.Вставить("НаправлениеСортировки", Неопределено); + + Индекс.Вставить("Ресурс", Ложь); + Индекс.Вставить("ТипЗначения", Неопределено); + Индекс.Вставить("ТипПоля", Неопределено); + + Индекс.Вставить("ИдентификаторНастроек", Неопределено); + Индекс.Вставить("ИдентификаторРаздела", Неопределено); + Индекс.Вставить("ИдентификаторГруппировки", Неопределено); + + Индекс.Вставить("ИдентификаторИндекса", Неопределено); + + Возврат Индекс; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область ИнициализацияСвойствЗаголовковТаблиц + +Процедура ОпределитьИерархиюЗаголовковОтчета(РазрезСвойствЗаголовков, Заголовки) + + РазрезСвойствЗаголовков.Свернуть("Верх, Лево, Низ, Право, Имя, Расшифровка"); + РазрезСвойствЗаголовков.Сортировать("Верх, Лево"); + РазрезСвойствЗаголовков.Индексы.Добавить("Верх, Низ, Лево"); + + Для Каждого Запись Из РазрезСвойствЗаголовков Цикл + + Если Запись.Расшифровка <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Верх = Запись.Низ + 1; + НайденныеОбласти = РазрезСвойствЗаголовков.НайтиСтроки(Новый Структура("Верх, Лево", Верх, Запись.Лево)); + + Пока НайденныеОбласти.Количество() > 0 Цикл + + СвойстваОбласти = Заголовки[Запись.Имя]; + СвойстваОбласти.КоличествоДочернихЗаголовков = СвойстваОбласти.КоличествоДочернихЗаголовков + 1; + + Верх = Верх + 1; + НайденныеОбласти = РазрезСвойствЗаголовков.НайтиСтроки(Новый Структура("Верх, Лево", Верх, Запись.Лево)); + + КонецЦикла; + + Низ = Запись.Верх - 1; + НайденныеОбласти = РазрезСвойствЗаголовков.НайтиСтроки(Новый Структура("Низ, Лево", Низ, Запись.Лево)); + + Пока НайденныеОбласти.Количество() > 0 Цикл + + СвойстваОбласти = Заголовки[Запись.Имя]; + СвойстваОбласти.КоличествоРодительскихЗаголовков = СвойстваОбласти.КоличествоРодительскихЗаголовков + 1; + + Низ = Низ - 1; + НайденныеОбласти = РазрезСвойствЗаголовков.НайтиСтроки(Новый Структура("Низ, Лево", Низ, Запись.Лево)); + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция ГраницыРазделовОтчета(РезультатОтчета, РазрезСвойствЗаголовков) + + Границы = Новый СписокЗначений; + + ВерхниеГраницы = РазрезСвойствЗаголовков.Скопировать(); + ВерхниеГраницы.Свернуть("Верх"); + ВерхниеГраницы.Сортировать("Верх"); + + Для Каждого Запись Из ВерхниеГраницы Цикл + + Индекс = ВерхниеГраницы.Индекс(Запись); + + Если Индекс = 0 Тогда + Продолжить; + КонецЕсли; + + Если (Запись.Верх - ВерхниеГраницы[Индекс - 1].Верх) > 1 Тогда + Границы.Добавить(Запись.Верх); + КонецЕсли; + + КонецЦикла; + + Границы.Добавить(РезультатОтчета.ВысотаТаблицы); + + Возврат Границы; + +КонецФункции + +Процедура ДополнитьСвойстваЗаголовковОтчета(Форма, РезультатОтчета, Заголовки, РазрезСвойствЗаголовков, ИндексСтруктурыОтчета, ГраницыРазделов) + + ИндексСтруктурыОтчета.Индексы.Добавить("ПорядокРаздела, ПредставлениеПоля"); + + ПорядокРаздела = 1; + ГраницаТекущегоРаздела = 0; + ОбработанныеПоля = Новый Соответствие; + + Для Каждого Граница Из ГраницыРазделов Цикл + + Для Каждого Запись Из РазрезСвойствЗаголовков Цикл + + СвойстваЗаголовка = Заголовки[Запись.Имя]; + + Если СвойстваЗаголовка.Верх >= ГраницаТекущегоРаздела + И СвойстваЗаголовка.Верх <= Граница.Значение Тогда + + ИндексПоля = ИндексПоляПоСвойствамЗаголовка( + Форма, СвойстваЗаголовка, ИндексСтруктурыОтчета, ПорядокРаздела, ОбработанныеПоля); + + Если ИндексПоля = Неопределено Тогда + Продолжить; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(СвойстваЗаголовка, ИндексПоля); + + ЭтоЧисло = СвойстваЗаголовка.ТипЗначения.СодержитТип(Тип("Число")); + СвойстваЗаголовка.ОформитьОтрицательные = ЭтоЧисло; + СвойстваЗаголовка.ОформитьПоложительные = ЭтоЧисло; + + ВставитьИндикаторСортировки(ИндексПоля, СвойстваЗаголовка, РезультатОтчета.Область(Запись.Имя)); + + КонецЕсли; + + КонецЦикла; + + ПорядокРаздела = ПорядокРаздела + 1; + ГраницаТекущегоРаздела = Граница.Значение; + + КонецЦикла; + +КонецПроцедуры + +Функция ИндексПоляПоСвойствамЗаголовка(Форма, СвойстваЗаголовка, ИндексСтруктурыОтчета, ПорядокРаздела, ОбработанныеПоля) + + Поиск = Новый Структура("ПорядокРаздела, ПредставлениеПоля", ПорядокРаздела, ВРег(СвойстваЗаголовка.Текст)); + + ИндексПоля = ИндексПоляПоПредставлению(ИндексСтруктурыОтчета, Поиск, ОбработанныеПоля); + + Если ИндексПоля = Неопределено Тогда + ИндексПоля = ИндексПоляПоРасшифровке(Форма, СвойстваЗаголовка.Расшифровка, ИндексСтруктурыОтчета, Поиск, ОбработанныеПоля); + КонецЕсли; + + Возврат ИндексПоля; + +КонецФункции + +Функция ИндексПоляПоРасшифровке(Форма, Расшифровка, ИндексСтруктурыОтчета, Поиск, ОбработанныеПоля) + + Если ТипЗнч(Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда + Возврат Неопределено; + КонецЕсли; + + Данные = ДанныеЭлементаРасшифровки(Форма, Расшифровка); + + Если Данные = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ПоискПоПолю = Новый Структура; + ПоискПоПолю.Вставить("ПорядокРаздела", Поиск.ПорядокРаздела); + ПоискПоПолю.Вставить("Поле", Новый ПолеКомпоновкиДанных(Данные.Поле)); + + НайденныеПоля = ИндексСтруктурыОтчета.НайтиСтроки(ПоискПоПолю); + + Если НайденныеПоля.Количество() > 0 Тогда + Возврат НайденныеПоля[0]; + КонецЕсли; + + Поиск.ПредставлениеПоля = ВРег(Данные.Поле); + + Возврат ИндексПоляПоПредставлению(ИндексСтруктурыОтчета, Поиск, ОбработанныеПоля); + +КонецФункции + +Функция ИндексПоляПоПредставлению(ИндексСтруктурыОтчета, Поиск, ОбработанныеПоля) + + НайденныеПоля = ИндексСтруктурыОтчета.НайтиСтроки(Поиск); + + ПодходящееПоле = ИндексПоляНеобработанный( + ИндексСтруктурыОтчета, Поиск.ПредставлениеПоля, НайденныеПоля, ОбработанныеПоля); + + Если ПодходящееПоле <> Неопределено Тогда + Возврат ПодходящееПоле; + КонецЕсли; + + ОбластьВладельцаСРеквизитами = СтрНайти(Поиск.ПредставлениеПоля, ",") > 0; + + Если ОбластьВладельцаСРеквизитами Тогда + Поиск.ПредставлениеПоля = СтрРазделить(Поиск.ПредставлениеПоля, ",")[0]; + КонецЕсли; + + ОписаниеЗаголовка = СтрРазделить(Поиск.ПредставлениеПоля, "."); + + ПоискРаздела = Новый Структура("ПорядокРаздела", Поиск.ПорядокРаздела); + НайденныеПоля = ИндексСтруктурыОтчета.НайтиСтроки(ПоискРаздела); + + Для Каждого ИндексПоля Из НайденныеПоля Цикл + + ОписаниеПредставления = СтрРазделить(ИндексПоля.ПредставлениеПоля, "."); + + КоличествоСовпадений = 0; + + Для Каждого Фрагмент Из ОписаниеЗаголовка Цикл + + НормализованныйФрагмент = СокрЛП(Фрагмент); + + Если ОписаниеПредставления.Найти(НормализованныйФрагмент) <> Неопределено Тогда + КоличествоСовпадений = КоличествоСовпадений + 1; + КонецЕсли; + + КонецЦикла; + + Если ОбластьВладельцаСРеквизитами + И КоличествоСовпадений = ОписаниеПредставления.Количество() + Или Не ОбластьВладельцаСРеквизитами + И КоличествоСовпадений = ОписаниеЗаголовка.Количество() Тогда + + Возврат ИндексПоля; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция ИндексПоляНеобработанный(ИндексСтруктурыОтчета, ПредставлениеПоля, НайденныеПоля, ОбработанныеПоля) + + Если НайденныеПоля.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Если НайденныеПоля.Количество() = 1 Тогда + Возврат НайденныеПоля[0]; + КонецЕсли; + + ОбработанныеИндексы = ОбработанныеПоля[ПредставлениеПоля]; + + Если ОбработанныеИндексы = Неопределено Тогда + + ПодходящееПоле = НайденныеПоля[0]; + + ОбработанныеИндексы = Новый Соответствие; + ОбработанныеИндексы.Вставить(ИндексСтруктурыОтчета.Индекс(ПодходящееПоле), ПодходящееПоле); + + ОбработанныеПоля.Вставить(ПредставлениеПоля, ОбработанныеИндексы); + + Возврат ПодходящееПоле; + + КонецЕсли; + + ПодходящееПоле = Неопределено; + + Для Каждого НайденноеПоле Из НайденныеПоля Цикл + + ИндексПоля = ИндексСтруктурыОтчета.Индекс(НайденноеПоле); + + Если ОбработанныеИндексы[ИндексПоля] = Неопределено Тогда + + ПодходящееПоле = НайденноеПоле; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если ПодходящееПоле = Неопределено Тогда + Возврат НайденныеПоля[0]; + КонецЕсли; + + ОбработанныеИндексы.Вставить(ИндексПоля, ПодходящееПоле); + ОбработанныеПоля.Вставить(ПредставлениеПоля, ОбработанныеИндексы); + + Возврат ПодходящееПоле; + +КонецФункции + +Процедура ВставитьИндикаторСортировки(ИндексПоля, СвойстваЗаголовка, Ячейка) + + Если Не ИндексПоля.ПолеСортируется Тогда + Возврат; + КонецЕсли; + + Если ИндексПоля.НаправлениеСортировки = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда + + СвойстваЗаголовка.СортироватьПоВозрастанию = Ложь; + Ячейка.Картинка = БиблиотекаКартинок.СортироватьСтрокиПоВозрастанию; + + ИначеЕсли ИндексПоля.НаправлениеСортировки = НаправлениеСортировкиКомпоновкиДанных.Убыв Тогда + + СвойстваЗаголовка.СортироватьПоУбыванию = Ложь; + Ячейка.Картинка = БиблиотекаКартинок.СортироватьСтрокиПоУбыванию; + + КонецЕсли; + + Ячейка.РазмерКартинки = РазмерКартинки.РеальныйРазмер; + Ячейка.ГоризонтальноеПоложениеКартинки = ГоризонтальноеПоложение.Право; + Ячейка.ВертикальноеПоложениеКартинки = ВертикальноеПоложение.Верх; + +КонецПроцедуры + +#Область Конструкторы + +Функция СтандартныйРазрезСвойствЗаголовковОтчета() + + ОписаниеЧисла = Новый ОписаниеТипов("Число"); + ОписаниеСтроки = Новый ОписаниеТипов("Строка"); + + Свойства = Новый ТаблицаЗначений; + Свойства.Колонки.Добавить("Верх", ОписаниеЧисла); + Свойства.Колонки.Добавить("Лево", ОписаниеЧисла); + Свойства.Колонки.Добавить("Низ", ОписаниеЧисла); + Свойства.Колонки.Добавить("Право", ОписаниеЧисла); + Свойства.Колонки.Добавить("Имя", ОписаниеСтроки); + Свойства.Колонки.Добавить("Расшифровка"); + + Возврат Свойства; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * ИдентификаторИндекса - УникальныйИдентификатор +// * ОформитьПоложительные - Булево +// * ОформитьОтрицательные - Булево +// * СортироватьПоУбыванию - Булево +// * СортироватьПоВозрастанию - Булево +// * ПереместитьПолеНиже - Булево +// * ПереместитьПолеВыше - Булево +// * ПереместитьПолеВправо - Булево +// * ПереместитьПолеВлево - Булево +// * ВставитьГруппировкуНиже - Булево +// * ВставитьГруппировкуВыше - Булево +// * ВставитьПолеСправа - Булево +// * ВставитьПолеСлева - Булево +// * ИспользуетсяВПоляхГруппировки - Булево +// * ТипПоля - Тип +// * ТипЗначения - ОписаниеТипов +// * Ресурс - Булево +// * Измерение - Булево +// * Период - Булево +// * НаправлениеСортировки - НаправлениеСортировкиКомпоновкиДанных +// - Неопределено +// * ПолеСортируется - Булево +// * Поле - ПолеКомпоновкиДанных +// * ИдентификаторПоля - ИдентификаторКомпоновкиДанных +// * ИдентификаторГруппировки - ИдентификаторКомпоновкиДанных +// * ИдентификаторРаздела - ИдентификаторКомпоновкиДанных +// * ИдентификаторНастроек - ИдентификаторКомпоновкиДанных +// * ПорядокПоля - Число +// * ПорядокГруппировки - Число +// * ПорядокРаздела - Число +// * КоличествоРодительскихЗаголовков - Число +// * КоличествоДочернихЗаголовков - Число +// * Расшифровка - ИдентификаторРасшифровкиКомпоновкиДанных +// - Неопределено +// * Право - Число +// * Лево - Число +// * Низ - Число +// * Верх - Число +// * Текст - Строка +// +Функция СтандартныеСвойстваЗаголовкаОтчета() Экспорт + + Свойства = Новый Структура; + Свойства.Вставить("Текст", ""); + Свойства.Вставить("Верх", 0); + Свойства.Вставить("Низ", 0); + Свойства.Вставить("Лево", 0); + Свойства.Вставить("Право", 0); + Свойства.Вставить("Расшифровка", Неопределено); + + Свойства.Вставить("КоличествоДочернихЗаголовков", 0); + Свойства.Вставить("КоличествоРодительскихЗаголовков", 0); + + Свойства.Вставить("ПорядокРаздела", 0); + Свойства.Вставить("КоличествоРазделов", 0); + Свойства.Вставить("ПорядокГруппировки", 0); + Свойства.Вставить("ПорядокПоля", 0); + + Свойства.Вставить("ИдентификаторНастроек", Неопределено); + Свойства.Вставить("ИдентификаторРаздела", Неопределено); + Свойства.Вставить("ИдентификаторГруппировки", Неопределено); + Свойства.Вставить("ИдентификаторПоля", Неопределено); + + Свойства.Вставить("Поле", Неопределено); + Свойства.Вставить("ПолеСортируется", Ложь); + Свойства.Вставить("НаправлениеСортировки", Неопределено); + + Свойства.Вставить("Период", Ложь); + Свойства.Вставить("Измерение", Ложь); + Свойства.Вставить("Ресурс", Ложь); + + Свойства.Вставить("ТипЗначения", Неопределено); + Свойства.Вставить("ТипПоля", Неопределено); + Свойства.Вставить("ИспользуетсяВПоляхГруппировки", Ложь); + + Свойства.Вставить("ВставитьПолеСлева", Ложь); + Свойства.Вставить("ВставитьПолеСправа", Ложь); + Свойства.Вставить("ВставитьГруппировкуВыше", Ложь); + Свойства.Вставить("ВставитьГруппировкуНиже", Ложь); + + Свойства.Вставить("ПереместитьПолеВлево", Ложь); + Свойства.Вставить("ПереместитьПолеВправо", Ложь); + Свойства.Вставить("ПереместитьПолеВыше", Ложь); + Свойства.Вставить("ПереместитьПолеНиже", Ложь); + + Свойства.Вставить("СортироватьПоВозрастанию", Истина); + Свойства.Вставить("СортироватьПоУбыванию", Истина); + + Свойства.Вставить("ОформитьОтрицательные", Ложь); + Свойства.Вставить("ОформитьПоложительные", Ложь); + + Свойства.Вставить("ИдентификаторИндекса", Неопределено); + + Возврат Свойства; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область ДанныеЭлементаРасшифровки + +Функция ДанныеЭлементаРасшифровки(Форма, Расшифровка) Экспорт + + Если Не РежимВариантаОтчета(Форма.КлючТекущегоВарианта) + Или Не Форма.НастройкиОтчета.РазрешеноИзменятьВарианты + Или Не ТипЗнч(Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда + + Возврат Неопределено; + КонецЕсли; + + Отчет = Форма.Отчет; + Данные = ПолучитьИзВременногоХранилища(Форма.ОтчетДанныеРасшифровки); + ЭлементРасшифровки = Данные.Элементы.Получить(Расшифровка); + + Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда + ТипЭлементаРасшифровки = ТипГруппировка(); + Иначе + ТипЭлементаРасшифровки = ТипРеквизит(); + КонецЕсли; + + ДанныеЭлементаРасшифровки = Новый Структура; + ДанныеЭлементаРасшифровки.Вставить("Тип", ТипЭлементаРасшифровки); + ДанныеЭлементаРасшифровки.Вставить("Настройки", Данные.Настройки); + ДанныеЭлементаРасшифровки.Вставить("Отбор", ОтборЭлементаРасшифровки(ЭлементРасшифровки)); + + Поля = ЭлементРасшифровки.ПолучитьПоля(); + + Если Поля.Количество() = 0 Тогда + + ДанныеЭлементаРасшифровки.Вставить("Значение", Неопределено); + ДанныеЭлементаРасшифровки.Вставить("Поле", ""); + + Иначе + + СвойстваПоля = Поля[0]; + + ДанныеЭлементаРасшифровки.Вставить("Значение", ?(СвойстваПоля.Значение = Null, Неопределено, СвойстваПоля.Значение)); + ДанныеЭлементаРасшифровки.Вставить("Поле", СвойстваПоля.Поле); + + КонецЕсли; + + ДанныеЭлементаРасшифровки.Вставить("ЭтоСсылка", ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ДанныеЭлементаРасшифровки.Значение))); + + ДоступныеВидыСравнения = Новый СписокЗначений; + + Если ЗначениеЗаполнено(ДанныеЭлементаРасшифровки.Поле) Тогда + + ДоступноеПоле = Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.НайтиПоле( + Новый ПолеКомпоновкиДанных(ДанныеЭлементаРасшифровки.Поле)); + + Если ДоступноеПоле = Неопределено Тогда + + ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", Тип("Неопределено")); + ДанныеЭлементаРасшифровки.Вставить("Ресурс", Ложь); + + Иначе + + ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", ДоступноеПоле.ТипЗначения); + ДанныеЭлементаРасшифровки.Вставить("Ресурс", ДоступноеПоле.Ресурс); + + Если ДанныеЭлементаРасшифровки.Значение = Неопределено Тогда + + Область = Форма.ОтчетТабличныйДокумент.ТекущаяОбласть; + ДанныеЭлементаРасшифровки.Значение = ДоступноеПоле.ТипЗначения.ПривестиЗначение(Область.Текст); + + КонецЕсли; + + КонецЕсли; + + ДоступноеПолеОтбора = Отчет.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.НайтиПоле( + Новый ПолеКомпоновкиДанных(ДанныеЭлементаРасшифровки.Поле)); + + Если ДоступноеПолеОтбора <> Неопределено Тогда + ДоступныеВидыСравнения = ДоступноеПолеОтбора.ДоступныеВидыСравнения; + КонецЕсли; + + Иначе + + ДанныеЭлементаРасшифровки.Вставить("ТипЗначения", Тип("Неопределено")); + ДанныеЭлементаРасшифровки.Вставить("Ресурс", Ложь); + + КонецЕсли; + + Если ДоступныеВидыСравнения.Количество() = 0 Тогда + + Для Каждого Вид Из ВидСравненияКомпоновкиДанных Цикл + ДоступныеВидыСравнения.Добавить(Вид); + КонецЦикла; + + КонецЕсли; + + Если ДоступныеВидыСравнения.НайтиПоЗначению("СнятьФильтр") = Неопределено Тогда + ДоступныеВидыСравнения.Вставить(0, "СнятьФильтр", НСтр("ru = 'Снять фильтр'")); + КонецЕсли; + + Если ДоступныеВидыСравнения.НайтиПоЗначению("ФильтроватьЕще") = Неопределено Тогда + ДоступныеВидыСравнения.Добавить("ФильтроватьЕще", НСтр("ru = 'Еще...'")); + КонецЕсли; + + ДанныеЭлементаРасшифровки.Вставить("ДоступныеВидыСравнения", ДоступныеВидыСравнения); + + Возврат ДанныеЭлементаРасшифровки; + +КонецФункции + +Функция ОтборЭлементаРасшифровки(ЭлементРасшифровки, Результат = Неопределено) + + Если Результат = Неопределено Тогда + Результат = Новый Соответствие; + КонецЕсли; + + Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда + + Поля = ЭлементРасшифровки.ПолучитьПоля(); + + Для каждого Поле Из Поля Цикл + + Если Поле.Значение <> Null Тогда + Результат.Вставить(Поле.Поле, Поле.Значение); + КонецЕсли; + + КонецЦикла; + КонецЕсли; + + Родители = ЭлементРасшифровки.ПолучитьРодителей(); + + Для Каждого Родитель Из Родители Цикл + ОтборЭлементаРасшифровки(Родитель, Результат); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ТипГруппировка() + + Возврат "Группировка"; + +КонецФункции + +Функция ТипРеквизит() + + Возврат "Реквизит"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебный/ВариантыОтчетовСлужебный.mdo b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/ВариантыОтчетовСлужебный.mdo new file mode 100644 index 000000000..6db6658db --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебный/ВариантыОтчетовСлужебный.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетовСлужебный + + ru + Варианты отчетов служебный + + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl new file mode 100644 index 000000000..4bd23e025 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/Module.bsl @@ -0,0 +1,3358 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Элемент - ПолеФормы +// - РасширениеПоляФормыДляПоляТабличногоДокумента +// Область - ОбластьЯчеекТабличногоДокумента +// +Процедура ПоказатьКонтекстнуюНастройкуОтчета(Форма, Элемент, Область, СтандартнаяОбработка) Экспорт + + Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") + Или Область.ТипОбласти <> ТипОбластиЯчеекТабличногоДокумента.Прямоугольник + Или Область.Расшифровка <> Неопределено + И ТипЗнч(Область.Расшифровка) <> Тип("ИдентификаторРасшифровкиКомпоновкиДанных") Тогда + + Возврат; + КонецЕсли; + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + + Заголовки = СвойстваРезультата.Заголовки; + + Область = Элемент.ТекущаяОбласть; // ОбластьЯчеекТабличногоДокумента + СвойстваЗаголовка = Заголовки[Область.Имя]; // + + Если ТипЗнч(СвойстваЗаголовка) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + КомпоновщикНастроек = Форма.Отчет.КомпоновщикНастроек; + + КэшЗначенийОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства, "КэшЗначенийОтборов", Новый Соответствие); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + ПараметрыФормы.Вставить("КомпоновщикНастроек", КомпоновщикНастроек); + ПараметрыФормы.Вставить("ДанныеРасшифровки", Форма.ОтчетДанныеРасшифровки); + ПараметрыФормы.Вставить("Документ", Форма.ОтчетТабличныйДокумент); + ПараметрыФормы.Вставить("Заголовки", Заголовки); + ПараметрыФормы.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); + ПараметрыФормы.Вставить("КэшЗначенийОтборов", КэшЗначенийОтборов); + + ОткрытьФорму( + "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.КонтекстнаяНастройкаОтчета", + ПараметрыФормы, + Форма, + Форма.УникальныйИдентификатор); + + СтандартнаяОбработка = Ложь + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Элемент - ПолеФормы +// - РасширениеПоляФормыДляПоляТабличногоДокумента +// Расшифровка - ИдентификаторКомпоновкиДанных +// СтандартнаяОбработка - Булево +// +Процедура ОбработкаРасшифровки(Форма, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + ТекущаяОбласть = Элемент.ТекущаяОбласть; // ОбластьЯчеекТабличногоДокумента + + Заголовки = СвойстваРезультата.Заголовки[ТекущаяОбласть.Имя]; + + Если ТипЗнч(Заголовки) = Тип("Структура") Тогда + + СтандартнаяОбработка = Ложь; + Форма.Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость = Истина; + Возврат; + + КонецЕсли; + +КонецПроцедуры + +Процедура ОбработкаДополнительнойРасшифровки(Форма, Данные, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт + + Если Данные = Неопределено Тогда + Возврат; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных( + Форма.ОтчетДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Форма.НастройкиОтчета.АдресСхемы)); + + ОсновноеМеню = Новый Массив; + + СвойстваОбласти = СвойстваОбластиРасшифровки(Форма, Элемент.ТекущаяОбласть, Данные.Поле); + + Если СвойстваОбласти.ЭтоЗаголовок Тогда + ДополнительноеМеню = КонтекстноеМенюОбластиЗаголовка(); + Иначе + ОсновноеМеню.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать); + ДополнительноеМеню = КонтекстноеМенюОбластиДанных(Данные.ДоступныеВидыСравнения); + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Форма", Форма); + ДополнительныеПараметры.Вставить("Данные", Данные); + ДополнительныеПараметры.Вставить("Расшифровка", Расшифровка); + ДополнительныеПараметры.Вставить("ОбработкаРасшифровки", ОбработкаРасшифровки); + ДополнительныеПараметры.Вставить("СвойстваОбласти", СвойстваОбласти); + ДополнительныеПараметры.Вставить("Меню", ДополнительноеМеню); + + Обработчик = Новый ОписаниеОповещения("ВыполнитьРасшифровку", ЭтотОбъект, ДополнительныеПараметры); + ОбработкаРасшифровки.ПоказатьВыборДействия(Обработчик, Расшифровка, ОсновноеМеню, ДополнительноеМеню); + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Элемент - ПолеФормы +// - РасширениеПоляФормыДляПоляТабличногоДокумента +// +Процедура ПриАктивизацииРезультатаОтчета(Форма, Элемент) Экспорт + + Область = Элемент.ТекущаяОбласть; // ОбластьЯчеекТабличногоДокумента + + Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда + Возврат; + КонецЕсли; + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + Элементы = Форма.Элементы; + + Заголовки = СвойстваРезультата.Заголовки[Область.Имя]; + Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость = (ТипЗнч(Заголовки) = Тип("Структура")); + Элементы.КонтекстноеМенюОбластиДанных.Видимость = Не Элементы.КонтекстноеМенюОбластиЗаголовка.Видимость + И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник + И ТипЗнч(Область.Расшифровка) = Тип("ИдентификаторРасшифровкиКомпоновкиДанных"); + + ВариантыОтчетовСлужебныйКлиентСервер.ОпределитьДоступностьДействийКонтекстногоМеню(Форма, Заголовки); + +КонецПроцедуры + +Функция ЭтоСобытиеКонтекстнойНастройки(Событие) Экспорт + + События = СобытияКонтекстнойНастройки(); + + Возврат События[Событие] = Истина; + +КонецФункции + +#Область ОбработчикиКомандКонтекстногоМенюТабличногоДокументаРезультатОтчета + +#Область ВставкаПоляИлиГруппировки + +Процедура ВставитьПолеСлева(Форма, Команда) Экспорт + + ВыбратьПолеОтчетаИзМеню(Форма, Команда); + +КонецПроцедуры + +Процедура ВставитьПолеСправа(Форма, Команда) Экспорт + + ВыбратьПолеОтчетаИзМеню(Форма, Команда); + +КонецПроцедуры + +Процедура ВставитьГруппировкуВыше(Форма, Команда) Экспорт + + ВыбратьПолеОтчетаИзМеню(Форма, Команда); + +КонецПроцедуры + +Процедура ВставитьГруппировкуНиже(Форма, Команда) Экспорт + + ВыбратьПолеОтчетаИзМеню(Форма, Команда); + +КонецПроцедуры + +#КонецОбласти + +#Область ПеремещениеПоля + +Процедура ПереместитьПолеВлево(Форма, Команда) Экспорт + + ПереместитьПолеГоризонтально(Форма, Команда); + +КонецПроцедуры + +Процедура ПереместитьПолеВправо(Форма, Команда) Экспорт + + ПереместитьПолеГоризонтально(Форма, Команда); + +КонецПроцедуры + +Процедура ПереместитьПолеВыше(Форма, Команда) Экспорт + + ПереместитьПолеВертикально(Форма, Команда); + +КонецПроцедуры + +Процедура ПереместитьПолеНиже(Форма, Команда) Экспорт + + ПереместитьПолеВертикально(Форма, Команда); + +КонецПроцедуры + +#КонецОбласти + +#Область Оформление + +Процедура ОформитьКрасным(Форма, Команда, СвойстваЗаголовка = Неопределено, Значение = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + ДействиеКоманды = ДействиеКоманды(Команда); + + ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды); + ПараметрыРаскраски.Условие.ЛевоеЗначение = СвойстваЗаголовка.Поле; + + Если ДействиеКоманды = "ОформитьОтрицательные" Тогда + + Если Не ДействиеНадПолемДоступно(ДействиеКоманды, СвойстваЗаголовка) Тогда + Возврат; + КонецЕсли; + + ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; + ПараметрыРаскраски.Условие.ПравоеЗначение = 0; + + Иначе + + ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ПараметрыРаскраски.Условие.ПравоеЗначение = Значение; + + КонецЕсли; + + ЭлементыСтиля = СтандартныеПодсистемыКлиент.ЭлементыСтиля(); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветТекста"; + Оформление.Значение = ЭлементыСтиля.ЦветТекстаОтрицательногоЗначения; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветФона"; + Оформление.Значение = ЭлементыСтиля.ЦветФонаОтрицательногоЗначения; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Процедура ОформитьЗеленым(Форма, Команда, СвойстваЗаголовка = Неопределено, Значение = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + ДействиеКоманды = ДействиеКоманды(Команда); + + ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды); + ПараметрыРаскраски.Условие.ЛевоеЗначение = СвойстваЗаголовка.Поле; + + Если ДействиеКоманды = "ОформитьПоложительные" Тогда + + Если Не ДействиеНадПолемДоступно(ДействиеКоманды, СвойстваЗаголовка) Тогда + Возврат; + КонецЕсли; + + ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; + ПараметрыРаскраски.Условие.ПравоеЗначение = 0; + + Иначе + + ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ПараметрыРаскраски.Условие.ПравоеЗначение = Значение; + + КонецЕсли; + + ЭлементыСтиля = СтандартныеПодсистемыКлиент.ЭлементыСтиля(); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветТекста"; + Оформление.Значение = ЭлементыСтиля.ЦветТекстаПоложительногоЗначения; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветФона"; + Оформление.Значение = ЭлементыСтиля.ЦветФонаПоложительногоЗначения; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Команда - КомандаФормы +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// ВысотаСтроки - Число +// - Неопределено +// ПараметрыВысотыСтроки - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Процедура УстановитьВысотуСтроки(Форма, Команда, СвойстваЗаголовка = Неопределено, + ВысотаСтроки = Неопределено, ПараметрыВысотыСтроки = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + Если ВысотаСтроки = Неопределено Тогда + + ПараметрыВысотыСтроки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Форма", Форма); + ПараметрыОбработчика.Вставить("Команда", Команда); + ПараметрыОбработчика.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); + ПараметрыОбработчика.Вставить("ПараметрыРазмераПоля", ПараметрыВысотыСтроки); + + Обработчик = Новый ОписаниеОповещения("ПослеВводаВысотыСтрокиОтчета", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьВводЧисла(Обработчик, ПараметрыВысотыСтроки.Размер, НСтр("ru = 'Высота строки'"), 5); + + Возврат; + + КонецЕсли; + + Если ПараметрыВысотыСтроки = Неопределено + Или ПараметрыВысотыСтроки.Элемент = Неопределено Тогда + + ДобавитьПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, ВысотаСтроки); + Иначе + ОбновитьПараметрыРазмера(ПараметрыВысотыСтроки, ВысотаСтроки); + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Команда - КомандаФормы +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// ШиринаКолонки - Число +// - Неопределено +// ПараметрыШириныКолонки - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Процедура УстановитьШиринуКолонки(Форма, Команда, СвойстваЗаголовка = Неопределено, + ШиринаКолонки = Неопределено, ПараметрыШириныКолонки = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + Если ШиринаКолонки = Неопределено Тогда + + ПараметрыШириныКолонки = ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, "Ширина"); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Форма", Форма); + ПараметрыОбработчика.Вставить("Команда", Команда); + ПараметрыОбработчика.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); + ПараметрыОбработчика.Вставить("ПараметрыРазмераПоля", ПараметрыШириныКолонки); + + Обработчик = Новый ОписаниеОповещения("ПослеВводаШириныКолонкиОтчета", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьВводЧисла(Обработчик, ПараметрыШириныКолонки.Размер, НСтр("ru = 'Ширина колонки'"), 5); + + Возврат; + + КонецЕсли; + + Если ПараметрыШириныКолонки = Неопределено + Или ПараметрыШириныКолонки.Элемент = Неопределено Тогда + + ДобавитьПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, ШиринаКолонки, "Ширина"); + Иначе + ОбновитьПараметрыРазмера(ПараметрыШириныКолонки, ШиринаКолонки); + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Процедура ОформитьЕще(Форма, Команда, СвойстваЗаголовка = Неопределено, Значение = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + ИспользуемыеНастройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + Раздел = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + ИдентификаторГруппировки = ИспользуемыеНастройки.ПолучитьИдентификаторПоОбъекту(Группировка); + ИдентификаторОформления = ИдентификаторЭлементаОформленияГруппировкиОтчета(Группировка, СвойстваЗаголовка.Поле); + + ПараметрыОформления = Новый Структура; + ПараметрыОформления.Вставить("КомпоновщикНастроек", КомпоновщикНастроекОтчета(Форма)); + ПараметрыОформления.Вставить("НастройкиОтчета", Форма.НастройкиОтчета); + ПараметрыОформления.Вставить("ИдентификаторЭлементаСтруктурыНастроек", ИдентификаторГруппировки); + ПараметрыОформления.Вставить("ИдентификаторКД", ИдентификаторОформления); + ПараметрыОформления.Вставить("Наименование", ""); + ПараметрыОформления.Вставить("Поле", СвойстваЗаголовка.Поле); + ПараметрыОформления.Вставить("Условие", УсловиеОформленияГруппировкиОтчета(СвойстваЗаголовка.Поле, Значение)); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Форма", Форма); + ПараметрыОбработчика.Вставить("Раздел", Раздел); + ПараметрыОбработчика.Вставить("Группировка", Группировка); + ПараметрыОбработчика.Вставить("Поле", СвойстваЗаголовка.Поле); + ПараметрыОбработчика.Вставить("Ресурс", СвойстваЗаголовка.Ресурс); + ПараметрыОбработчика.Вставить("Действие", ДействиеКоманды(Команда)); + + Обработчик = Новый ОписаниеОповещения("ПослеИзмененияЭлементаОформленияГруппировкиОтчета", ЭтотОбъект, ПараметрыОбработчика); + + ОткрытьФорму("ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ЭлементУсловногоОформленияОтчета", + ПараметрыОформления, Форма, Форма.УникальныйИдентификатор,,, Обработчик); + +КонецПроцедуры + +#КонецОбласти + +#Область Фильтрация + +Процедура ПоказатьРасширеннуюНастройкуФильтра(Форма, СвойстваЗаголовка, ПравоеЗначение = Неопределено) Экспорт + + НастройкиОтчета = Форма.НастройкиОтчета; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("КлючТекущегоВарианта", Форма.КлючТекущегоВарианта); + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + ПараметрыФормы.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); + ПараметрыФормы.Вставить("ПравоеЗначение", ПравоеЗначение); + + ОткрытьФорму( + "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.РасширеннаяНастройкаФильтраОтчета", + ПараметрыФормы, + Форма, + Форма.УникальныйИдентификатор); + +КонецПроцедуры + +Процедура СнятьФильтр(Форма, СвойстваЗаголовка) Экспорт + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + Фильтры = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрыРазделаОтчета(Настройки, СвойстваЗаголовка); + Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле); + + Если Фильтр = Неопределено Тогда + + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'По полю ""%1"" отсутствуют фильтры'"), СвойстваЗаголовка.Текст); + + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + + КонецЕсли; + + Фильтры.Элементы.Удалить(Фильтр); + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, "СнятьФильтр"); + +КонецПроцедуры + +#КонецОбласти + +#Область ОстальныеДействия + +Процедура СкрытьПоле(Форма, Команда) Экспорт + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + + Если СвойстваЗаголовка.ИдентификаторНастроек = Неопределено Тогда + Возврат; + КонецЕсли; + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел); + + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек, СвойстваЗаголовка.Поле); + + Если ОписаниеПоля <> Неопределено + И ОписаниеПоля.Ресурс Тогда + + СкрытьВыбранноеПолеРаздела(Раздел, СвойстваЗаголовка.Поле); + + Иначе + + СкрытьВыбранноеПолеГруппировки(Группировка, СвойстваЗаголовка.Поле); + СкрытьГруппировку(Настройки, Группировка, СвойстваЗаголовка.Поле); + + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Процедура ПереименоватьПоле(Форма, Команда, Заголовок = "") Экспорт + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек, СвойстваЗаголовка.Поле); + + ПолеОтчета = ПолеОтчета(Группировка.Выбор, СвойстваЗаголовка.Поле); + + Если Не ЗначениеЗаполнено(Заголовок) Тогда + + ПараметрыОбработчика = Новый Структура("Форма, Команда", Форма, Команда); + Обработчик = Новый ОписаниеОповещения("ПослеВводаЗаголовкаПоляОтчета", ЭтотОбъект, ПараметрыОбработчика); + + ТекущийЗаголовок = ТекущийЗаголовокПоляОтчета(ПолеОтчета, ОписаниеПоля); + + ЗаголовокДиалога = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Заголовок поля: %1'"), + ?(ОписаниеПоля = Неопределено, Строка(ПолеОтчета), ОписаниеПоля.Заголовок)); + + ПоказатьВводСтроки(Обработчик, ТекущийЗаголовок, ЗаголовокДиалога); + + Возврат; + + КонецЕсли; + + Если ПолеОтчета = Неопределено Тогда + + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел); + ПолеОтчета = ПолеОтчета(Группировка.Выбор, СвойстваЗаголовка.Поле); + + КонецЕсли; + + Если ПолеОтчета <> Неопределено Тогда + УстановитьЗаголовокПоляОтчета(Заголовок, ПолеОтчета, ОписаниеПоля); + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Процедура Сортировать(Форма, Команда, СвойстваЗаголовка = Неопределено) Экспорт + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + Если Не ТипСортировкиРазделаДоступен(Команда, СвойстваЗаголовка) Тогда + Возврат; + КонецЕсли; + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + Если СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + + ЭлементыСортировки = Настройки.Порядок.Элементы; + + Иначе + + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") + И Раздел.Строки.Количество() = 1 Тогда + + ОсновнаяГруппировка = Раздел.Строки[0]; + ПолеГруппировки = ПолеОтчета(ОсновнаяГруппировка.ПоляГруппировки, СвойстваЗаголовка.Поле); + + Если СвойстваЗаголовка.Ресурс + Или ПолеГруппировки <> Неопределено Тогда + + Группировка = ОсновнаяГруппировка; + КонецЕсли; + + КонецЕсли; + + ЭлементыСортировки = Группировка.Порядок.Элементы; + + КонецЕсли; + + ЭлементСортировки = ЭлементСортировкиРаздела(ЭлементыСортировки, СвойстваЗаголовка.Поле); + + Если ЭлементСортировки = Неопределено Тогда + + Индекс = ИндексЭлементСортировкиРаздела(ЭлементыСортировки, СвойстваЗаголовка.Поле); + ЭлементСортировки = ЭлементыСортировки.Вставить(Индекс, Тип("ЭлементПорядкаКомпоновкиДанных")); + ЭлементСортировки.Поле = СвойстваЗаголовка.Поле; + + КонецЕсли; + + ЭлементСортировки.ТипУпорядочивания = ТипСортировкиРаздела(Команда); + ЭлементСортировки.Использование = Истина; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ВставкаПоля + +Процедура ВставитьПоле(КомпоновщикНастроек, Настройки, ВыбранноеПоле, Действие, СвойстваЗаголовка, РолиПолей) + + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел); + + ВставитьПолеВПоляГруппировки(Группировка.ПоляГруппировки, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей); + ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, СвойстваЗаголовка.Поле, Действие, РолиПолей) + +КонецПроцедуры + +Процедура ВставитьПолеВПоляГруппировки(Поля, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) + + Если ВыбранноеПоле.Ресурс Тогда + Возврат; + КонецЕсли; + + НайденноеТекущееПоле = ПолеОтчета(Поля, ТекущееПоле); + + Если НайденноеТекущееПоле = Неопределено Тогда + Возврат; + КонецЕсли; + + ТекущееПолеЯвляетсяПериодом = (РолиПолей.Периоды[ТекущееПоле] <> Неопределено); + ВыбранноеПолеЯвляетсяПериодом = (РолиПолей.Периоды[ВыбранноеПоле.Поле] <> Неопределено); + + Если ТекущееПолеЯвляетсяПериодом И Не ВыбранноеПолеЯвляетсяПериодом + Или Не ТекущееПолеЯвляетсяПериодом И ВыбранноеПолеЯвляетсяПериодом Тогда + + Возврат; + КонецЕсли; + + ИндексПоля = Поля.Элементы.Индекс(НайденноеТекущееПоле); + + Если Действие = "ВставитьПолеСправа" Тогда + ИндексПоля = ИндексПоля + 1; + КонецЕсли; + + НайденноеПоле = ПолеОтчета(Поля, ВыбранноеПоле.Поле); + ВставляемоеПоле = Неопределено; + + Если НайденноеПоле <> Неопределено Тогда + + Если Поля.Элементы.Индекс(НайденноеПоле) = ИндексПоля Тогда + + ВставляемоеПоле = НайденноеПоле; + ВставляемоеПоле.Использование = Истина; + + Иначе + Поля.Элементы.Удалить(НайденноеПоле); + КонецЕсли; + + КонецЕсли; + + Если ВставляемоеПоле <> Неопределено Тогда + Возврат; + КонецЕсли; + + ВставляемоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ПолеГруппировкиКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(ВставляемоеПоле, ВыбранноеПоле); + +КонецПроцедуры + +Процедура ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) + + Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") + И ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + Возврат; + КонецЕсли; + + Поля = Группировка.Выбор; + НайденноеТекущееПоле = ПолеОтчета(Поля, ТекущееПоле); + + Если НайденноеТекущееПоле = Неопределено Тогда + + ИндексПоля = 0; + + Иначе + + ИндексПоля = Поля.Элементы.Индекс(НайденноеТекущееПоле); + + Если Действие = "ВставитьПолеСправа" Тогда + ИндексПоля = ИндексПоля + 1; + КонецЕсли; + + КонецЕсли; + + НайденноеПоле = ПолеОтчета(Поля, ВыбранноеПоле.Поле); + ВставляемоеПоле = Неопределено; + ЗаголовокПоля = ВыбранноеПоле.Заголовок; + + Если НайденноеПоле <> Неопределено Тогда + + Если Поля.Элементы.Индекс(НайденноеПоле) = ИндексПоля Тогда + + ВставляемоеПоле = НайденноеПоле; + ВставляемоеПоле.Использование = Истина; + + Иначе + + ЗаголовокПоля = НайденноеПоле.Заголовок; + Поля.Элементы.Удалить(НайденноеПоле); + + КонецЕсли; + + КонецЕсли; + + Если ВставляемоеПоле = Неопределено Тогда + + ВставляемоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ВыбранноеПолеКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(ВставляемоеПоле, ВыбранноеПоле); + ВставляемоеПоле.Заголовок = ЗаголовокПоля; + + КонецЕсли; + + УстановитьВыводРеквизитовГруппировкиОтдельно(Группировка); + + ВставитьПолеВГруппировкиРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); + +КонецПроцедуры + +Процедура ВставитьПолеВГруппировкиРаздела(Родитель, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей) + + Если Не ВыбранноеПоле.Ресурс Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Родитель) = Тип("ТаблицаКомпоновкиДанных") Тогда + Группировки = Родитель.Строки; + Иначе + Группировки = Родитель.Структура; + КонецЕсли; + + Для Каждого Группировка Из Группировки Цикл + ВставитьПолеВГруппировкуРаздела(Группировка, ВыбранноеПоле, ТекущееПоле, Действие, РолиПолей); + КонецЦикла; + +КонецПроцедуры + +Процедура УстановитьВыводРеквизитовГруппировкиОтдельно(Группировка) + + Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") + И Не ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + Возврат; + КонецЕсли; + + ВыводРеквизитов = Группировка.ПараметрыВывода.Элементы.Найти("РасположениеРеквизитов"); + + Если Не ВыводРеквизитов.Использование Тогда + + ВыводРеквизитов.Значение = РасположениеРеквизитовКомпоновкиДанных.Отдельно; + ВыводРеквизитов.Использование = Истина; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ВставкаГруппировки + +// Параметры: +// Действие - НастройкиКомпоновкиДанных +// Действие - Строка +// Поле - ПолеКомпоновкиДанных +// - ДоступноеПолеКомпоновкиДанных +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Процедура ВставитьГруппировку(Настройки, Действие, Поле, СвойстваЗаголовка) + + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + КоллекцияГруппировок = КоллекцияГруппировокРаздела( + Раздел, Группировка, СвойстваЗаголовка.ИдентификаторГруппировки, Действие); + + ПеремещаемыеГруппировки = Новый Массив; + + Для Каждого Элемент Из КоллекцияГруппировок.Группировки Цикл + ПеремещаемыеГруппировки.Добавить(Элемент); + КонецЦикла; + + Если ТипЗнч(КоллекцияГруппировок.Группировки) = Тип("КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных") Тогда + + НоваяГруппировка = КоллекцияГруппировок.Группировки.Вставить( + КоллекцияГруппировок.ИндексГруппировки, Тип("ГруппировкаКомпоновкиДанных")); // ГруппировкаКомпоновкиДанных + + Иначе + + НоваяГруппировка = КоллекцияГруппировок.Группировки.Вставить(КоллекцияГруппировок.ИндексГруппировки); + + КонецЕсли; + + НовоеПоле = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + НовоеПоле.Поле = ?(ТипЗнч(Поле) = Тип("ПолеКомпоновкиДанных"), Поле, Поле.Поле); + НовоеПоле.Использование = Истина; + + НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + НоваяГруппировка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); + + Для Каждого Группировка Из ПеремещаемыеГруппировки Цикл + + ПоискЭлементов = Новый Соответствие; + ОтчетыКлиентСервер.СкопироватьРекурсивно( + Настройки, Группировка, НоваяГруппировка.Структура, КоллекцияГруппировок.ИндексГруппировки, ПоискЭлементов); + + КоллекцияГруппировок.Группировки.Удалить(Группировка); + + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// Раздел - НастройкиКомпоновкиДанных +// - НастройкиВложенногоОбъектаКомпоновкиДанных +// - ГруппировкаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных +// - ТаблицаКомпоновкиДанных +// - ГруппировкаТаблицыКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных +// - Неопределено +// Группировка - НастройкиКомпоновкиДанных +// - НастройкиВложенногоОбъектаКомпоновкиДанных +// - ГруппировкаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных +// - ТаблицаКомпоновкиДанных +// - ГруппировкаТаблицыКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных +// - Неопределено +// ИдентификаторГруппировки - ИдентификаторКомпоновкиДанных +// Действие - Строка +// +// Возвращаемое значение: +// Структура: +// * ИндексГруппировки - Число +// * Группировки - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных +// +Функция КоллекцияГруппировокРаздела(Раздел, Группировка, ИдентификаторГруппировки, Действие) + + Коллекция = Новый Структура; + Коллекция.Вставить("Группировки", Неопределено); + Коллекция.Вставить("ИндексГруппировки", 0); + + Если Действие = "ВставитьГруппировкуНиже" Тогда + + Коллекция.Группировки = Группировка.Структура; + + Возврат Коллекция; + + КонецЕсли; + + Родитель = Группировка.Родитель; // ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных + + Если Родитель <> Раздел Тогда + + Группировки = Родитель.Структура; // КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных, КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных + Коллекция.Группировки = Группировки; + Коллекция.ИндексГруппировки = Группировки.Индекс(Группировка); + + Возврат Коллекция; + + КонецЕсли; + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + Коллекция.Группировки = ?(СтрНайти(ИдентификаторГруппировки, "/row/") > 0, Раздел.Строки, Раздел.Колонки); + + Иначе + + Коллекция.Группировки = Раздел.Структура; + + КонецЕсли; + + Группировки = Коллекция.Группировки; // КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных, КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных + Коллекция.ИндексГруппировки = Группировки.Индекс(Группировка); + + Возврат Коллекция; + +КонецФункции + +#КонецОбласти + +#Область СкрытиеПоля + +Процедура СкрытьВыбранноеПолеРаздела(Раздел, Поле) + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + Группировки = Раздел.Строки; + + Иначе + + Группировки = Раздел.Структура; + СкрытьВыбранноеПолеГруппировки(Раздел, Поле); + + КонецЕсли; + + Для Каждого Группировка Из Группировки Цикл + + СкрытьВыбранноеПолеГруппировки(Группировка, Поле); + СкрытьВыбранноеПолеРаздела(Группировка, Поле); + + КонецЦикла; + +КонецПроцедуры + +Процедура СкрытьВыбранноеПолеГруппировки(Группировка, Поле) + + Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") + И ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + Возврат; + КонецЕсли; + + ПоляОтчета = ПолеОтчета(Группировка.Выбор, Поле); + + Если ПоляОтчета <> Неопределено Тогда + ПоляОтчета.Использование = Ложь; + КонецЕсли; + + ПоляОтчета = ПолеОтчета(Группировка.ПоляГруппировки, Поле); + + Если ПоляОтчета <> Неопределено Тогда + ПоляОтчета.Использование = Ложь; + КонецЕсли; + +КонецПроцедуры + +Процедура СкрытьГруппировку(Настройки, Группировка, Поле) + + Поля = Группировка.ПоляГруппировки; + + Если Поля.Элементы.Количество() = 0 + И Группировка.Структура.Количество() = 0 Тогда + + Возврат; + КонецЕсли; + + КоличествоИспользуемыхПолей = 0; + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если Элемент.Использование Тогда + КоличествоИспользуемыхПолей = КоличествоИспользуемыхПолей + 1; + КонецЕсли; + + КонецЦикла; + + Если КоличествоИспользуемыхПолей > 0 Тогда + Возврат; + КонецЕсли; + + Группировка.Использование = Ложь; + Группировки = Группировка.Родитель.Структура; + ИндексГруппировки = Группировки.Индекс(Группировка); + + Для Каждого ДочерняяГруппировка Из Группировка.Структура Цикл + + Если Не ДочерняяГруппировка.Использование Тогда + Продолжить; + КонецЕсли; + + ПоискЭлементов = Новый Соответствие; + ОтчетыКлиентСервер.СкопироватьРекурсивно(Настройки, ДочерняяГруппировка, Группировки, ИндексГруппировки, ПоискЭлементов); + + ДочерняяГруппировка.Использование = Ложь; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ПереименованиеПоля + +Процедура ПослеВводаЗаголовкаПоляОтчета(Заголовок, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(Заголовок) Тогда + ПереименоватьПоле(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Команда, Заголовок); + КонецЕсли; + +КонецПроцедуры + +Функция ТекущийЗаголовокПоляОтчета(Поле, ОписаниеПоля) + + ТекущийЗаголовок = ""; + + Если Поле <> Неопределено + И ЗначениеЗаполнено(Поле.Заголовок) Тогда + + ТекущийЗаголовок = Поле.Заголовок; + + ИначеЕсли ОписаниеПоля <> Неопределено Тогда + + ТекущийЗаголовок = ОписаниеПоля.Заголовок; + + ИначеЕсли Поле <> Неопределено Тогда + + ТекущийЗаголовок = Строка(Поле); + + КонецЕсли; + + Возврат ТекущийЗаголовок; + +КонецФункции + +Процедура УстановитьЗаголовокПоляОтчета(Заголовок, Поле, ОписаниеПоля) + + Если ОписаниеПоля <> Неопределено + И Заголовок = ОписаниеПоля.Заголовок Тогда + + Поле.Заголовок = ""; + + Иначе + + Поле.Заголовок = Заголовок; + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область Фильтрация + +Процедура Фильтровать(Форма, ВидСравнения, СвойстваЗаголовка, ДанныеРасшифровки) + + Если ТипЗнч(ВидСравнения) = Тип("Строка") Тогда + + ПоказатьРасширеннуюНастройкуФильтра(Форма, СвойстваЗаголовка, ДанныеРасшифровки.Значение); + Возврат; + + КонецЕсли; + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + + Фильтры = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрыРазделаОтчета(Настройки, СвойстваЗаголовка); + Фильтр = ВариантыОтчетовСлужебныйКлиентСервер.ФильтрРазделаОтчета(Фильтры, СвойстваЗаголовка.Поле); + + Если Фильтр = Неопределено Тогда + + Фильтр = Фильтры.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + Фильтр.ЛевоеЗначение = СвойстваЗаголовка.Поле; + + КонецЕсли; + + Фильтр.ВидСравнения = ВидСравнения; + Фильтр.ПравоеЗначение = ДанныеРасшифровки.Значение; + Фильтр.Использование = Истина; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, "Фильтровать"); + +КонецПроцедуры + +#КонецОбласти + +#Область Сортировка + +Функция ТипСортировкиРазделаДоступен(Команда, СвойстваЗаголовка) + + ТекстПредупреждения = ""; + ШаблонПредупреждения = НСтр("ru = 'Поле ""%1"" уже отсортировано по %2'"); + + Если СтрЗаканчиваетсяНа(ДействиеКоманды(Команда), "ПоВозрастанию") + И Не СвойстваЗаголовка.СортироватьПоВозрастанию Тогда + + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПредупреждения, СвойстваЗаголовка.Текст, НСтр("ru = 'возрастанию'")); + + ИначеЕсли СтрЗаканчиваетсяНа(ДействиеКоманды(Команда), "ПоУбыванию") + И Не СвойстваЗаголовка.СортироватьПоУбыванию Тогда + + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПредупреждения, СвойстваЗаголовка.Текст, НСтр("ru = 'убыванию'")); + + КонецЕсли; + + Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда + + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат Ложь; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ТипСортировкиРаздела(Команда) + + Если СтрЗаканчиваетсяНа(ДействиеКоманды(Команда), "ПоВозрастанию") Тогда + + Возврат НаправлениеСортировкиКомпоновкиДанных.Возр; + + КонецЕсли; + + Возврат НаправлениеСортировкиКомпоновкиДанных.Убыв; + +КонецФункции + +Функция ЭлементСортировкиРаздела(ЭлементыСортировки, Поле) + + ЭлементСортировки = Неопределено; + + Для Каждого Элемент Из ЭлементыСортировки Цикл + + Если ТипЗнч(Элемент) <> Тип("АвтоЭлементПорядкаКомпоновкиДанных") + И Элемент.Поле = Поле Тогда + + ЭлементСортировки = Элемент; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат ЭлементСортировки; + +КонецФункции + +Функция ИндексЭлементСортировкиРаздела(ЭлементыСортировки, Поле) + + Для Каждого Элемент Из ЭлементыСортировки Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда + Возврат ЭлементыСортировки.Индекс(Элемент); + КонецЕсли; + + КонецЦикла; + + Возврат ЭлементыСортировки.Количество(); + +КонецФункции + +#КонецОбласти + +#Область Оформление + +Процедура ОформитьЖелтым(Форма, Команда, СвойстваЗаголовка = Неопределено, Значение = Неопределено) + + Если СвойстваЗаголовка = Неопределено Тогда + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + КонецЕсли; + + ПараметрыРаскраски = ПараметрыРаскраскиРазделаОтчета(ДействиеКоманды(Команда)); + ПараметрыРаскраски.Условие.ЛевоеЗначение = СвойстваЗаголовка.Поле; + ПараметрыРаскраски.Условие.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ПараметрыРаскраски.Условие.ПравоеЗначение = Значение; + + ЭлементыСтиля = СтандартныеПодсистемыКлиент.ЭлементыСтиля(); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветТекста"; + Оформление.Значение = ЭлементыСтиля.ЦветТекстаВнимание; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + Оформление = СтандартныйПараметрРаскраскиРазделаОтчета(); + Оформление.Параметр = "ЦветФона"; + Оформление.Значение = ЭлементыСтиля.ЦветФонаВнимание; + + ПараметрыРаскраски.Оформление.Добавить(Оформление); + + РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка); + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +#Область РаскраскаГруппировкиОтчета + +// Параметры: +// Действие - Строка +// +// Возвращаемое значение: +// Структура: +// * Условие - Структура: +// ** ЛевоеЗначение - ПолеКомпоновкиДанных +// ** ВидСравнения - ВидСравненияКомпоновкиДанных +// ** ПравоеЗначение - Неопределено +// * Массив +// +Функция ПараметрыРаскраскиРазделаОтчета(Действие) + + Условие = Новый Структура; + Условие.Вставить("ЛевоеЗначение", Неопределено); + Условие.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); + Условие.Вставить("ПравоеЗначение", Неопределено); + + ПараметрыРаскраски = Новый Структура; + ПараметрыРаскраски.Вставить("Условие", Условие); + ПараметрыРаскраски.Вставить("Оформление", Новый Массив); + + Возврат ПараметрыРаскраски; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * Параметр - Строка +// * Значение - Неопределено +// +Функция СтандартныйПараметрРаскраскиРазделаОтчета() + + Параметр = Новый Структура; + Параметр.Вставить("Параметр", ""); + Параметр.Вставить("Значение", Неопределено); + + Возврат Параметр; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ПараметрыРаскраски - см. ПараметрыРаскраскиРазделаОтчета +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Процедура РаскраситьРазделОтчета(Форма, ПараметрыРаскраски, СвойстваЗаголовка) + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + РаскраситьГруппировкиРазделаОтчета(Раздел.Строки, ПараметрыРаскраски, СвойстваЗаголовка); + Иначе + РаскраситьГруппировкуРазделаОтчета(Раздел, ПараметрыРаскраски, СвойстваЗаголовка); + КонецЕсли; + +КонецПроцедуры + +Процедура РаскраситьГруппировкиРазделаОтчета(Группировки, ПараметрыРаскраски, СвойстваЗаголовка) + + Для Каждого Группировка Из Группировки Цикл + РаскраситьГруппировкуРазделаОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка); + КонецЦикла; + +КонецПроцедуры + +Процедура РаскраситьГруппировкуРазделаОтчета(Группировка, ПараметрыРаскраски, СвойстваЗаголовка) + + Если ТипЗнч(Группировка) = Тип("ТаблицаКомпоновкиДанных") Тогда + + РаскраситьГруппировкиРазделаОтчета(Группировка.Строки, ПараметрыРаскраски, СвойстваЗаголовка); + + Иначе + + ПолеОформления = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыРаскраски.Условие, "ЛевоеЗначение"); + + ПараметрыРаскраскиПрименимы = ОформлениеПрименимоКГруппировке( + Группировка, ПолеОформления, СвойстваЗаголовка.Ресурс); + + Если ПараметрыРаскраскиПрименимы Тогда + + Раскраска = РаскраскаГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); + + Если Раскраска = Неопределено Тогда + ДобавитьРаскраскуГруппировкиОтчета(Группировка.УсловноеОформление, ПараметрыРаскраски); + КонецЕсли; + + КонецЕсли; + + РаскраситьГруппировкиРазделаОтчета(Группировка.Структура, ПараметрыРаскраски, СвойстваЗаголовка) + + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Группировка - НастройкиКомпоновкиДанных +// - НастройкиВложенногоОбъектаКомпоновкиДанных +// - ГруппировкаКомпоновкиДанных +// - ДиаграммаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных +// - ГруппировкаДиаграммыКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных +// - ГруппировкаТаблицыКомпоновкиДанных +// - Неопределено +// Поле - ПолеКомпоновкиДанных +// - Неопределено +// ЭтоРесурс - Булево +// +// Возвращаемое значение: +// Булево +// +Функция ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс) + + ПоляГруппировки = Группировка.ПоляГруппировки; + + Возврат ЭтоРесурс + Или Поле = Неопределено + Или ПоляГруппировки.Элементы.Количество() = 0 + Или ПолеОтчета(ПоляГруппировки, Поле) <> Неопределено; + +КонецФункции + +Функция РаскраскаГруппировкиОтчета(УсловноеОформление, ПараметрыРаскраски) + + Для Каждого Элемент Из УсловноеОформление.Элементы Цикл + + Условие = УсловиеРаскраскиГруппировкиОтчета(Элемент.Отбор, ПараметрыРаскраски.Условие); + + Если Условие <> Неопределено Тогда + + ОбновитьРаскраскуГруппировкиОтчета(Элемент, Условие, ПараметрыРаскраски); + Возврат Элемент; + + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция УсловиеРаскраскиГруппировкиОтчета(Отбор, Поиск) + + Условие = Неопределено; + + Для Каждого Элемент Из Отбор.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") + И Элемент.ЛевоеЗначение = Поиск.ЛевоеЗначение + И Элемент.ВидСравнения = Поиск.ВидСравнения + И Элемент.ПравоеЗначение = Поиск.ПравоеЗначение Тогда + + Условие = Элемент; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат Условие; + +КонецФункции + +Процедура ОбновитьРаскраскуГруппировкиОтчета(Оформление, Условие, ПараметрыРаскраски) + + Оформление.Использование = Истина; + Условие.Использование = Истина; + + Оформление.Поля.Элементы.Очистить(); + + Поле = Оформление.Поля.Элементы.Добавить(); + Поле.Поле = ПараметрыРаскраски.Условие.ЛевоеЗначение; + Поле.Использование = Истина; + + СброситьОформлениеГруппировкиОтчета(Оформление); + + Для Каждого Параметр Из ПараметрыРаскраски.Оформление Цикл + Оформление.Оформление.УстановитьЗначениеПараметра(Параметр.Параметр, Параметр.Значение); + КонецЦикла; + + УстановитьОбластьОформленияГруппировкиОтчета(Оформление); + +КонецПроцедуры + +Процедура ДобавитьРаскраскуГруппировкиОтчета(УсловноеОформление, ПараметрыРаскраски) + + Оформление = УсловноеОформление.Элементы.Добавить(); + + Условие = Оформление.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(Условие, ПараметрыРаскраски.Условие); + Условие.Использование = Истина; + + Поле = Оформление.Поля.Элементы.Добавить(); + Поле.Поле = ПараметрыРаскраски.Условие.ЛевоеЗначение; + Поле.Использование = Истина; + + Для Каждого Параметр Из ПараметрыРаскраски.Оформление Цикл + Оформление.Оформление.УстановитьЗначениеПараметра(Параметр.Параметр, Параметр.Значение); + КонецЦикла; + + УстановитьОбластьОформленияГруппировкиОтчета(Оформление); + +КонецПроцедуры + +Процедура СброситьОформлениеГруппировкиОтчета(ЭлементОформления, ТолькоПараметры = Истина) + + Для Каждого Элемент Из ЭлементОформления.Оформление.Элементы Цикл + Элемент.Использование = Ложь; + КонецЦикла; + + Если ТолькоПараметры Тогда + Возврат; + КонецЕсли; + + ЭлементОформления.Поля.Элементы.Очистить(); + ЭлементОформления.Отбор.Элементы.Очистить(); + +КонецПроцедуры + +#КонецОбласти + +#Область ИзменениеРазмера + +Процедура ПослеВводаВысотыСтрокиОтчета(ВысотаСтроки, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ВысотаСтроки) Тогда + + УстановитьВысотуСтроки( + ДополнительныеПараметры.Форма, + ДополнительныеПараметры.Команда, + ДополнительныеПараметры.СвойстваЗаголовка, + ВысотаСтроки, + ДополнительныеПараметры.ПараметрыРазмераПоля); + + КонецЕсли; + +КонецПроцедуры + +Процедура ПослеВводаШириныКолонкиОтчета(ШиринаКолонки, ДополнительныеПараметры) Экспорт + + Если ЗначениеЗаполнено(ШиринаКолонки) Тогда + + УстановитьШиринуКолонки( + ДополнительныеПараметры.Форма, + ДополнительныеПараметры.Команда, + ДополнительныеПараметры.СвойстваЗаголовка, + ШиринаКолонки, + ДополнительныеПараметры.ПараметрыРазмераПоля); + + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// Ориентация - Строка +// +// Возвращаемое значение: +// Структура: +// * Размер - Число +// * МаксимальныйРазмер - Число +// * МинимальныйРазмер - Число +// * Элемент - ЭлементУсловногоОформления +// * Поле - ПолеКомпоновкиДанных +// +Функция ПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, Ориентация = "Высота") Экспорт + + Если ТипЗнч(СвойстваЗаголовка.ИдентификаторНастроек) <> Тип("ИдентификаторКомпоновкиДанных") Тогда + Возврат СтандартныеПараметрыРазмераПоляОтчета(); + КонецЕсли; + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + Для Каждого Элемент Из Группировка.УсловноеОформление.Элементы Цикл + + ПараметрыОформления = Элемент.Оформление.Элементы; + + Идентификаторы = ИдентификаторыПараметровРазмераПоля(Ориентация); + МинимальныйРазмер = ПараметрыОформления.Найти(Идентификаторы.МинимальныйРазмер); + МаксимальныйРазмер = ПараметрыОформления.Найти(Идентификаторы.МаксимальныйРазмер); + + Если МинимальныйРазмер.Использование + Или МаксимальныйРазмер.Использование Тогда + + Параметры = СтандартныеПараметрыРазмераПоляОтчета(); + Параметры.Поле = СвойстваЗаголовка.Поле; + Параметры.Элемент = Элемент; + Параметры.МинимальныйРазмер = МинимальныйРазмер; + Параметры.МаксимальныйРазмер = МаксимальныйРазмер; + Параметры.Размер = Макс(МинимальныйРазмер.Значение, МаксимальныйРазмер.Значение); + + Возврат Параметры; + + КонецЕсли; + + КонецЦикла; + + Возврат СтандартныеПараметрыРазмераПоляОтчета(); + +КонецФункции + +Функция ИдентификаторыПараметровРазмераПоля(Ориентация) + + Идентификаторы = Новый Структура; + + Если Ориентация = "Высота" Тогда + + Идентификаторы.Вставить("МинимальныйРазмер", "МинимальнаяВысота"); + Идентификаторы.Вставить("МаксимальныйРазмер", "МаксимальнаяВысота"); + + Иначе + + Идентификаторы.Вставить("МинимальныйРазмер", "МинимальнаяШирина"); + Идентификаторы.Вставить("МаксимальныйРазмер", "МаксимальнаяШирина"); + + КонецЕсли; + + Возврат Идентификаторы; + +КонецФункции + +Процедура ДобавитьПараметрыРазмераПоляОтчета(Форма, СвойстваЗаголовка, Размер, Ориентация = "Высота") + + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + Элемент = Группировка.УсловноеОформление.Элементы.Добавить(); + + ПараметрыОформления = Элемент.Оформление.Элементы; + + Идентификаторы = ИдентификаторыПараметровРазмераПоля(Ориентация); + + Параметры = СтандартныеПараметрыРазмераПоляОтчета(Размер); + Параметры.Поле = СвойстваЗаголовка.Поле; + Параметры.Элемент = Элемент; + Параметры.МинимальныйРазмер = ПараметрыОформления.Найти(Идентификаторы.МинимальныйРазмер); + Параметры.МаксимальныйРазмер = ПараметрыОформления.Найти(Идентификаторы.МаксимальныйРазмер); + + ОбновитьПараметрыРазмера(Параметры, Размер); + +КонецПроцедуры + +Процедура ОбновитьПараметрыРазмера(Параметры, Размер) + + Параметры.Элемент.Использование = Истина; + + Параметры.МинимальныйРазмер.Значение = Размер; + Параметры.МинимальныйРазмер.Использование = Истина; + + Параметры.МаксимальныйРазмер.Значение = Размер; + Параметры.МаксимальныйРазмер.Использование = Истина; + + ПроверитьИзменяемоеПоле(Параметры.Элемент.Поля, Параметры.Поле); + УстановитьОбластьИзмененияРазмера(Параметры.Элемент); + +КонецПроцедуры + +// Параметры: +// Размер - Число +// - Неопределено +// +// Возвращаемое значение: +// Структура: +// * Размер - Число +// - Неопределено +// * МаксимальныйРазмер - Число +// * МинимальныйРазмер - Число +// * Элемент - ЭлементУсловногоОформления +// * Поле - ПолеТабличногоДокумента +// +Функция СтандартныеПараметрыРазмераПоляОтчета(Размер = 0) + + Параметры = Новый Структура; + Параметры.Вставить("Поле", Неопределено); + Параметры.Вставить("Элемент", Неопределено); + Параметры.Вставить("МинимальныйРазмер", Неопределено); + Параметры.Вставить("МаксимальныйРазмер", Неопределено); + Параметры.Вставить("Размер", Размер); + + Возврат Параметры; + +КонецФункции + +// Параметры: +// Поля - ОформляемыеПоляКомпоновкиДанных +// ПолеИскомое - ПолеКомпоновкиДанных +// +Процедура ПроверитьИзменяемоеПоле(Поля, ПолеИскомое) + + Поле = Неопределено; + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если Элемент.Поле = ПолеИскомое Тогда + + Поле = Элемент; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если Поле = Неопределено Тогда + + Поле = Поля.Элементы.Добавить(); + Поле.Поле = ПолеИскомое; + + КонецЕсли; + + Поле.Использование = Истина; + +КонецПроцедуры + +Процедура УстановитьОбластьИзмененияРазмера(Элемент) + + НеиспользуемыеОбласти = Новый Массив; + НеиспользуемыеОбласти.Добавить("ИспользоватьВОбщемИтоге"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВОтборе"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВПараметрах"); + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыКлиента.ВерсияРежимаСовместимости, "8.3.16.0") >= 0 Тогда + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеОбщегоИтога"); + КонецЕсли; + + Для Каждого Область Из НеиспользуемыеОбласти Цикл + Элемент[Область] = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область РасширенноеОформлениеГруппировкиОтчета + +Функция ЭлементОформленияГруппировкиОтчета(Группировка, Поле) + + Оформление = Группировка.УсловноеОформление; + + Для Каждого ЭлементОформления Из Оформление.Элементы Цикл + + Для Каждого ПолеОформления Из ЭлементОформления.Поля.Элементы Цикл + + Если ПолеОформления.Поле = Поле Тогда + Возврат ЭлементОформления; + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция ИдентификаторЭлементаОформленияГруппировкиОтчета(Группировка, Поле) + + ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, Поле); + + Если ЭлементОформления <> Неопределено Тогда + Возврат Группировка.УсловноеОформление.ПолучитьИдентификаторПоОбъекту(ЭлементОформления); + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Функция УсловиеОформленияГруппировкиОтчета(Поле, Значение) + + Если Значение = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Условие = Новый Структура; + Условие.Вставить("ЛевоеЗначение", Поле); + Условие.Вставить("ВидСравнения", ВидСравненияКомпоновкиДанных.Равно); + Условие.Вставить("ПравоеЗначение", Значение); + + Возврат Условие; + +КонецФункции + +// Параметры: +// Результат - Структура +// ДополнительныеПараметры - Структура +// +Процедура ПослеИзмененияЭлементаОформленияГруппировкиОтчета(Результат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + ОформитьРазделОтчета( + ДополнительныеПараметры.Раздел, + Результат.ЭлементКД, + ДополнительныеПараметры.Поле, + ДополнительныеПараметры.Ресурс); + + ОповеститьОЗавершенииКонтекстнойНастройки(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Действие); + +КонецПроцедуры + +Процедура ОформитьРазделОтчета(Раздел, ОбразецОформления, Поле, ЭтоРесурс) + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + ОформитьГруппировкиРазделаОтчета(Раздел.Строки, ОбразецОформления, Поле, ЭтоРесурс); + Иначе + ОформитьГруппировкуРазделаОтчета(Раздел, ОбразецОформления, Поле, ЭтоРесурс); + КонецЕсли; + +КонецПроцедуры + +Процедура ОформитьГруппировкиРазделаОтчета(Группировки, ОбразецОформления, Поле, ЭтоРесурс) + + Для Каждого Группировка Из Группировки Цикл + ОформитьГруппировкуРазделаОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс); + КонецЦикла; + +КонецПроцедуры + +Процедура ОформитьГруппировкуРазделаОтчета(Группировка, ОбразецОформления, Поле, ЭтоРесурс) + + Если ТипЗнч(Группировка) = Тип("ТаблицаКомпоновкиДанных") Тогда + + ОформитьГруппировкиРазделаОтчета(Группировка.Строки, ОбразецОформления, Поле, ЭтоРесурс); + + Иначе + + ОформлениеПрименимоКГруппировке = ОформлениеПрименимоКГруппировке(Группировка, Поле, ЭтоРесурс); + + Если ОформлениеПрименимоКГруппировке Тогда + + Оформление = Группировка.УсловноеОформление; + ЭлементОформления = ЭлементОформленияГруппировкиОтчета(Группировка, Поле); + + Если ЭлементОформления = Неопределено Тогда + ЭлементОформления = Оформление.Элементы.Добавить(); + Иначе + СброситьОформлениеГруппировкиОтчета(ЭлементОформления, Ложь); + КонецЕсли; + + ОтчетыКлиентСервер.ЗаполнитьСвойстваРекурсивно(Оформление, ЭлементОформления, ОбразецОформления); + + УстановитьОбластьОформленияГруппировкиОтчета(ЭлементОформления); + + КонецЕсли; + + ОформитьГруппировкиРазделаОтчета(Группировка.Структура, ОбразецОформления, Поле, ЭтоРесурс); + + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьОбластьОформленияГруппировкиОтчета(ЭлементОформления) + + НеиспользуемыеОбласти = НеиспользуемыеОбластиОформления(); + + Для Каждого Область Из НеиспользуемыеОбласти Цикл + ЭлементОформления[Область] = ИспользованиеУсловногоОформленияКомпоновкиДанных.НеИспользовать; + КонецЦикла; + +КонецПроцедуры + +Функция НеиспользуемыеОбластиОформления() + + НеиспользуемыеОбласти = Новый Массив; + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовке"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолей"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВОбщемИтоге"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВОтборе"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВПараметрах"); + + ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(); + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ПараметрыКлиента.ВерсияРежимаСовместимости, "8.3.16.0") < 0 Тогда + Возврат НеиспользуемыеОбласти; + КонецЕсли; + + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолейРесурсов"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеОбщегоИтога"); + НеиспользуемыеОбласти.Добавить("ИспользоватьВЗаголовкеПолейРесурсовОбщегоИтога"); + + Возврат НеиспользуемыеОбласти; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область ОбновлениеПолейРаздела + +Процедура ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел) + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + Группировки = Раздел.Строки; + + Иначе + + ОбновитьПоляГруппировки(КомпоновщикНастроек, Настройки, Раздел); + Группировки = Раздел.Структура; + + КонецЕсли; + + Для Каждого Группировка Из Группировки Цикл + + ОбновитьПоляГруппировки(КомпоновщикНастроек, Настройки, Группировка); + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Группировка); + + КонецЦикла; + +КонецПроцедуры + +Процедура ОбновитьПоляГруппировки(КомпоновщикНастроек, Настройки, Группировка) + + Если ТипЗнч(Группировка) <> Тип("ГруппировкаКомпоновкиДанных") + И ТипЗнч(Группировка) <> Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда + + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Группировка); + КонецЕсли; + + ДобавляемыеПоля = СтандартныеДобавляемыеПоля(); + ИспользуемыеНастройки = ИспользуемыеНастройкиГруппировки(Настройки, Группировка); + + НайтиПоляГруппировки(ИспользуемыеНастройки, Группировка, ДобавляемыеПоля); + НайтиВыбранныеПоляГруппировки(КомпоновщикНастроек, ИспользуемыеНастройки, Группировка, Группировка.Выбор, ДобавляемыеПоля); + + Поля = Группировка.Выбор.Элементы; + Поля.Очистить(); + + СоздатьИерархиюПолейГруппировки(Поля, ДобавляемыеПоля.ИндексГрупп); + + Для Каждого СвойстваПоля Из ДобавляемыеПоля.Свойства Цикл + + СвойстваТекущегоПоля = СвойстваПоля; // см. СвойстваПоля + Родитель = СвойстваТекущегоПоля.Родитель; // см. СвойстваПоля + + Если Родитель = Неопределено Тогда + + Если СвойстваТекущегоПоля.Индекс < Поля.Количество() Тогда + ПолеОтчета = Поля.Вставить(СвойстваТекущегоПоля.Индекс, Тип("ВыбранноеПолеКомпоновкиДанных")); + Иначе + ПолеОтчета = Поля.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + КонецЕсли; + + Иначе + + ГруппаПолейОтчета = ДобавляемыеПоля.ИндексГрупп[Родитель.Идентификатор]; // ГруппаВыбранныхПолейКомпоновкиДанных + + Если СвойстваТекущегоПоля.Индекс < ГруппаПолейОтчета.Элементы.Количество() Тогда + ПолеОтчета = ГруппаПолейОтчета.Элементы.Вставить(СвойстваТекущегоПоля.Индекс, Тип("ВыбранноеПолеКомпоновкиДанных")); + Иначе + ПолеОтчета = ГруппаПолейОтчета.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + КонецЕсли; + + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ПолеОтчета, СвойстваТекущегоПоля); + + КонецЦикла; + + ПолеОтчета = Поля.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + ПолеОтчета.Использование = Ложь; + +КонецПроцедуры + +// Возвращаемое значение: +// Структура: +// * Свойства - Массив из Структура +// * ИндексПолей - Соответствие +// * ИндексГрупп - Соответствие +// +Функция СтандартныеДобавляемыеПоля() + + ДобавляемыеПоля = Новый Структура; + ДобавляемыеПоля.Вставить("Свойства", Новый Массив); + ДобавляемыеПоля.Вставить("ИндексПолей", Новый Соответствие); + ДобавляемыеПоля.Вставить("ИндексГрупп", Новый Соответствие); + + Возврат ДобавляемыеПоля; + +КонецФункции + +Процедура НайтиПоляГруппировки(Настройки, Группировка, ДобавляемыеПоля) + + Если Не ИспользуетсяАвтоПоле(Группировка.Выбор) Тогда + Возврат; + КонецЕсли; + + Для Каждого Элемент Из Группировка.ПоляГруппировки.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ПолеГруппировкиКомпоновкиДанных") + И Элемент.Использование Тогда + + ВыбранноеПолеГруппировки = ПолеОтчета(Группировка.Выбор, Элемент.Поле); + ВыбранноеПолеНастроек = ПолеОтчета(Настройки.Выбор, Элемент.Поле); + + Если ВыбранноеПолеГруппировки = Неопределено + И ВыбранноеПолеНастроек = Неопределено Тогда + + ДобавитьПолеГруппировки(ДобавляемыеПоля, Группировка.ПоляГруппировки, Элемент); + + ИначеЕсли ВыбранноеПолеГруппировки = Неопределено + И ВыбранноеПолеНастроек <> Неопределено + И Не ВыбранноеПолеНастроек.Использование Тогда + + ДобавитьПолеГруппировки(ДобавляемыеПоля, Группировка.ПоляГруппировки, Элемент); + + ИначеЕсли ВыбранноеПолеНастроек = Неопределено + И ВыбранноеПолеГруппировки <> Неопределено + И Не ВыбранноеПолеГруппировки.Использование Тогда + + ДобавитьПолеГруппировки(ДобавляемыеПоля, Группировка.ПоляГруппировки, Элемент); + + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура НайтиВыбранныеПоляГруппировки(КомпоновщикНастроек, Настройки, Группировка, Поля, ДобавляемыеПоля) + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + + НайтиВыбранныеПоляНастроек(КомпоновщикНастроек, Группировка, Настройки.Выбор, Настройки.Выбор, ДобавляемыеПоля); + + ИначеЕсли ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + НайтиВыбранныеПоляГруппировки(КомпоновщикНастроек, Настройки, Группировка, Элемент, ДобавляемыеПоля); + + ИначеЕсли РазрешеноИспользоватьПолеВГруппировке(КомпоновщикНастроек, Группировка, Элемент.Поле) Тогда + + ДобавитьПолеГруппировки(ДобавляемыеПоля, Группировка.Выбор, Элемент); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура НайтиВыбранныеПоляНастроек(КомпоновщикНастроек, Группировка, Узел, Поля, ДобавляемыеПоля) + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + НайтиВыбранныеПоляНастроек(КомпоновщикНастроек, Группировка, Узел, Элемент, ДобавляемыеПоля); + + ИначеЕсли ТипЗнч(Элемент) <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") + И РазрешеноИспользоватьПолеВГруппировке(КомпоновщикНастроек, Группировка, Элемент.Поле) Тогда + + ПолеОтчета = ПолеОтчета(Группировка.Выбор, Элемент.Поле); + + Если ПолеОтчета = Неопределено Тогда + ДобавитьПолеГруппировки(ДобавляемыеПоля, Узел, Элемент); + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ИспользуемыеНастройкиГруппировки(Настройки, Группировка) + + Если ТипЗнч(Группировка.Родитель) = Тип("НастройкиКомпоновкиДанных") Тогда + Возврат Группировка.Родитель; + КонецЕсли; + + Возврат Настройки; + +КонецФункции + +Функция ИспользуетсяАвтоПоле(Поля) + + Для Каждого Элемент Из Поля.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") + Или ТипЗнч(Элемент) = Тип("АвтоПолеГруппировкиКомпоновкиДанных") Тогда + + Возврат Элемент.Использование; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Функция РазрешеноИспользоватьПолеВГруппировке(КомпоновщикНастроек, Группировка, Поле) + + Элементы = Группировка.ПоляГруппировки.Элементы; + + Если Элементы.Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + + ОписаниеПоля = ОписаниеПоляОтчета(КомпоновщикНастроек, Поле); + + Если ОписаниеПоля = Неопределено Тогда + ОписаниеПоля = Группировка.ПоляГруппировки.ДоступныеПоляПолейГруппировок.НайтиПоле(Поле); + КонецЕсли; + + Если ОписаниеПоля <> Неопределено + И ОписаниеПоля.Ресурс Тогда + + Возврат Истина; + КонецЕсли; + + Для Каждого Элемент Из Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ПолеГруппировкиКомпоновкиДанных") + И Элемент.Поле = Поле + И Элемент.Использование Тогда + + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +Процедура ДобавитьПолеГруппировки(ДобавляемыеПоля, Узел, Поле) + + Если ДобавляемыеПоля.ИндексПолей[Поле.Поле] <> Неопределено Тогда + Возврат; + КонецЕсли; + + СвойстваПоля = СвойстваПоля(Поле); + СвойстваПоля.Идентификатор = Узел.ПолучитьИдентификаторПоОбъекту(Поле); + + Если СвойстваПоля.Родитель = Неопределено Тогда + СвойстваПоля.Индекс = Узел.Элементы.Индекс(Поле); + Иначе + СвойстваПоля.Индекс = Поле.Родитель.Элементы.Индекс(Поле); + КонецЕсли; + + ДобавляемыеПоля.Свойства.Добавить(СвойстваПоля); + ДобавляемыеПоля.ИндексПолей.Вставить(Поле.Поле, СвойстваПоля); + + ДобавитьГруппуПолей(ДобавляемыеПоля, Узел, СвойстваПоля); + +КонецПроцедуры + +// Параметры: +// Поле - ВыбранноеПолеКомпоновкиДанных +// - АвтоВыбранноеПолеКомпоновкиДанных +// - ГруппаВыбранныхПолейКомпоновкиДанных +// - ПолеГруппировкиКомпоновкиДанных +// +// Возвращаемое значение: +// Структура: +// * Тип - Тип +// * Индекс - Число +// * Идентификатор - ИдентификаторКомпоновкиДанных +// * РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных +// * Поле - ПолеКомпоновкиДанных +// * Использование - Булево +// * Заголовок - Строка +// * Родитель - Структура +// +Функция СвойстваПоля(Поле) + + СвойстваПоля = Новый Структура; + СвойстваПоля.Вставить("Заголовок", ""); + СвойстваПоля.Вставить("Использование", Ложь); + СвойстваПоля.Вставить("Поле", Неопределено); + СвойстваПоля.Вставить("РежимОтображения", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто); + СвойстваПоля.Вставить("Родитель", Неопределено); + СвойстваПоля.Вставить("Идентификатор", Неопределено); + + ЗаполнитьЗначенияСвойств(СвойстваПоля, Поле); + + СвойстваПоля.Вставить("Индекс", -1); + СвойстваПоля.Вставить("Тип", ТипЗнч(Поле)); + + Возврат СвойстваПоля; + +КонецФункции + +Процедура ДобавитьГруппуПолей(ДобавляемыеПоля, Узел, Элемент, Группа = Неопределено) + + Если Элемент.Тип = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") + Или Элемент.Тип = Тип("ВыбранноеПолеКомпоновкиДанных") + И ТипЗнч(Элемент.Родитель) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + Группа = Элемент.Родитель; + КонецЕсли; + + Если ТипЗнч(Группа) <> Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + Возврат; + КонецЕсли; + + Идентификатор = Узел.ПолучитьИдентификаторПоОбъекту(Группа); + СвойстваГруппы = ДобавляемыеПоля.ИндексГрупп[Идентификатор]; + + Если СвойстваГруппы = Неопределено Тогда + + СвойстваГруппы = СвойстваГруппыПолей(Группа); + СвойстваГруппы.Идентификатор = Идентификатор; + + ДобавляемыеПоля.ИндексГрупп.Вставить(Идентификатор, СвойстваГруппы); + + КонецЕсли; + + СвойстваГруппы.Элементы.Добавить(Элемент); + Элемент.Родитель = СвойстваГруппы; + + Если ТипЗнч(Группа.Родитель) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + ДобавитьГруппуПолей(ДобавляемыеПоля, Узел, СвойстваГруппы); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// Группа - ГруппаВыбранныхПолейКомпоновкиДанных +// +// Возвращаемое значение: +// Структура: +// * Заголовок - Строка +// * Использование - Булево +// * Поле - Неопределено +// * Расположение - РасположениеПоляКомпоновкиДанных +// * РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных +// * Родитель - Структура +// * Идентификатор - ИдентификаторКомпоновкиДанных +// * Элементы - Массив +// * Тип - Тип +// +Функция СвойстваГруппыПолей(Группа) + + СвойстваГруппы = Новый Структура; + СвойстваГруппы.Вставить("Заголовок", ""); + СвойстваГруппы.Вставить("Использование", Ложь); + СвойстваГруппы.Вставить("Поле", Неопределено); + СвойстваГруппы.Вставить("Расположение", РасположениеПоляКомпоновкиДанных.Авто); + СвойстваГруппы.Вставить("РежимОтображения", РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Авто); + СвойстваГруппы.Вставить("Родитель", Неопределено); + СвойстваГруппы.Вставить("Идентификатор", Неопределено); + + ЗаполнитьЗначенияСвойств(СвойстваГруппы, Группа); + + СвойстваГруппы.Вставить("Элементы", Новый Массив); + СвойстваГруппы.Вставить("Тип", ТипЗнч(Группа)); + + Возврат СвойстваГруппы; + +КонецФункции + +// Параметры: +// Поля - КоллекцияВыбранныхПолейКомпоновкиДанных +// ИндексГрупп - Соответствие из КлючИЗначение: +// * Ключ - ИдентификаторКомпоновкиДанных +// * Значение - см. СвойстваГруппыПолей +// +Процедура СоздатьИерархиюПолейГруппировки(Поля, ИндексГрупп) + + СоздатьОсновныеГруппыПолейГруппировки(Поля, ИндексГрупп); + + Для Каждого Индекс Из ИндексГрупп Цикл + + СвойстваГруппы = Индекс.Значение; // см. СвойстваГруппыПолей + + Если ТипЗнч(СвойстваГруппы) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + СвойстваРодителяГруппы = СвойстваГруппы.Родитель; // см. СвойстваГруппыПолей + + Если СвойстваРодителяГруппы <> Неопределено Тогда + + Родитель = ИндексГрупп[СвойстваРодителяГруппы.Идентификатор]; // ВыбранныеПоляКомпоновкиДанных + + Группа = Родитель.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(Группа, СвойстваГруппы); + + ИндексГрупп.Вставить(Индекс.Ключ, Группа); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Процедура СоздатьОсновныеГруппыПолейГруппировки(Поля, ИндексГрупп) + + Для Каждого Индекс Из ИндексГрупп Цикл + + СвойстваГруппы = Индекс.Значение; // см. + + Если ТипЗнч(СвойстваГруппы) = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + Если СвойстваГруппы.Родитель = Неопределено Тогда + + Группа = Поля.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(Группа, СвойстваГруппы); + + ИндексГрупп.Вставить(Индекс.Ключ, Группа); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ПоискПоля + +// Параметры: +// Поля - ВыбранныеПоляКомпоновкиДанных +// - ПоляГруппировкиКомпоновкиДанных +// Поле - ПолеКомпоновкиДанных +// ПолеОтчета - ВыбранноеПолеКомпоновкиДанных +// - ПолеГруппировкиКомпоновкиДанных +// - Неопределено +// +// Возвращаемое значение: +// ВыбранноеПолеКомпоновкиДанных +// ПолеГруппировкиКомпоновкиДанных +// Неопределено +// +Функция ПолеОтчета(Поля, Поле, ПолеОтчета = Неопределено) Экспорт + + НайтиПолеОтчета(Поля, Поле, ПолеОтчета); + + Возврат ПолеОтчета; + +КонецФункции + +// Параметры: +// Поля - ВыбранныеПоляКомпоновкиДанных +// - ПоляГруппировкиКомпоновкиДанных +// Поле - ПолеКомпоновкиДанных +// НайденноеПоле - ВыбранноеПолеКомпоновкиДанных +// - ПолеГруппировкиКомпоновкиДанных +// - Неопределено +// +Процедура НайтиПолеОтчета(Поля, Поле, НайденноеПоле) + + Для Каждого Элемент Из Поля.Элементы Цикл + + ТипЭлемента = ТипЗнч(Элемент); + + Если ТипЭлемента <> Тип("АвтоВыбранноеПолеКомпоновкиДанных") + И Элемент.Поле = Поле Тогда + + НайденноеПоле = Элемент; + Возврат; + + ИначеЕсли ТипЭлемента = Тип("ГруппаВыбранныхПолейКомпоновкиДанных") Тогда + + НайтиПолеОтчета(Элемент, Поле, НайденноеПоле); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область ВыборПоля + +Процедура ВыбратьПолеОтчета(Форма, Действие, ИмяКоллекции, Обработчик = Неопределено, + Поле = Неопределено, ИдентификаторУзлаНастроек = Неопределено) + + Если Обработчик = Неопределено Тогда + Обработчик = ОбработчикВыбораПоляОтчета(Форма, Действие); + КонецЕсли; + + ПараметрыВыбора = Новый Структура; + ПараметрыВыбора.Вставить("НастройкиОтчета", Форма.НастройкиОтчета); + ПараметрыВыбора.Вставить("КомпоновщикНастроек", КомпоновщикНастроекОтчета(Форма)); + ПараметрыВыбора.Вставить("Режим", ИмяКоллекции); + ПараметрыВыбора.Вставить("ПолеКД", Поле); + ПараметрыВыбора.Вставить("ИдентификаторЭлементаСтруктурыНастроек", + ИдентификаторЭлементаСтруктурыНастроек(Форма, ИдентификаторУзлаНастроек)); + + ОткрытьФорму( + "ХранилищеНастроек.ХранилищеВариантовОтчетов.Форма.ВыборПоляОтчета", + ПараметрыВыбора, Форма, Форма.УникальныйИдентификатор,,, Обработчик); + +КонецПроцедуры + +Процедура ВыбратьПолеОтчетаИзМеню(Форма, Команда, ИмяКоллекции = "ВыбранныеПоля") + + Обработчик = ОбработчикВыбораПоляОтчета(Форма, ДействиеКоманды(Команда)); + УточнитьИмяКоллекции(ИмяКоллекции, Обработчик); + + ПоляОтчета = ПоляОтчета(Форма, Команда, ИмяКоллекции); + + Если ПоляОтчета.Количество() > 20 + Или ПоляОтчета.Количество() = 1 + И ПоляОтчета.НайтиПоЗначению("Еще") <> Неопределено Тогда + + ВыбратьПолеОтчета(Форма, ДействиеКоманды(Команда), ИмяКоллекции, Обработчик); + Возврат; + + КонецЕсли; + + Форма.ПоказатьВыборИзМеню(Обработчик, ПоляОтчета, Форма.ТекущийЭлемент); + +КонецПроцедуры + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Действие - Строка +// +// Возвращаемое значение: +// ОписаниеОповещения +// +Функция ОбработчикВыбораПоляОтчета(Форма, Действие) + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Форма", Форма); + ПараметрыОбработчика.Вставить("Действие", Действие); + ПараметрыОбработчика.Вставить("СвойстваЗаголовка", СвойстваЗаголовкаОтчета(Форма)); + + Возврат Новый ОписаниеОповещения("ПослеВыбораПоля", Форма, ПараметрыОбработчика); + +КонецФункции + +// Параметры: +// ВыбранноеПоле - ЭлементСпискаЗначений +// - ВыбранноеПолеКомпоновкиДанных +// ДополнительныеПараметры - Структура: +// * Форма - ФормаКлиентскогоПриложения +// * Действие - Строка +// * СвойстваЗаголовка - см. СвойстваЗаголовкаОтчета +// +Процедура ПослеВыбораПоля(ВыбранноеПоле, ДополнительныеПараметры) Экспорт + + Если ВыбранноеПоле = Неопределено Тогда + Возврат; + КонецЕсли; + + Форма = ДополнительныеПараметры.Форма; + Поле = ?(ТипЗнч(ВыбранноеПоле) = Тип("ЭлементСпискаЗначений"), ВыбранноеПоле.Значение, ВыбранноеПоле); + + Если Поле = "Еще" Тогда + + ВыбратьПолеОтчета(Форма, ДополнительныеПараметры.Действие, ДополнительныеПараметры.ИмяКоллекции); + Возврат; + + КонецЕсли; + + СвойстваЗаголовка = ДополнительныеПараметры.СвойстваЗаголовка; + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Действие = ДополнительныеПараметры.Действие; + РолиПолей = Форма.НастройкиОтчета.СвойстваРезультата.РолиПолей; + + Если СтрНачинаетсяС(Действие, "ВставитьПоле") Тогда + + ВставитьПоле(КомпоновщикНастроек, Настройки, Поле, Действие, СвойстваЗаголовка, РолиПолей); + + ИначеЕсли СтрНачинаетсяС(Действие, "ВставитьГруппировку") Тогда + + ВставитьГруппировку(Настройки, Действие, Поле, СвойстваЗаголовка); + + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, Действие); + +КонецПроцедуры + +#КонецОбласти + +#Область ПоляОтчета + +Функция ПоляОтчета(Форма, Команда, ИмяКоллекции) + + ДоступныеПоля = ДоступныеПоляОтчета(КомпоновщикНастроекОтчета(Форма), ИмяКоллекции); + ПоляОтчета = ОсновныеПоляОтчета(Форма.НастройкиОтчета.СвойстваРезультата, ДоступныеПоля); + + Если ПоляОтчета.Количество() = 0 Тогда + ДобавитьДоступныеПоляОтчета(ПоляОтчета, ДоступныеПоля); + КонецЕсли; + + ИсключитьИспользуемыеПоляОтчета(ПоляОтчета, Форма, Команда); + ИсключитьНедоступныеПоляОтчета(ПоляОтчета, Форма, Команда); + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + + Если Не СвойстваЗаголовка.Ресурс + И ПоляОтчета.НайтиПоЗначению("Еще") = Неопределено Тогда + + ПоляОтчета.Добавить("Еще", НСтр("ru = 'Еще...'")); + КонецЕсли; + + Возврат ПоляОтчета; + +КонецФункции + +Функция ОписаниеПоляОтчета(КомпоновщикНастроек, Поле, ИмяКоллекции = "Выбор") + + ДоступныеПоля = ДоступныеПоляОтчета(КомпоновщикНастроек, ИмяКоллекции); + + Возврат ДоступныеПоля.НайтиПоле(Поле); + +КонецФункции + +Функция ДоступныеПоляОтчета(КомпоновщикНастроек, ИмяКоллекции = "Выбор") + + Если ИмяКоллекции = "Отборы" Тогда + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора; + + ИначеЕсли ИмяКоллекции = "Сортировка" Тогда + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляПорядка; + + ИначеЕсли ИмяКоллекции = "ПоляГруппировки" Тогда + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляГруппировок; + + КонецЕсли; + + Возврат КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора; + +КонецФункции + +Функция ОсновныеПоляОтчета(СвойстваРезультата, ДоступныеПоля) + + ОсновныеПоляИзДоступных = Новый СписокЗначений; + + ОсновныеПоля = СвойстваРезультата.ОсновныеПоля; + + Для Каждого Поле Из ОсновныеПоля Цикл + + ДоступноеПоле = ДоступныеПоля.НайтиПоле(Новый ПолеКомпоновкиДанных(Поле)); + + Если ДоступноеПоле <> Неопределено Тогда + ОсновныеПоляИзДоступных.Добавить(ДоступноеПоле, ДоступноеПоле.Заголовок,, КартинкаПоля(ДоступноеПоле.ТипЗначения)); + КонецЕсли; + + КонецЦикла; + + Возврат ОсновныеПоляИзДоступных; + +КонецФункции + +Процедура ДобавитьДоступныеПоляОтчета(ПоляОтчета, ДоступныеПоля) + + Для Каждого ДоступноеПоле Из ДоступныеПоля.Элементы Цикл + + Если Не ДоступноеПоле.Папка Тогда + ПоляОтчета.Добавить(ДоступноеПоле, ДоступноеПоле.Заголовок,, КартинкаПоля(ДоступноеПоле.ТипЗначения)); + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Параметры: +// ОсновныеПоля - СписокЗначений +// Форма - ФормаКлиентскогоПриложения +// Команда - КомандаФормы +// +Процедура ИсключитьИспользуемыеПоляОтчета(ОсновныеПоля, Форма, Команда) + + Владелец = Форма.ТекущийЭлемент; + + Если ТипЗнч(Владелец) <> Тип("КнопкаФормы") + И (ТипЗнч(Владелец) <> Тип("ПолеФормы") Или Владелец.Вид <> ВидПоляФормы.ПолеТабличногоДокумента) Тогда + + Возврат; + КонецЕсли; + + Если ДействиеКоманды(Команда) <> "ВставитьПолеСлева" + И ДействиеКоманды(Команда) <> "ВставитьПолеСправа" Тогда + + Возврат; + КонецЕсли; + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + ИспользуемыеПоля = ИспользуемыеПоляОтчета( + СвойстваЗаголовка, Форма.НастройкиОтчета.СвойстваРезультата.ИндексПолей); + + Индекс = ОсновныеПоля.Количество() - 1; + + Пока Индекс >= 0 Цикл + + ДоступноеПоле = ОсновныеПоля[Индекс].Значение; + + Если ИспользуемыеПоля[ДоступноеПоле.Поле] <> Неопределено Тогда + ОсновныеПоля.Удалить(Индекс); + КонецЕсли; + + Индекс = Индекс - 1; + + КонецЦикла; + +КонецПроцедуры + +Функция ИспользуемыеПоляОтчета(СвойстваЗаголовка, ИндексПолей) + + ИндексПолейРаздела = ИндексПолей[СвойстваЗаголовка.ПорядокРаздела]; + ИндексПолейГруппировки = ИндексПолейРаздела[СвойстваЗаголовка.ПорядокГруппировки]; + + Возврат ИндексПолейГруппировки; + +КонецФункции + +Функция КартинкаПоля(ТипЗначенияПоля) + + ДоступныеТипы = ТипЗначенияПоля.Типы(); + + Если ДоступныеТипы.Количество() = 0 Тогда + Возврат БиблиотекаКартинок.Пустая; + КонецЕсли; + + Если ДоступныеТипы.Количество() > 1 Тогда + Возврат БиблиотекаКартинок.ТипСоставной; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Число")) Тогда + Возврат БиблиотекаКартинок.ТипЧисло; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Строка")) Тогда + Возврат БиблиотекаКартинок.ТипСтрока; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Дата")) Тогда + Возврат БиблиотекаКартинок.ТипДата; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("Булево")) Тогда + Возврат БиблиотекаКартинок.ТипБулево; + КонецЕсли; + + Если ТипЗначенияПоля.СодержитТип(Тип("УникальныйИдентификатор")) Тогда + Возврат БиблиотекаКартинок.ТипИдентификатор; + КонецЕсли; + + Возврат БиблиотекаКартинок.ТипСсылка; + +КонецФункции + +// Параметры: +// ОсновныеПоля - СписокЗначений +// Форма - ФормаКлиентскогоПриложения +// Команда - КомандаФормы +// +Процедура ИсключитьНедоступныеПоляОтчета(ОсновныеПоля, Форма, Команда) + + Владелец = Форма.ТекущийЭлемент; + + Если ТипЗнч(Владелец) <> Тип("КнопкаФормы") + И (ТипЗнч(Владелец) <> Тип("ПолеФормы") Или Владелец.Вид <> ВидПоляФормы.ПолеТабличногоДокумента) Тогда + + Возврат; + КонецЕсли; + + Если ДействиеКоманды(Команда) <> "ВставитьПолеСлева" + И ДействиеКоманды(Команда) <> "ВставитьПолеСправа" Тогда + + Возврат; + КонецЕсли; + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + РолиПолей = Форма.НастройкиОтчета.СвойстваРезультата.РолиПолей; + + Индекс = ОсновныеПоля.Количество() - 1; + + Пока Индекс >= 0 Цикл + + ДоступноеПоле = ОсновныеПоля[Индекс].Значение; + + Если СвойстваЗаголовка.Ресурс + И Не ДоступноеПоле.Ресурс Тогда + + ОсновныеПоля.Удалить(Индекс); + + ИначеЕсли СвойстваЗаголовка.Период + И РолиПолей.Периоды[ДоступноеПоле.Поле] = Неопределено Тогда + + ОсновныеПоля.Удалить(Индекс); + + ИначеЕсли Не СвойстваЗаголовка.Период + И РолиПолей.Периоды[ДоступноеПоле.Поле] <> Неопределено Тогда + + ОсновныеПоля.Удалить(Индекс); + + ИначеЕсли СвойстваЗаголовка.ИспользуетсяВПоляхГруппировки + И СвойстваЗаголовка.ПереместитьПолеВправо + И ДействиеКоманды(Команда) = "ВставитьПолеСправа" + И ДоступноеПоле.Ресурс Тогда + + ОсновныеПоля.Удалить(Индекс); + + ИначеЕсли СвойстваЗаголовка.ИспользуетсяВПоляхГруппировки + И ДействиеКоманды(Команда) = "ВставитьПолеСлева" + И ДоступноеПоле.Ресурс Тогда + + ОсновныеПоля.Удалить(Индекс); + + КонецЕсли; + + Индекс = Индекс - 1; + + КонецЦикла; + +КонецПроцедуры + +#Область ПеремещениеПоля + +Процедура ПереместитьПолеГоризонтально(Форма, Команда) + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел); + + Поля = Группировка.Выбор; + ТекущееПоле = ПолеОтчета(Поля, СвойстваЗаголовка.Поле); + + ИсходныйИндексПоля = Поля.Элементы.Индекс(ТекущееПоле); + + Если ДействиеКоманды(Команда) = "ПереместитьПолеВлево" Тогда + + НаправлениеСдвига = -1 + + ИначеЕсли ДействиеКоманды(Команда) = "ПереместитьПолеВправо" Тогда + + НаправлениеСдвига = 1 + + КонецЕсли; + + КонечныйИндексПоля = ИсходныйИндексПоля + НаправлениеСдвига; + + Если КонечныйИндексПоля >= 0 Тогда + + СоседнееПоле = Поля.Элементы[КонечныйИндексПоля]; + + Пока КонечныйИндексПоля > 0 И Не СоседнееПоле.Использование Цикл + + КонечныйИндексПоля = КонечныйИндексПоля + НаправлениеСдвига; + СоседнееПоле = Поля.Элементы[КонечныйИндексПоля]; + + КонецЦикла; + + КонецЕсли; + + Поля.Элементы.Сдвинуть(ТекущееПоле, КонечныйИндексПоля - ИсходныйИндексПоля); + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Процедура ПереместитьПолеВертикально(Форма, Команда) + + СвойстваЗаголовка = СвойстваЗаголовкаОтчета(Форма); + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + Настройки = ИспользуемыеНастройки(Форма, СвойстваЗаголовка.ИдентификаторНастроек); + Раздел = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + Группировка = Настройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + + ОбновитьПоляРаздела(КомпоновщикНастроек, Настройки, Раздел); + + ПолеГруппировки = ПолеОтчета(Группировка.ПоляГруппировки, СвойстваЗаголовка.Поле); + ВыбранноеПоле = ПолеОтчета(Группировка.Выбор, СвойстваЗаголовка.Поле); + + СоседняяГруппировка = СоседняяГруппировка(Форма, Команда, Настройки, СвойстваЗаголовка.ПорядокГруппировки); + + Если СоседняяГруппировка = Неопределено Тогда + Возврат; + КонецЕсли; + + ИсходныйИндексПоля = Группировка.Выбор.Элементы.Индекс(ВыбранноеПоле); + + Поля = СоседняяГруппировка.ПоляГруппировки; + КоличествоПолей = Поля.Элементы.Количество(); + + Если КоличествоПолей > 0 Тогда + + ИндексПоля = ?(ИсходныйИндексПоля < КоличествоПолей, ИсходныйИндексПоля, КоличествоПолей); + НовоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ПолеГруппировкиКомпоновкиДанных")); + ЗаполнитьЗначенияСвойств(НовоеПоле, ?(ПолеГруппировки = Неопределено, ВыбранноеПоле, ПолеГруппировки)); + + КонецЕсли; + + Поля = СоседняяГруппировка.Выбор; + ИндексПоля = ИндексВыбранногоПоля(ИсходныйИндексПоля, Поля, СвойстваЗаголовка.Поле); + НовоеПоле = Поля.Элементы.Вставить(ИндексПоля, Тип("ВыбранноеПолеКомпоновкиДанных")); + + ЗаполнитьЗначенияСвойств(НовоеПоле, ?(ВыбранноеПоле = Неопределено, ПолеГруппировки, ВыбранноеПоле)); + + УстановитьВыводРеквизитовГруппировкиОтдельно(СоседняяГруппировка); + + Если ПолеГруппировки <> Неопределено Тогда + Группировка.ПоляГруппировки.Элементы.Удалить(ПолеГруппировки); + КонецЕсли; + + Если ВыбранноеПоле <> Неопределено Тогда + + Если Группировка.ПоляГруппировки.Элементы.Количество() = 0 Тогда + + ВыбранноеПоле.Использование = Ложь; + СкрытьГруппировку(Настройки, Группировка, СвойстваЗаголовка.Поле); + + Иначе + Группировка.Выбор.Элементы.Удалить(ВыбранноеПоле); + КонецЕсли; + + КонецЕсли; + + ОповеститьОЗавершенииКонтекстнойНастройки(Форма, ДействиеКоманды(Команда)); + +КонецПроцедуры + +Функция СоседняяГруппировка(Форма, Команда, Настройки, ПорядокГруппировки) + + СоседняяГруппировка = Неопределено; + + Если ДействиеКоманды(Команда) = "ПереместитьПолеВыше" Тогда + ПорядокСоседнейГруппировки = ПорядокГруппировки - 1; + Иначе + ПорядокСоседнейГруппировки = ПорядокГруппировки + 1; + КонецЕсли; + + Заголовки = ЗаголовкиОтчета(Форма); + + Для Каждого Свойства Из Заголовки Цикл + + Если Свойства.Значение.ПорядокГруппировки = ПорядокСоседнейГруппировки Тогда + + СоседняяГруппировка = Настройки.ПолучитьОбъектПоИдентификатору(Свойства.Значение.ИдентификаторГруппировки); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат СоседняяГруппировка; + +КонецФункции + +Функция ИндексВыбранногоПоля(ИсходныйИндексПоля, КонечнаяКоллекцияПолей, Поле) + + Граница = КонечнаяКоллекцияПолей.Элементы.Количество(); + + НовоеПоле = ПолеОтчета(КонечнаяКоллекцияПолей, Поле); + + Если НовоеПоле <> Неопределено Тогда + КонечнаяКоллекцияПолей.Элементы.Удалить(НовоеПоле); + КонецЕсли; + + Для Каждого Элемент Из КонечнаяКоллекцияПолей.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("АвтоВыбранноеПолеКомпоновкиДанных") Тогда + Продолжить; + КонецЕсли; + + ДоступноеПоле = КонечнаяКоллекцияПолей.ДоступныеПоляВыбора.НайтиПоле(Элемент.Поле); + + Если ДоступноеПоле <> Неопределено + И ДоступноеПоле.Ресурс Тогда + + Граница = КонечнаяКоллекцияПолей.Элементы.Индекс(Элемент); + Прервать; + + КонецЕсли; + + КонецЦикла; + + Возврат ?(ИсходныйИндексПоля < Граница, ИсходныйИндексПоля, Граница); + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область ОбработкаДополнительнойРасшифровки + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// Область - ОбластьЯчеекТабличногоДокумента +// ИмяПоля - Строка +// +// Возвращаемое значение: +// Структура: +// * ЭтоЗаголовок - Булево +// +Функция СвойстваОбластиРасшифровки(Форма, Область, ИмяПоля) + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + СвойстваЗаголовка = СвойстваРезультата.Заголовки[Область.Имя]; // см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета + + СвойстваОбласти = Новый Структура; + СвойстваОбласти.Вставить("ЭтоЗаголовок", ТипЗнч(СвойстваЗаголовка) = Тип("Структура")); + СвойстваОбласти.Вставить("СвойстваЗаголовка", СвойстваЗаголовка); + + Если СвойстваОбласти.ЭтоЗаголовок Тогда + Возврат СвойстваОбласти; + КонецЕсли; + + ПорядокРаздела = 0; + ГраницаТекущегоРаздела = 0; + + Для Каждого Граница Из СвойстваРезультата.ГраницыРазделов Цикл + + Если Область.Верх >= ГраницаТекущегоРаздела + И Область.Верх <= Граница.Значение Тогда + + ПорядокРаздела = ПорядокРаздела + 1; + + КонецЕсли; + + ГраницаТекущегоРаздела = Граница.Значение; + + КонецЦикла; + + Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); + + Для Каждого Элемент Из СвойстваРезультата.Заголовки Цикл + + СвойстваЗаголовка = Элемент.Значение; + + Если СвойстваЗаголовка.ПорядокРаздела = ПорядокРаздела + И СвойстваЗаголовка.Поле = Поле Тогда + + СвойстваОбласти.СвойстваЗаголовка = СвойстваЗаголовка; + Возврат СвойстваОбласти; + + КонецЕсли; + + КонецЦикла; + + Возврат СвойстваОбласти; + +КонецФункции + +#Область КонтекстноеМеню + +Функция КонтекстноеМенюОбластиЗаголовка() + + КонтекстноеМеню = Новый СписокЗначений; + + // Вставить + КонтекстноеМеню.Добавить("ВставитьПолеСправа", НСтр("ru = 'Вставить поле справа...'"),, БиблиотекаКартинок.ВставитьКолонкуСправа); + КонтекстноеМеню.Добавить("ВставитьГруппировкуНиже", НСтр("ru = 'Вставить группировку ниже...'"),, БиблиотекаКартинок.ВставитьГруппировкуНиже); + + // Переместить + КонтекстноеМеню.Добавить("ПереместитьПолеВлево", НСтр("ru = 'Переместить влево'"),, БиблиотекаКартинок.ПереместитьКолонкуВлево); + КонтекстноеМеню.Добавить("ПереместитьПолеВправо", НСтр("ru = 'Переместить вправо'"),, БиблиотекаКартинок.ПереместитьКолонкуВправо); + КонтекстноеМеню.Добавить("ПереместитьПолеВыше", НСтр("ru = 'Переместить выше'"),, БиблиотекаКартинок.ПереместитьГруппировкуВыше); + КонтекстноеМеню.Добавить("ПереместитьПолеНиже", НСтр("ru = 'Переместить ниже'"),, БиблиотекаКартинок.ПереместитьГруппировкуНиже); + + // + КонтекстноеМеню.Добавить("СкрытьПоле", НСтр("ru = 'Скрыть'")); + КонтекстноеМеню.Добавить("ПереименоватьПоле", НСтр("ru = 'Переименовать...'")); + КонтекстноеМеню.Добавить("СнятьФильтр", НСтр("ru = 'Снять фильтр'")); + КонтекстноеМеню.Добавить("Фильтровать", НСтр("ru = 'Фильтровать...'"),, БиблиотекаКартинок.ОтборКомпоновкиДанных); + + // Сортировать + КонтекстноеМеню.Добавить(НаправлениеСортировкиКомпоновкиДанных.Возр, НСтр("ru = 'Сортировать по возрастанию'"),, БиблиотекаКартинок.СортироватьСтрокиПоВозрастанию); + КонтекстноеМеню.Добавить(НаправлениеСортировкиКомпоновкиДанных.Убыв, НСтр("ru = 'Сортировать по убыванию'"),, БиблиотекаКартинок.СортироватьСтрокиПоУбыванию); + + // Оформить + ПодменюОформления = Новый СписокЗначений; + ПодменюОформления.Добавить("ОформитьОтрицательные", НСтр("ru = 'Отрицательные красным'")); + ПодменюОформления.Добавить("ОформитьПоложительные", НСтр("ru = 'Положительные зеленым'")); + ПодменюОформления.Добавить("УстановитьВысотуСтроки", НСтр("ru = 'Высота строки...'"),, БиблиотекаКартинок.ВысотаСтроки); + ПодменюОформления.Добавить("УстановитьШиринуКолонки", НСтр("ru = 'Ширина колонки...'"),, БиблиотекаКартинок.ШиринаКолонки); + ПодменюОформления.Добавить("ОформитьЕще", НСтр("ru = 'Еще...'")); + + КонтекстноеМеню.Добавить(ПодменюОформления, НСтр("ru = 'Оформить'"),, БиблиотекаКартинок.УсловноеОформлениеКомпоновкиДанных); + + Возврат КонтекстноеМеню; + +КонецФункции + +Функция КонтекстноеМенюОбластиДанных(ДоступныеВидыСравнения) + + Информация = Новый СистемнаяИнформация; + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Информация.ВерсияПриложения, "8.3.16.0") >= 0 Тогда + + КартинкиОформления = Новый Структура; + КартинкиОформления.Вставить("ОформитьКрасным", БиблиотекаКартинок["ОформлениеКругКрасный"]); + КартинкиОформления.Вставить("ОформитьЖелтым", БиблиотекаКартинок["ОформлениеКругЖелтый"]); + КартинкиОформления.Вставить("ОформитьЗеленым", БиблиотекаКартинок["ОформлениеКругЗеленый"]); + + Иначе + + ПустаяКартинка = БиблиотекаКартинок["Пустая"]; + + КартинкиОформления = Новый Структура; + КартинкиОформления.Вставить("ОформитьКрасным", ПустаяКартинка); + КартинкиОформления.Вставить("ОформитьЖелтым", ПустаяКартинка); + КартинкиОформления.Вставить("ОформитьЗеленым", ПустаяКартинка); + + КонецЕсли; + + КонтекстноеМеню = Новый СписокЗначений; + КонтекстноеМеню.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение, НСтр("ru = 'Открыть'")); + + // Фильтровать + КонтекстноеМеню.Добавить(ДоступныеВидыСравнения, НСтр("ru = 'Фильтровать'"),, БиблиотекаКартинок.ОтборКомпоновкиДанных); + + // Сортировать + КонтекстноеМеню.Добавить(НаправлениеСортировкиКомпоновкиДанных.Возр, НСтр("ru = 'Сортировать по возрастанию'"),, БиблиотекаКартинок.СортироватьСтрокиПоВозрастанию); + КонтекстноеМеню.Добавить(НаправлениеСортировкиКомпоновкиДанных.Убыв, НСтр("ru = 'Сортировать по убыванию'"),, БиблиотекаКартинок.СортироватьСтрокиПоУбыванию); + + // Оформить + ПодменюОформления = Новый СписокЗначений; + ПодменюОформления.Добавить("ОформитьКрасным", НСтр("ru = 'Красным'"),, КартинкиОформления.ОформитьКрасным); + ПодменюОформления.Добавить("ОформитьЖелтым", НСтр("ru = 'Желтым'"),, КартинкиОформления.ОформитьЖелтым); + ПодменюОформления.Добавить("ОформитьЗеленым", НСтр("ru = 'Зеленым'"),, КартинкиОформления.ОформитьЗеленым); + ПодменюОформления.Добавить("ОформитьОтрицательные", НСтр("ru = 'Отрицательные красным'")); + ПодменюОформления.Добавить("ОформитьПоложительные", НСтр("ru = 'Положительные зеленым'")); + ПодменюОформления.Добавить("УстановитьВысотуСтроки", НСтр("ru = 'Высота строки...'"),, БиблиотекаКартинок.ВысотаСтроки); + ПодменюОформления.Добавить("УстановитьШиринуКолонки", НСтр("ru = 'Ширина колонки...'"),, БиблиотекаКартинок.ШиринаКолонки); + ПодменюОформления.Добавить("ОформитьЕще", НСтр("ru = 'Еще...'")); + + КонтекстноеМеню.Добавить(ПодменюОформления, НСтр("ru = 'Оформить'"),, БиблиотекаКартинок.УсловноеОформлениеКомпоновкиДанных); + + Возврат КонтекстноеМеню; + +КонецФункции + +#КонецОбласти + +#Область Расшифровка + +Процедура ВыполнитьРасшифровку(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт + + Если ВыполненноеДействие = Неопределено + Или ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Нет Тогда + + Возврат; + КонецЕсли; + + Форма = ДополнительныеПараметры.Форма; + Данные = ДополнительныеПараметры.Данные; + СвойстваОбласти = ДополнительныеПараметры.СвойстваОбласти; + Меню = ДополнительныеПараметры.Меню; + + Если СвойстваОбласти.ЭтоЗаголовок Тогда + + СвойстваЗаголовка = СвойстваОбласти.СвойстваЗаголовка; + + Если ТипЗнч(ВыполненноеДействие) = Тип("Строка") + И СвойстваЗаголовка.Свойство(ВыполненноеДействие) + И Не СвойстваЗаголовка[ВыполненноеДействие] Тогда + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Действие ""%1"" недоступно'"), Меню.НайтиПоЗначению(ВыполненноеДействие)); + + ПоказатьПредупреждение(, ТекстСообщения); + + КонецЕсли; + + Если СтрНайти(СвойстваЗаголовка.ИдентификаторГруппировки, "/column/") = 0 Тогда + Возврат; + КонецЕсли; + + КонецЕсли; + + Если ТипЗнч(ВыполненноеДействие) = Тип("Строка") + И ВыполненноеДействие = "СнятьФильтр" Тогда + + СнятьФильтр(Форма, СвойстваОбласти.СвойстваЗаголовка); + Возврат; + + КонецЕсли; + + Если ТипЗнч(ВыполненноеДействие) = Тип("ВидСравненияКомпоновкиДанных") + Или ТипЗнч(ВыполненноеДействие) = Тип("Строка") И ВыполненноеДействие = "ФильтроватьЕще" Тогда + + Фильтровать(Форма, ВыполненноеДействие, СвойстваОбласти.СвойстваЗаголовка, Данные); + Возврат; + + КонецЕсли; + + Если ТипЗнч(ВыполненноеДействие) = Тип("НаправлениеСортировкиКомпоновкиДанных") Тогда + + Если ВыполненноеДействие = НаправлениеСортировкиКомпоновкиДанных.Возр Тогда + Команда = Форма.Команды.Найти("СортироватьПоВозрастанию"); + Иначе + Команда = Форма.Команды.Найти("СортироватьПоУбыванию"); + КонецЕсли; + + Сортировать(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка); + Возврат; + + КонецЕсли; + + Если ТипЗнч(ВыполненноеДействие) = Тип("Строка") + И (ВыполненноеДействие = "ОформитьКрасным" + Или ВыполненноеДействие = "ОформитьЖелтым" + Или ВыполненноеДействие = "ОформитьЗеленым" + Или ВыполненноеДействие = "ОформитьОтрицательные" + Или ВыполненноеДействие = "ОформитьПоложительные" + Или ВыполненноеДействие = "УстановитьВысотуСтроки" + Или ВыполненноеДействие = "УстановитьШиринуКолонки" + Или ВыполненноеДействие = "ОформитьЕще") Тогда + + Команда = Форма.Команды.Найти(ВыполненноеДействие); + + Если ВыполненноеДействие = "ОформитьКрасным" + Или ВыполненноеДействие = "ОформитьОтрицательные" Тогда + + ОформитьКрасным(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка, Данные.Значение); + + ИначеЕсли ВыполненноеДействие = "ОформитьЖелтым" Тогда + + ОформитьЖелтым(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка, Данные.Значение); + + ИначеЕсли ВыполненноеДействие = "ОформитьЗеленым" + Или ВыполненноеДействие = "ОформитьПоложительные" Тогда + + ОформитьЗеленым(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка, Данные.Значение); + + ИначеЕсли ВыполненноеДействие = "УстановитьВысотуСтроки" Тогда + + УстановитьВысотуСтроки(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка); + + ИначеЕсли ВыполненноеДействие = "УстановитьШиринуКолонки" Тогда + + УстановитьШиринуКолонки(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка); + + ИначеЕсли ВыполненноеДействие = "ОформитьЕще" Тогда + + ОформитьЕще(Форма, Команда, СвойстваОбласти.СвойстваЗаголовка, Данные.Значение); + + КонецЕсли; + + Возврат; + + КонецЕсли; + + Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда + + ПоказатьЗначение(, Данные.Значение); + Возврат; + + КонецЕсли; + + Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать Тогда + + ДополнительныеПараметры.Вставить("Настройки", ПараметрВыполненногоДействия); + ОткрытьФормуОтчета(Форма, ДополнительныеПараметры); + + КонецЕсли; + +КонецПроцедуры + +Процедура ОткрытьФормуОтчета(Форма, ПараметрыОткрытия) + + НастройкиОтчета = Форма.НастройкиОтчета; + Расшифровка = ПараметрыОткрытия.Расшифровка; + + СтандартнаяОбработка = Истина; + + Если СтандартнаяОбработка Тогда + + Расшифровка = Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных( + Форма.ОтчетДанныеРасшифровки, ПараметрыОткрытия.Расшифровка, ПараметрыОткрытия.Настройки); + + ПредставлениеВарианта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (Расшифровка)'"), Форма.ПредставлениеТекущегоВарианта); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Расшифровка", Расшифровка); + ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина); + ПараметрыФормы.Вставить("ПредставлениеВарианта", ПредставлениеВарианта); + ПараметрыФормы.Вставить("НастройкиОтчета", НастройкиОтчета); + + ОткрытьФорму(НастройкиОтчета.ПолноеИмя + ".Форма", ПараметрыФормы, Форма, Форма.УникальныйИдентификатор); + + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#КонецОбласти + +#Область Общее + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// +// Возвращаемое значение: +// КомпоновщикНастроекКомпоновкиДанных +// +Функция КомпоновщикНастроекОтчета(Форма) + + Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета") Тогда + + Возврат Форма.Отчет.КомпоновщикНастроек; + КонецЕсли; + + Возврат Форма.КомпоновщикНастроек; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ИдентификаторНастроек - ИдентификаторКомпоновкиДанных +// - Неопределено +// +// Возвращаемое значение: +// НастройкиКомпоновкиДанных +// +Функция ИспользуемыеНастройки(Форма, ИдентификаторНастроек = Неопределено) + + Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "КонтекстнаяНастройкаОтчета") Тогда + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + + ИспользуемыеНастройки = СвойстваРезультата.ИтоговыеНастройки; + + Иначе + + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + ИспользуемыеНастройки = КомпоновщикНастроек.Настройки; + + КонецЕсли; + + Если ТипЗнч(ИдентификаторНастроек) <> Тип("ИдентификаторКомпоновкиДанных") Тогда + Возврат ИспользуемыеНастройки; + КонецЕсли; + + НастройкиПоИдентификатору = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(ИдентификаторНастроек); + + Если НастройкиПоИдентификатору = Неопределено Тогда + Возврат ИспользуемыеНастройки; + КонецЕсли; + + Возврат НастройкиПоИдентификатору; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// +// Возвращаемое значение: +// Соответствие +// +Функция ЗаголовкиОтчета(Форма) + + Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "КонтекстнаяНастройкаОтчета") Тогда + + НастройкиОтчета = Форма.НастройкиОтчета; // см. ВариантыОтчетов.НастройкиФормыОтчета + СвойстваРезультата = НастройкиОтчета.СвойстваРезультата; // см. ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета + + Возврат СвойстваРезультата.Заголовки; + КонецЕсли; + + Возврат Форма.ЗаголовкиОтчета; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// +// Возвращаемое значение: +// см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Функция СвойстваЗаголовкаОтчета(Форма) + + Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета") Тогда + + Заголовки = ЗаголовкиОтчета(Форма); + Поле = Форма.ТекущийЭлемент; // ПолеФормы, РасширениеПоляФормыДляПоляТабличногоДокумента + Область = Поле.ТекущаяОбласть; // ОбластьЯчеекТабличногоДокумента + + Возврат Заголовки[Область.Имя]; + + КонецЕсли; + + Возврат Форма.СвойстваЗаголовка; + +КонецФункции + +Процедура УточнитьИмяКоллекции(ИмяКоллекции, Обработчик) + + ДополнительныеПараметры = Обработчик.ДополнительныеПараметры; + + Если ДополнительныеПараметры.СвойстваЗаголовка.ТипПоля = Тип("ПолеГруппировкиКомпоновкиДанных") Тогда + ИмяКоллекции = "ПоляГруппировки"; + КонецЕсли; + + ДополнительныеПараметры.Вставить("ИмяКоллекции", ИмяКоллекции); + +КонецПроцедуры + +Функция ИдентификаторЭлементаСтруктурыНастроек(Форма, ИдентификаторУзлаНастроек) + + Если ИдентификаторУзлаНастроек <> Неопределено Тогда + Возврат ИдентификаторУзлаНастроек; + КонецЕсли; + + Если СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета") Тогда + + Возврат Неопределено; + КонецЕсли; + + Возврат Форма.ИдентификаторЭлементаСтруктурыНастроек; + +КонецФункции + +Функция ДействиеКоманды(Команда) + + Возврат ?(ЗначениеЗаполнено(Команда.Действие), Команда.Действие, Команда.Имя); + +КонецФункции + +Процедура ОповеститьОЗавершенииКонтекстнойНастройки(Форма, Действие) + + ЭтоФормОтчета = СтрЗаканчиваетсяНа(Форма.ИмяФормы, "Форма") + Или СтрЗаканчиваетсяНа(Форма.ИмяФормы, "ФормаОтчета"); + + ИспользуемыеНастройки = ИспользуемыеНастройки(Форма); + КомпоновщикНастроек = КомпоновщикНастроекОтчета(Форма); + КомпоновщикНастроек.ЗагрузитьНастройки(ИспользуемыеНастройки); + + ИдентификаторВладельца = ?(ЭтоФормОтчета, Форма.УникальныйИдентификатор, Форма.ВладелецФормы.УникальныйИдентификатор); + + Результат = СтандартныйРезультатНастройкиИзКонтекстногоМеню(КомпоновщикНастроек, Действие, ИдентификаторВладельца); + + Если ЭтоФормОтчета Тогда + Оповестить(Действие, Результат, ЭтотОбъект); + Иначе + Форма.ОповеститьОВыборе(Результат); + КонецЕсли; + +КонецПроцедуры + +// Параметры: +// КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// Действие - Строка +// ИдентификаторВладельца - УникальныйИдентификатор +// +// Возвращаемое значение: +// Структура: +// * Действие - Строка +// * ИдентификаторВладельца - УникальныйИдентификатор +// * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// * Переформировать - Булево +// * ВариантМодифицирован - Булево +// * ПользовательскиеНастройкиМодифицированы - Булево +// * СброситьПользовательскиеНастройки - Булево +// +Функция СтандартныйРезультатНастройкиИзКонтекстногоМеню(КомпоновщикНастроек, Действие, ИдентификаторВладельца) Экспорт + + Результат = Новый Структура; + Результат.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроек); + Результат.Вставить("Действие", Действие); + Результат.Вставить("ИдентификаторВладельца", ИдентификаторВладельца); + Результат.Вставить("Переформировать", СтрЗаканчиваетсяНа(Действие, "Сформировать")); + Результат.Вставить("ВариантМодифицирован", Истина); + Результат.Вставить("ПользовательскиеНастройкиМодифицированы", Истина); + Результат.Вставить("СброситьПользовательскиеНастройки", Истина); + + Возврат Результат; + +КонецФункции + +Функция СобытияКонтекстнойНастройки() + + События = Новый Соответствие; + События.Вставить("ВставитьПолеСправа", Истина); + События.Вставить("ВставитьПолеСправа", Истина); + События.Вставить("ВставитьГруппировкуВыше", Истина); + События.Вставить("ВставитьГруппировкуНиже", Истина); + + События.Вставить("ПереместитьПолеВлево", Истина); + События.Вставить("ПереместитьПолеВправо", Истина); + События.Вставить("ПереместитьПолеВыше", Истина); + События.Вставить("ПереместитьПолеНиже", Истина); + + События.Вставить("СкрытьПоле", Истина); + События.Вставить("ПереименоватьПоле", Истина); + + События.Вставить("СнятьФильтр", Истина); + События.Вставить("Фильтровать", Истина); + События.Вставить("ФильтроватьИСформировать", Истина); + + События.Вставить("СортироватьПоВозрастанию", Истина); + События.Вставить("СортироватьПоУбыванию", Истина); + + События.Вставить("ОформитьКрасным", Истина); + События.Вставить("ОформитьЖелтым", Истина); + События.Вставить("ОформитьЗеленым", Истина); + + События.Вставить("ОформитьОтрицательные", Истина); + События.Вставить("ОформитьПоложительные", Истина); + + События.Вставить("УстановитьВысотуСтроки", Истина); + События.Вставить("УстановитьШиринуКолонки", Истина); + + События.Вставить("ОформитьЕще", Истина); + + Возврат События; + +КонецФункции + +Функция ДействиеНадПолемДоступно(Действие, СвойстваЗаголовка) + + Если Не СвойстваЗаголовка[Действие] Тогда + + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Действие недоступно для поля %1'"), СвойстваЗаголовка.Текст); + + ПоказатьПредупреждение(, ТекстПредупреждения); + + Возврат Ложь; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +#КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/ВариантыОтчетовСлужебныйКлиент.mdo b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/ВариантыОтчетовСлужебныйКлиент.mdo new file mode 100644 index 000000000..fdaab3624 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиент/ВариантыОтчетовСлужебныйКлиент.mdo @@ -0,0 +1,10 @@ + + + ВариантыОтчетовСлужебныйКлиент + + ru + Варианты отчетов служебный клиент + + true + true + diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl new file mode 100644 index 000000000..3de81f1b3 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/Module.bsl @@ -0,0 +1,174 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Процедура ОпределитьДоступностьДействийКонтекстногоМеню(Форма, СвойстваЗаголовка) Экспорт + + Если ТипЗнч(СвойстваЗаголовка) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + ДействияКонтекстногоМеню = ДействияКонтекстногоМенюОбластиЗаголовка(); + + Для Каждого Действие Из ДействияКонтекстногоМеню Цикл + Форма.Элементы[Действие.Ключ].Доступность = СвойстваЗаголовка[Действие.Значение]; + КонецЦикла; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ТекстСостояния - Строка +// КартинкаСостояния - Картинка +// - Неопределено +// +Процедура ОтобразитьСостояниеОтчета(Форма, Знач ТекстСостояния = "", Знач КартинкаСостояния = Неопределено) Экспорт + + ПолеОтчета = Форма.Элементы.Найти("РезультатОтчета"); + Если ПолеОтчета = Неопределено Тогда + Возврат; + КонецЕсли; + + ОтображатьСостояние = Не ПустаяСтрока(ТекстСостояния); + + Если КартинкаСостояния = Неопределено Или Не ОтображатьСостояние Тогда + КартинкаСостояния = Новый Картинка; + КонецЕсли; + + РежимОтображения = ДополнительныйРежимОтображения.НеИспользовать; + Если ОтображатьСостояние Тогда + РежимОтображения = ДополнительныйРежимОтображения.Неактуальность; + КонецЕсли; + + ОтображениеСостояния = ПолеОтчета.ОтображениеСостояния; + ОтображениеСостояния.Видимость = ОтображатьСостояние; + ОтображениеСостояния.ДополнительныйРежимОтображения = РежимОтображения; + ОтображениеСостояния.Картинка = КартинкаСостояния; + ОтображениеСостояния.Текст = ТекстСостояния; + + ПолеОтчета.ТолькоПросмотр = ОтображатьСостояние + Или ПолеОтчета.Вывод = ИспользованиеВывода.Запретить; + +КонецПроцедуры + +Функция ДействияКонтекстногоМенюОбластиЗаголовка() + + Действия = Новый Соответствие; + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаВставитьПолеСправа", "ВставитьПолеСправа"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаВставитьГруппировкуНиже", "ВставитьГруппировкуНиже"); + + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВлево", "ПереместитьПолеВлево"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВправо", "ПереместитьПолеВправо"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаПереместитьПолеВыше", "ПереместитьПолеВыше"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаПереместитьПолеНиже", "ПереместитьПолеНиже"); + + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаСортироватьПоВозрастанию", "СортироватьПоВозрастанию"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаСортироватьПоУбыванию", "СортироватьПоУбыванию"); + + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаОформитьОтрицательные", "ОформитьОтрицательные"); + Действия.Вставить("КонтекстноеМенюОбластиЗаголовкаОформитьПоложительные", "ОформитьПоложительные"); + + Возврат Действия; + +КонецФункции + +#Область Фильтры + +// Параметры: +// Настройки - НастройкиКомпоновкиДанных +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +Функция ГруппировкаФильтра(Настройки, СвойстваЗаголовка) Экспорт + + Если СвойстваЗаголовка.ИдентификаторНастроек = Неопределено Тогда + Возврат Настройки; + КонецЕсли; + + ИспользуемыеНастройки = Настройки.ПолучитьОбъектПоИдентификатору( + СвойстваЗаголовка.ИдентификаторНастроек); + + Если ИспользуемыеНастройки = Неопределено Тогда + ИспользуемыеНастройки = Настройки; + КонецЕсли; + + Если СвойстваЗаголовка.КоличествоРазделов = 1 Тогда + Раздел = ИспользуемыеНастройки; + Иначе + Раздел = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторРаздела); + КонецЕсли; + + Если ТипЗнч(Раздел) = Тип("ТаблицаКомпоновкиДанных") Тогда + + Если СтрНайти(СвойстваЗаголовка.ИдентификаторГруппировки, "/column/") > 0 + И Раздел.Строки.Количество() > 0 Тогда + + Возврат Раздел.Строки[0]; + + Иначе + + Группировка = ИспользуемыеНастройки.ПолучитьОбъектПоИдентификатору(СвойстваЗаголовка.ИдентификаторГруппировки); + Возврат Группировка; + + КонецЕсли; + + КонецЕсли; + + Возврат Раздел; + +КонецФункции + +// Параметры: +// Настройки - НастройкиКомпоновкиДанных +// СвойстваЗаголовка - см. ВариантыОтчетовСлужебный.СтандартныеСвойстваЗаголовкаОтчета +// +// Возвращаемое значение: +// ОтборКомпоновкиДанных +// +Функция ФильтрыРазделаОтчета(Настройки, СвойстваЗаголовка) Экспорт + + ГруппировкаФильтра = ГруппировкаФильтра(Настройки, СвойстваЗаголовка); + Возврат ГруппировкаФильтра.Отбор; + +КонецФункции + +// Параметры: +// Фильтры - ОтборКомпоновкиДанных +// Поле - ПолеКомпоновкиДанных +// +// Возвращаемое значение: +// ЭлементОтбораКомпоновкиДанных +// Неопределено +// +Функция ФильтрРазделаОтчета(Фильтры, Поле) Экспорт + + Для Каждого Элемент Из Фильтры.Элементы Цикл + + Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") + И Элемент.ЛевоеЗначение = Поле Тогда + + Возврат Элемент; + КонецЕсли; + + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +#КонецОбласти + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/ВариантыОтчетовСлужебныйКлиентСервер.mdo b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/ВариантыОтчетовСлужебныйКлиентСервер.mdo new file mode 100644 index 000000000..15b01bbd5 --- /dev/null +++ b/SSL/src/CommonModules/ВариантыОтчетовСлужебныйКлиентСервер/ВариантыОтчетовСлужебныйКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + ВариантыОтчетовСлужебныйКлиентСервер + + ru + Варианты отчетов служебный клиент-сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl index 8ef2d5867..a91403e4c 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -84,7 +84,7 @@ // СписокОбъектов - Массив - список имен объектов метаданных. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя объекта метаданных. // * Значение - Булево - включено или выключено версионирование. // @@ -152,7 +152,7 @@ // Включает запись истории изменения для указанных объектов метаданных. // // Параметры: -// Объекты - Соответствие - объекты, для которых надо включить версионирование: +// Объекты - Соответствие из КлючИЗначение - объекты, для которых надо включить версионирование: // * Ключ - Строка - полный путь к объекту метаданных. Например, "Справочник.Номенклатура". // * Значение - ПеречислениеСсылка.ВариантыВерсионированияОбъектов - вариант версионирования объекта. // @@ -279,9 +279,9 @@ // Устанавливает признак игнорирования версии объекта. // // Параметры: -// Ссылка - ссылка на игнорируемый объект. -// НомерВерсии - Число - номер версии игнорируемого объекта. -// Игнорировать - Булево - признак игнорирования версии. +// Ссылка - ЛюбаяСсылка - ссылка на игнорируемый объект. +// НомерВерсии - Число - номер версии игнорируемого объекта. +// Игнорировать - Булево - признак игнорирования версии. // Процедура ИгнорироватьВерсиюОбъекта(Ссылка, НомерВерсии, Игнорировать) Экспорт @@ -317,15 +317,15 @@ // Возвращает количество коллизий или непринятых объектов. // // Параметры: -// УзлыОбмена - ПланОбменаСсылка -// - Массив -// - СписокЗначений -// - Неопределено - отбор для получения количества коллизий. -// ЭтоКоличествоКоллизий - Булево - если Истина, то возвращает количество коллизий, иначе количество непринятых. -// ПоказыватьПроигнорированные - Булево - признак необходимости учета проигнорированных. -// УзелИнформационнойБазы - ПланОбменаСсылка - отбор по конкретному узлу. -// Период - СтандартныйПериод - отбор по периоду. -// СтрокаПоиска - Строка - отбор по в комментарию. +// УзлыОбмена - ПланОбменаСсылка +// - Массив +// - СписокЗначений +// - Неопределено - отбор для получения количества коллизий. +// ЭтоКоличествоКоллизий - Булево - если Истина, то возвращает количество коллизий, иначе количество непринятых. +// ПоказыватьПроигнорированные - Булево - признак необходимости учета проигнорированных. +// УзелИнформационнойБазы - ПланОбменаСсылка - отбор по конкретному узлу. +// Период - СтандартныйПериод - отбор по периоду. +// СтрокаПоиска - Строка - отбор по в комментарию. // Функция КоличествоКоллизийИлиНепринятых(УзлыОбмена, ЭтоКоличествоКоллизий, ПоказыватьПроигнорированные, Период, СтрокаПоиска) Экспорт @@ -436,8 +436,8 @@ // либо в случае отказа от записи документов в результате непрохождения проверки по дате запрета изменения. // // Параметры: -// Список - ДинамическийСписок - инициализируемый динамический список. -// ВидПроблемы - Строка - коллизии - происходит инициализация списка коллизий, +// Список - ДинамическийСписок - инициализируемый динамический список. +// ВидПроблемы - Строка - коллизии - происходит инициализация списка коллизий, // НепринятыеПоДате - непринятых по дате. // Процедура ИнициализацияДинамическогоСпискаПроблемныхВерсий(Список, ВидПроблемы = "Коллизии") Экспорт @@ -524,10 +524,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.ПолноеИмя()); @@ -910,10 +906,10 @@ // Обработчик перехода на версию объекта. // // Параметры: -// ОбъектСсылка - Ссылка - ссылка на объект, для которого имеется версия. -// НомерВерсииДляПерехода - Число - номер версии, на которую необходимо выполнить переход. -// НомерИгнорируемойВерсии - Число - номер версии, на которую необходимо проигнорировать. -// ПропуститьПроверкуЗапретаИзменения - Булево - признак пропуска проверки даты запрета загрузки. +// ОбъектСсылка - ЛюбаяСсылка - ссылка на объект, для которого имеется версия. +// НомерВерсииДляПерехода - Число - номер версии, на которую необходимо выполнить переход. +// НомерИгнорируемойВерсии - Число - номер версии, на которую необходимо проигнорировать. +// ПропуститьПроверкуЗапретаИзменения - Булево - признак пропуска проверки даты запрета загрузки. // Процедура ПриПереходеНаВерсиюОбъекта(СсылкаНаОбъект, Знач НомерВерсии) Экспорт @@ -965,10 +961,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1189,7 +1183,7 @@ // Записывает версию объекта в информационную базу. // // Параметры: -// Объект - для создания версии. +// Объект - для создания версии. // Процедура ПриСозданииВерсииОбъекта(Объект, РежимЗаписи) @@ -1414,10 +1408,10 @@ // Возвращает вариант версионирования для указанного объекта метаданных. // // Параметры: -// ТипОбъекта - СправочникСсылка.ИдентификаторОбъектаМетаданных - ИОМ. +// ТипОбъекта - СправочникСсылка.ИдентификаторыОбъектовМетаданных - объект. // // Возвращаемое значение: -// Перечисление.ВариантыВерсионированияОбъектов. +// ПеречислениеСсылка.ВариантыВерсионированияОбъектов. // Функция ВариантВерсионированияОбъекта(ТипОбъекта) @@ -1432,7 +1426,8 @@ // АдресВоВременномХранилище - Строка - адрес двоичных данных во временном хранилище. // ТекстСообщенияОбОшибке - Строка - текст ошибки (возвращаемый параметр), если восстановить объект не удалось. // -// Возвращаемое значение - объект или Неопределено. +// Возвращаемое значение: +// Произвольный - объект или Неопределено, если не удалось восстановить объект. // Функция ВосстановитьОбъектПоXML(ДанныеОбъекта, ТекстСообщенияОбОшибке = "") @@ -1465,13 +1460,14 @@ // Возвращает структуру, содержащую версию объекта и дополнительную информацию. // // Параметры: -// Ссылка - Ссылка - ссылка версионируемый объект; +// Ссылка - ЛюбаяСсылка - ссылка версионируемый объект; // НомерВерсии - Число - номер версии объекта. // -// Возвращаемое значение - Структура: +// Возвращаемое значение: +// Структура: // ВерсияОбъекта - ДвоичныеДанные - сохраненная версия объекта информационной базы; -// АвторВерсии - Справочник.Пользователи -// - Справочник.ВнешниеПользователи - +// АвторВерсии - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи - // пользователь, записавший версию объекта. // ДатаВерсии - Дата - дата записи версии объекта. // @@ -1733,9 +1729,9 @@ КонецФункции // Параметры: -// ЭлементДанных -// ОтправкаЭлемента - ОтправкаЭлементаДанных -// Получатель - ПланОбменаОбъект +// ЭлементДанных +// ОтправкаЭлемента - ОтправкаЭлементаДанных +// Получатель - ПланОбменаОбъект // Процедура ПриОтправкеДанныхПолучателю(ЭлементДанных, ОтправкаЭлемента, Получатель) @@ -1931,7 +1927,7 @@ // Возвращает сериализованный объект в виде двоичных данных. // // Параметры: -// Объект - Любой - сериализуемый объект. +// Объект - Произвольный - сериализуемый объект. // // Возвращаемое значение: // ДвоичныеДанные - сериализованный объект. @@ -1962,7 +1958,7 @@ // ** ЗначениеРеквизита - Произвольный // ** ТипРеквизита - Строка // ** Тип - Тип -// * ТабличныеЧасти - Соответствие: +// * ТабличныеЧасти - Соответствие из КлючИЗначение: // ** Ключ - Строка // ** Значение - ТаблицаЗначений // * ТабличныеДокументы - см. ВерсионированиеОбъектовПереопределяемый.ПриПолученииТабличныхДокументовОбъекта.ТабличныеДокументы @@ -3230,7 +3226,7 @@ // Для вызова из ПриПолученииДанныхОтГлавного и ПриПолученииДанныхОтПодчиненного. // // Параметры: -// Отправитель +// Отправитель // Процедура ЗаписатьВерсиюСИзменениемНомера(ЭлементДанных, ПолучениеЭлемента, Отправитель, НомерВерсии) diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl index 7a8a9271c..4f2326802 100644 --- a/SSL/src/CommonModules/Взаимодействия/Module.bsl +++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl @@ -338,7 +338,7 @@ // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - ссылка на взаимодействие. // // Возвращаемое значение: -// ОпределяемыйТип.ПредметВзаимодействия, Неопределено +// ОпределяемыйТип.ПредметВзаимодействия, Неопределено // Функция ПредметВзаимодействия(Взаимодействие) Экспорт @@ -382,10 +382,6 @@ Возврат ПолучитьФункциональнуюОпцию("ИспользоватьПрочиеВзаимодействия"); КонецФункции -Функция ОтправлятьПисьмаВФорматеHTML() Экспорт - Возврат ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML"); -КонецФункции - // Возвращает список контактов предмету по заданному типу контактной информации. // Функция ПолучитьКонтактыПоПредмету(Предмет, ТипыКонтактнойИнформации) Экспорт @@ -601,7 +597,7 @@ ИначеЕсли ПисьмоHTML Тогда ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.Идентификатор); - ПрисоединенныйФайл = МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка, + МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка, Вложение.АдресВоВременномХранилище, ПараметрыВложения); КонецЕсли; @@ -856,10 +852,6 @@ КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. -// -// Параметры: -// Типы См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.РегистрыСведений.ЗаблокированныеДляПолученияУчетныеЗаписи); КонецПроцедуры @@ -973,10 +965,6 @@ КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. -// -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ОбновлениеСтатусовДоставкиSMS"); @@ -985,10 +973,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1039,10 +1025,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1145,10 +1127,6 @@ КонецПроцедуры // См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. -// -// Параметры: -// Объекты - см. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.Объекты -// Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.Документы.Встреча); @@ -1160,9 +1138,7 @@ КонецПроцедуры -// Параметры: -// ПодчиненныеОбъекты - см. ОбщегоНазначения.ПодчиненныеОбъекты -// +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов Процедура ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты) Экспорт ПодчиненныйОбъект = ПодчиненныеОбъекты.Добавить(); @@ -1173,14 +1149,16 @@ КонецПроцедуры +// АПК:299-выкл программно вызываемая процедура +// // Вызывается при замене дублей в реквизитах элементов. // // Параметры: -// ПарыЗамен - Соответствие - содержит пары значений оригинал и дубль. -// НеобработанныеЗначенияОригиналов - Массив из Структура: -// * ЗаменяемоеЗначение - ЛюбаяСсылка - оригинальное значение заменяемого объекта. -// * ИспользуемыеСвязи - см. ПоискИУдалениеДублей.СвязиПодчиненныхОбъектовПоТипам. -// * ЗначениеКлючевыхРеквизитов - Структура - Ключ - имя реквизита, значение - значение реквизита. +// ПарыЗамен - Соответствие - содержит пары значений оригинал и дубль. +// НеобработанныеЗначенияОригиналов - Массив из Структура: +// * ЗаменяемоеЗначение - ЛюбаяСсылка - оригинальное значение заменяемого объекта. +// * ИспользуемыеСвязи - см. ПоискИУдалениеДублей.СвязиПодчиненныхОбъектовПоТипам. +// * ЗначениеКлючевыхРеквизитов - Структура - Ключ - имя реквизита, значение - значение реквизита. // Процедура ПриПоискеЗаменыСсылок(ПарыЗамен, НеобработанныеЗначенияОригиналов) Экспорт @@ -1215,6 +1193,7 @@ КонецЦикла; КонецПроцедуры +//// АПК:299-вкл // Проверяет, выполняется ли фоновое задание по отправке и получению писем. // @@ -1454,7 +1433,7 @@ // или участниках предмета взаимодействия. // // Параметры: -// ТаблицаКонтактов - Документ.ТабличнаяЧасть - содержащая описания и ссылки на контакты взаимодействия +// ТаблицаКонтактов - ТабличнаяЧасть - содержащая описания и ссылки на контакты взаимодействия // или участников предмета взаимодействия. // Функция ПреобразоватьТаблицуКонтактовВМассив(ТаблицаКонтактов) Экспорт @@ -1520,12 +1499,12 @@ // Возвращает таблицу всех контактов, связанных с предметом взаимодействия. // Параметры: -// Предмет - предмет взаимодействия, -// ВключатьEmail - вернуть e-mail адреса даже если контакт не определен. +// Предмет - ОпределяемыйТип.ПредметВзаимодействия - предмет взаимодействия. +// ВключатьEmail - Булево - признак необходимости вернуть e-mail адреса даже если контакт не определен. // // Возвращаемое значение: // ТаблицаЗначений - таблица значений содержащая информацию о контактах: -// * Ссылка - ОпределяемыйТип.КонтактВзаимодействия - контакт. +// * Ссылка - ОпределяемыйТип.ПредметВзаимодействия - контакт. // * Наименование - Строка - наименование контакта. // * НаименованиеВладельца - Строка - наименование владельца контакта. // @@ -2287,7 +2266,7 @@ | И &УсловиеИерархический | И (НЕ ТаблицаСправочника.ПометкаУдаления)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование", """""")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименованиеВладельца", ?(ЭлементМассиваОписания.ЕстьВладелец," ТаблицаСправочника.Владелец.Наименование","""")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПоляНаименование", "ТаблицаСправочника." + ЭлементМассиваОписания.ИмяРеквизитаПредставлениеКонтакта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСправочника", "Справочник." +ЭлементМассиваОписания.Имя); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеИерархический", ?(ЭлементМассиваОписания.Иерархический," И (НЕ ТаблицаСправочника.ЭтоГруппа)","")); @@ -2374,9 +2353,8 @@ // поиска контактов по предмету. // // Параметры: -// ЭлементыФормы - КоллекцияЭлементовУправляемойФормы - предоставляет доступ к элементам формы. -// Предмет - СправочникСсылка -// - ДокументСсылка - предмет взаимодействия. +// ЭлементыФормы - ВсеЭлементыФормы - предоставляет доступ к элементам формы. +// Предмет - ОпределяемыйТип.ПредметВзаимодействия - предмет взаимодействия. // КонтактыПоПредмету - ТаблицаЗначений - реквизит формы, в который помещаются найденные контакты. // ВключатьEmail - Булево - признак необходимости получения данных о электронном адресе контакта. // @@ -2649,10 +2627,10 @@ // Заполняет табличную часть участники у документов Встреча и Запланированное взаимодействие. // // Параметры: -// Контакты - Массив - массив, содержащий участников взаимодействия. -// Участники - ТабличнаяЧасть - табличная часть документа, которая будет заполнена +// Контакты - Массив - массив, содержащий участников взаимодействия. +// Участники - ТабличнаяЧасть - табличная часть документа, которая будет заполнена // на основании массива. -// ТипКонтактнойИнформации - Перечисления.ТипыКонтактнойИнформации - если указано, +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - если указано, // то будет наложен отбор по данном типу контактной информации. // РазбиватьПоКоличествуАдресов - Булево - если истина, то для контакта будет создано столько строк в ТЧ "Участники", // сколько для него получено различных видов заполненной контактной информации. @@ -2730,7 +2708,7 @@ // Контакт - СправочникСсылка - контакт, на основании данных которого будут заполнены прочие поля. // Представление - Строка - представление контакта. // Адрес - Строка - контактная информация контакта. -// ТипКонтактнойИнформации - Перечисления.ТипыКонтактнойИнформации - контактная информация контакта. +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - контактная информация контакта. // Процедура ДозаполнитьПоляКонтактов(Контакт, Представление, Адрес, ТипКонтактнойИнформации = Неопределено) Экспорт @@ -2789,7 +2767,7 @@ // Формирует список выбора для быстрого отбора по типу взаимодействий при использовании только почтового клиента. // // Параметры: -// Элемент - ЭлементФормы - элемент, для которого формируется список выбора. +// Элемент - ПолеФормы - элемент, для которого формируется список выбора. // Процедура СформироватьСписокВыбораТипВзаимодействияТолькоПочта(Элемент) @@ -3116,14 +3094,6 @@ КонецФункции -// Выполняет отправку электронного письма. -// -// Параметры: -// Объект - ДокументОбъект.ЭлектронноеПисьмоИсходящее - отправляемое письмо. -// -// Возвращаемое значение: -// Строка - идентификатор почтового сообщения. -// Процедура ДобавитьВПараметрАдресатов(Источник, ПараметрыПисьма, ИмяПараметра, ИмяТаблицы) Экспорт Если ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура") ИЛИ ТипЗнч(Источник) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") @@ -3834,6 +3804,10 @@ КонецПроцедуры +Функция ОтправлятьПисьмаВФорматеHTML() + Возврат ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML"); +КонецФункции + #Область ОбработчикиОбновления Процедура ОтключитьПодсистемуВМоделиСервиса() Экспорт @@ -3857,8 +3831,7 @@ // Динамически формирует общие формы "Адресная книга" и "Подбор контактов" согласно возможным типам контактов. // // Параметры: -// Форма - ФормаКлиентскогоПриложения: -// * ИменаДобавленныхТаблиц - СписокЗначений +// Форма - см. ОбщаяФорма.ВыборКонтакта // Процедура ДобавитьСтраницыФормыПодбораКонтактов(Форма) Экспорт @@ -4479,7 +4452,7 @@ // Функция ФорматСообщенияПоУмолчанию(Пользователь) Экспорт - Если Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") Тогда + Если Не ОтправлятьПисьмаВФорматеHTML() Тогда Возврат Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст; КонецЕсли; @@ -4631,7 +4604,7 @@ // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - письмо для которого будет проведена оценка. // // Возвращаемое значение: -// ВыборкаИзРезультатовЗапроса - оценка размера письма в байтах. +// ВыборкаИзРезультатаЗапроса - данные письма основания. // Функция ПолучитьДанныеПисьмаОснования(Письмо) Экспорт @@ -4748,7 +4721,7 @@ // ТаблицаПолучателей - ТабличнаяЧасть - табличная часть для которой выполняется функция. // // Возвращаемое значение: -// СтрокаКВозврату - строка с представление всех получателей табличной части. +// Строка - строка с представление всех получателей табличной части. // Функция ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателей) Экспорт @@ -5072,12 +5045,14 @@ // Добавляет дочерний элемент с атрибутами. // // Параметры: -// ЭлементРодитель - ЭлементHTML - элемент,к которому будет добавлен дочерний элемент. +// ЭлементРодитель - ЭлементHTML - элемент,к которому будет добавлен дочерний элемент. // Имя - Строка - имя элемента HTML. -// Атрибуты - Соответствие - ключ содержит имя атрибута, значение текстовое содержимое. +// Атрибуты - Соответствие из КлючИЗначение: +// * Ключ - Строка - имя атрибута; +// * Значение - Строка - текстовое содержимое. // // Возвращаемое значение: -// ЭлементHTML - добавленный элемент. +// ЭлементHTML - добавленный элемент. // Функция ДобавитьЭлементСАтрибутами(ЭлементРодитель, Имя, Атрибуты) @@ -5106,17 +5081,7 @@ КонецФункции -// Добавляет текстовый узел в ДокументHTML. -// -// Параметры: -// ЭлементРодитель - ЭлементHTML - элемент,к которому будет добавлен дочерний элемент. -// Текст - Строка - содержимое текстового узла. -// Атрибуты - Соответствие - ключ содержит имя атрибута, значение текстовое содержимое. -// -// Возвращаемое значение: -// ЭлементHTML - добавленный элемент. -// -Процедура ДобавитьТекстовыйУзел(ЭлементРодитель, Текст, ВыделятьЖирным = Ложь,ДобавлятьПереносСтроки = Ложь) +Процедура ДобавитьТекстовыйУзел(ЭлементРодитель, Текст, ВыделятьЖирным = Ложь, ДобавлятьПереносСтроки = Ложь) ДокументВладелец = ЭлементРодитель.ДокументВладелец; @@ -5354,7 +5319,7 @@ // статус. // // Возвращаемое значение: -// Перечисления.СостоянияДокументаСообщениеSMS - рассчитанный статус документа. +// ПеречислениеСсылка.СостоянияДокументаСообщениеSMS - рассчитанный статус документа. // Функция СостояниеДокументаСообщениеSMS(СообщениеSMS) @@ -5437,10 +5402,10 @@ // состояния сообщения SMS подсистемы Взаимодействия. // // Параметры: -// СтатусДоставки - Перечисления.СтатусыДоставкиSMS - значение, которое необходимо преобразовать. +// СтатусДоставки - Строка - значение, которое необходимо преобразовать. // // Возвращаемое значение: -// Перечисления.СостоянияСообщенияSMS - преобразованное значение. +// ПеречислениеСсылка.СостоянияСообщенияSMS - преобразованное значение. // Функция СостояниеСообщенияSMSСогласноСтатусуДоставки(СтатусДоставки); @@ -7343,8 +7308,8 @@ // Процедура заполняет список выбора времени. // Параметры: -// ПолеВводаФормы - элемент-владелец списка, -// Интервал - интервал, с которым необходимо заполнить список, по умолчанию час. +// ПолеВводаФормы - ПолеФормы - элемент формы, к которому относится список выбора. +// Интервал - Число - интервал в секундах, с которым необходимо заполнить список, по умолчанию час. // Процедура ЗаполнитьСписокВыбораВремени(ПолеВводаФормы, Интервал = 3600) Экспорт @@ -7490,7 +7455,6 @@ ТекстСоединениеТаблицаКонтактов = ""; Иначе ТекстПредмет = "ЕСТЬNULL(ПредметыВзаимодействий.Предмет, НЕОПРЕДЕЛЕНО)"; - ТекстРазличные = ""; ТекстОтборКонтакт = ", |КонтактыВзаимодействий.Контакт"; ТекстСоединениеТаблицаКонтактов = "{ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий @@ -8117,7 +8081,7 @@ // Параметры: // Папка - Справочник.ПапкиЭлектронныхПисем - папка, имеет смысл для документов "Электронное письмо входящее" // и "Электронное письмо исходящее". -// Предмет - СправочникСсылка, ДокументСсылка, указывает на предмет взаимодействия. +// Предмет - СправочникСсылка, ДокументСсылка - указывает на предмет взаимодействия. // Рассмотрено - Булево - признак рассмотрения взаимодействия. // РассмотретьПосле - ДатаВремя - дата, до которой отложено рассмотрение взаимодействия. // РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний папки и предмета. @@ -8151,7 +8115,7 @@ // Определяет, является ли переданная в функцию ссылка контактом. // // Параметры: -// ОбъектСсылка - Ссылка - для которой выполняется проверка. +// ОбъектСсылка - ЛюбаяСсылка - для которой выполняется проверка. // // Возвращаемое значение: // Булево - истина, если является контактом, ложь в обратном случае. @@ -8317,8 +8281,8 @@ // Получает взаимодействия из цепочки по предмету взаимодействия. // // Параметры: -// Цепочка - Ссылка - предмет взаимодействия для которого получаются взаимодействия. -// Исключать - Ссылка - взаимодействие, которое не должно попасть в результирующий массив. +// Цепочка - ЛюбаяСсылка - предмет взаимодействия для которого получаются взаимодействия. +// Исключать - ЛюбаяСсылка - взаимодействие, которое не должно попасть в результирующий массив. // // Возвращаемое значение: // Массив - найденные взаимодействия. @@ -8683,7 +8647,7 @@ КонецПроцедуры -// Обработчик события при записи, возникающих в формах документов взаимодействий. +// Обработчик события при записи, возникающего в формах документов взаимодействий. // // Параметры: // ТекущийОбъект - ДокументОбъект - документ, в котором возникло событие. @@ -8800,11 +8764,12 @@ КонецПроцедуры -// Обработчик события перед записью, возникающих в формах документов взаимодействий. +// Обработчик события перед записью, возникающего в формах документов взаимодействий. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма в которой произошло событие. // ТекущийОбъект - ДокументОбъект - документ, в котором возникло событие. +// ИзменилисьКонтакты - Булево - признак того, что изменения контактов взаимодействия нужно записать. // Процедура ПередЗаписьюВзаимодействияИзФормы(Форма, ТекущийОбъект, ИзменилисьКонтакты = Ложь) Экспорт @@ -8873,9 +8838,9 @@ // Заменяет предмет в цепочке взаимодействий. // // Параметры: -// Цепочка - Ссылка - предмет взаимодействий, который будет заменен. -// Предмет - Ссылка - предмет, на который будет выполнена замена. -// Исключать - Ссылка - взаимодействие, в котором операция замены выполнена не будет. +// Цепочка - ЛюбаяСсылка - предмет взаимодействий, который будет заменен. +// Предмет - ЛюбаяСсылка - предмет, на который будет выполнена замена. +// Исключать - ЛюбаяСсылка - взаимодействие, в котором операция замены выполнена не будет. // Процедура ЗаменитьПредметВЦепочкеВзаимодействий(Цепочка, Предмет, Исключать = Неопределено) diff --git a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl index c68aa3301..581015364 100644 --- a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl @@ -74,7 +74,7 @@ // Получает наименование и адреса электронной почты контакта. // // Параметры: -// Контакт - Ссылка - контакт, для которого получаются данные. +// Контакт - ЛюбаяСсылка - контакт, для которого получаются данные. // // Возвращаемое значение: // Структура - содержит наименование контакта и список значений электронной почты контакта. @@ -268,7 +268,7 @@ // // Параметры: // МассивВзаимодействий - Массив - массив взаимодействий для которых будет установлен предмет. -// Предмет - Ссылка - предмет, на который будет выполнена замена. +// Предмет - ЛюбаяСсылка - предмет, на который будет выполнена замена. // ПроверятьНаличиеДругихЦепочек - Булево - если Истина, то будет выполнена замена предмета и для взаимодействий, // которые входят в цепочки взаимодействий первым взаимодействием которых // является взаимодействие входящее в массив. @@ -348,7 +348,7 @@ ДанныеПисьма = Взаимодействия.ИнтернетПочтовоеСообщениеИзПисьма(Письмо); Если ДанныеПисьма <> Неопределено Тогда - ДвоичныеДанные = ДанныеПисьма.ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные(); + ДвоичныеДанные = ДанныеПисьма.ИнтернетПочтовоеСообщение.ПолучитьИсходныеДанные(); // ДвоичныеДанные ДанныеФайла.СсылкаНаДвоичныеДанныеФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор); ДанныеФайла.Наименование = Взаимодействия.ПредставлениеПисьма(ДанныеПисьма.ИнтернетПочтовоеСообщение.Тема, diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl index 4888a32e2..7d21f20c7 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl @@ -13,7 +13,7 @@ // Параметры: // ПараметрыФормы - см. ВзаимодействияКлиент.ПараметрыФормыОтправкиSMS. // УдалитьТекст - Строка - не используется. -// УдалитьПредмет - Ссылка - не используется. +// УдалитьПредмет - ЛюбаяСсылка - не используется. // УдалитьОтправлятьВТранслите - Булево - не используется. // Процедура ОткрытьФормуОтправкиSMS(Знач ПараметрыФормы = Неопределено, @@ -39,7 +39,7 @@ // - СписокЗначений // - Массив - список получателей письма. // * Текст - Строка - текст письма. -// * Предмет - Ссылка - предмет письма. +// * Предмет - ЛюбаяСсылка - предмет письма. // * ОтправлятьВТранслите - Булево - признак того, что сообщение при отправке должно быть преобразовано в латинские // символы. // @@ -254,9 +254,10 @@ // Открывает форму объекта-контакта заполненную по описанию участника взаимодействия. // Параметры: -// Описание - текстовое описание контакта, -// Адрес - контактная информация, -// Основание - объект, из которого создается контакт. +// Описание - Строка - текстовое описание контакта. +// Адрес - Строка - контактная информация. +// Основание - ДокументОбъект - документ взаимодействия, из которого создается контакт. +// ТипыКонтактов - СписокЗначений - список возможных типов контактов. // Процедура СоздатьКонтакт(Описание, Адрес, Основание, ТипыКонтактов) Экспорт @@ -321,7 +322,7 @@ // ** СоздатьКонтакт - КнопкаФормы - элемент, выполняющий команду создания взаимодействия. // ИмяСобытия - Строка - имя события. // Параметр - Структура: -// * ТипОповещения - строка - информация о типе оповещения. +// * ТипОповещения - Строка - информация о типе оповещения. // * Основание - ОпределяемыйТип.КонтактВзаимодействия // // Источник - Произвольный - источник события. @@ -557,7 +558,7 @@ // Параметры: // ЗначениеПоля - Дата - значение поля "Отработать после". // ВыбранноеЗначение - Дата -// - число - либо выбранная дата, либо числовой инкремент от текущей даты. +// - Число - либо выбранная дата, либо числовой инкремент от текущей даты. // СтандартнаяОбработка - Булево - признак стандартной обработки обработчика события формы. // Модифицированность - Булево - признак модифицированности формы. // @@ -579,7 +580,7 @@ // // Параметры: // Элемент - ТаблицаФормы - таблица в которой произошло событие, содержит: -// * ТекущиеДанные - СтрокаТаблицыЗначений - содержит: +// * ТекущиеДанные - СтрокаТаблицыЗначений: // ** Ссылка - ОпределяемыйТип.КонтактВзаимодействия - контакт. // Форма - ФормаКлиентскогоПриложения - форма, на которой находятся элементы. // @@ -611,7 +612,7 @@ // // Параметры: // Элемент - ТаблицаФормы - список в который происходит добавление, содержит: -// * ТекущиеДанные - СтрокаТаблицыЗначений - содержит: +// * ТекущиеДанные - СтрокаТаблицыЗначений: // ** Ссылка - ДокументСсылка.ТелефонныйЗвонок // - ДокументСсылка.ЗапланированноеВзаимодействие // - ДокументСсылка.СообщениеSMS @@ -796,7 +797,7 @@ // Определяет, является ли переданная в функцию ссылка взаимодействием. // // Параметры: -// ОбъектСсылка - Ссылка - для которой, необходимо выполнить проверку. +// ОбъектСсылка - ЛюбаяСсылка - для которой, необходимо выполнить проверку. // // Возвращаемое значение: // Булево - Истина, если переданная ссылка является взаимодействием. diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl index 5e168d213..d2cbc4bb5 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl @@ -115,7 +115,7 @@ // Определяет, является ли переданная в функцию ссылка взаимодействием. // // Параметры: -// ОбъектСсылка - Ссылка - для которой необходимо выполняется проверка. +// ОбъектСсылка - ЛюбаяСсылка - для которой необходимо выполняется проверка. // // Возвращаемое значение: // Булево - истина, если переданная ссылка является взаимодействием. @@ -140,7 +140,7 @@ // Определяет, является ли переданная в функцию ссылка присоединенным файлом взаимодействий. // // Параметры: -// ОбъектСсылка - Ссылка - для которой необходимо выполняется проверка. +// ОбъектСсылка - ЛюбаяСсылка - для которой необходимо выполняется проверка. // // Возвращаемое значение: // Булево - истина, если переданная ссылка является присоединенным файлом взаимодействий. @@ -159,7 +159,7 @@ // Проверяет, является ли переданная ссылка предметом взаимодействий. // // Параметры: -// ОбъектСсылка - Ссылка - ссылка, для которой выполняется проверка, +// ОбъектСсылка - ЛюбаяСсылка - ссылка, для которой выполняется проверка, // является ли она ссылкой на предмет взаимодействий. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl index 145824e36..043fff903 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыКлиент/Module.bsl @@ -46,10 +46,11 @@ // Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами: // * Результат - Структура - результат подключения компоненты: // ** Подключено - Булево - признак подключения; -// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты; -// - ФиксированноеСоответствие - экземпляры объектов внешней компоненты, -// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов; -// Ключ - Идентификатор, Значение - экземпляр объекта. +// ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, +// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: +// *** Ключ - Строка - идентификатор внешней компоненты; +// *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. // ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. // * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. // Идентификатор - Строка - идентификатор объекта внешней компоненты. @@ -108,17 +109,16 @@ // Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами: // * Результат - Структура - результат подключения компоненты: // ** Подключено - Булево - признак подключения. -// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. // ** ОписаниеОшибки - Строка - краткое описание ошибки. // * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. // Идентификатор - Строка - идентификатор объекта внешней компоненты. -// ИдентификаторСозданияОбъекта - Строка - (необязательный) идентификатор создания экземпляра модуля объекта +// ИдентификаторСозданияОбъекта - Строка - идентификатор создания экземпляра модуля объекта // (только для компонент, у которых идентификатор создания объекта отличается от ProgID). // // Пример: // // Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект); -// // ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows(Оповещение, "SBRFCOMObject", "SBRFCOMExtension"); // // &НаКлиенте @@ -184,7 +184,7 @@ // ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. // * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. // Идентификатор - Строка - идентификатор объекта внешней компоненты. -// Версия - Строка - (необязательный) версия компоненты. +// Версия - Строка - версия компоненты. // ПараметрыУстановки - см. ПараметрыУстановки. // // Пример: @@ -255,7 +255,7 @@ // Структура: // * Идентификатор - Строка -(необязательный) идентификатор объекта внешней компоненты. // * Версия - Строка - (необязательный) версия компоненты. -// * ПараметрыПоискаДополнительнойИнформации - Соответствие - (необязательный) параметры: +// * ПараметрыПоискаДополнительнойИнформации - Соответствие из КлючИЗначение - (необязательный) параметры: // ** Ключ - Строка - идентификатор дополнительной запрошенной информации. // ** Значение - см. ПараметрыПоискаДополнительнойИнформации. // Пример: @@ -284,7 +284,7 @@ // ** Идентификатор - Строка - идентификатор объекта внешней компоненты. // ** Версия - Строка - версия загруженной компоненты. // ** Наименование - Строка - наименование загруженной компоненты. -// ** ДополнительнаяИнформация - Соответствие - дополнительная информация о компоненте, +// ** ДополнительнаяИнформация - Соответствие из КлючИЗначение - дополнительная информация о компоненте, // если не запрашивалась - пустое соответствие: // *** Ключ - см. ПараметрыПоискаДополнительнойИнформации. // *** Значение - см. ПараметрыПоискаДополнительнойИнформации. diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl index fb48578f1..52ed55336 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСервер/Module.bsl @@ -12,7 +12,7 @@ // // Возвращаемое значение: // Структура: -// * ИдентификаторыСозданияОбъектов - Массив Из Строка - идентификаторы экземпляров модуля объекта, +// * ИдентификаторыСозданияОбъектов - Массив из Строка - идентификаторы экземпляров модуля объекта, // используется только для компонент, у которых есть несколько идентификаторов создания объектов. // При задании параметр Идентификатор будет использоваться только для определения компоненты. // @@ -37,11 +37,11 @@ // Возвращаемое значение: // Структура - результат подключения компоненты: // * Подключено - Булево - признак подключения; -// * ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты; -// - ФиксированноеСоответствие - экземпляры объектов внешней компоненты, +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, // указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: // ** Ключ - Строка - идентификатор, -// ** Значение - AddIn - экземпляр объекта внешней компоненты. +// ** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. // * ОписаниеОшибки - Строка - краткое описание ошибки. // Функция ПодключитьКомпоненту(Знач Идентификатор, Версия = Неопределено, ПараметрыПодключения = Неопределено) Экспорт @@ -113,7 +113,7 @@ // ** ИмяФайла - Строка - имя файла. // ** АдресФайла - Строка - адрес файла. // ** КодОшибки - Строка - код ошибки. -// АдресРезультата - Строка - (необязательный) адрес временного хранилища. +// АдресРезультата - Строка - адрес временного хранилища. // Если указан, в него будет помещено описание результата операции. // Процедура ОбновитьВнешниеКомпоненты(ДанныеВнешнихКомпонент, АдресРезультата = Неопределено) Экспорт @@ -127,6 +127,7 @@ "ВЫБРАТЬ | ВнешниеКомпоненты.Ссылка КАК Ссылка, | ВнешниеКомпоненты.Идентификатор КАК Идентификатор, + | ВнешниеКомпоненты.Версия КАК Версия, | ВнешниеКомпоненты.ДатаВерсии КАК ДатаВерсии |ИЗ | Справочник.ВнешниеКомпоненты КАК ВнешниеКомпоненты @@ -142,37 +143,33 @@ Для каждого СтрокаРезультата Из ДанныеВнешнихКомпонент Цикл ПредставлениеКомпоненты = ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты( - СтрокаРезультата.Идентификатор, - СтрокаРезультата.Версия); + СтрокаРезультата.Идентификатор, СтрокаРезультата.Версия); КодОшибки = СтрокаРезультата.КодОшибки; Если ЗначениеЗаполнено(КодОшибки) Тогда Если КодОшибки = "АктуальнаяВерсия" Тогда - Результат = Результат + ПредставлениеКомпоненты + " - " + НСтр("ru = 'Актуальная версия.'") + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 - актуальная версия.'"), ПредставлениеКомпоненты) + Символы.ПС; Продолжить; КонецЕсли; ИнформацияОбОшибке = ""; Если КодОшибки = "ОтсутствуетКомпонента" Тогда - ИнформацияОбОшибке = НСтр("ru = 'В сервисе внешних компонент не обнаружена внешняя компонента'"); + ИнформацияОбОшибке = НСтр("ru = 'В сервисе отсутствует данная внешняя компонента'"); ИначеЕсли КодОшибки = "ФайлНеЗагружен" Тогда - ИнформацияОбОшибке = НСтр("ru = 'При попытке загрузить файл внешней компоненты из сервиса, возникла ошибка'"); + ИнформацияОбОшибке = НСтр("ru = 'Ошибка при попытке загрузки файла внешней компоненты из сервиса'"); КонецЕсли; ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При загрузке внешней компоненты %1 возникала ошибка: + НСтр("ru = 'Не удалось загрузить внешнюю компоненту %1 из сервиса: |%2'"), - ПредставлениеКомпоненты, - ИнформацияОбОшибке); + ПредставлениеКомпоненты, ИнформацияОбОшибке); Результат = Результат + ПредставлениеКомпоненты + " - " + ИнформацияОбОшибке + Символы.ПС; - - ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", - ОбщегоНазначения.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - ТекстОшибки); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки); Продолжить; КонецЕсли; @@ -181,13 +178,10 @@ Информация = ВнешниеКомпонентыСлужебный.ИнформацияОКомпонентеИзФайла(ДвоичныеДанные, Ложь); Если Не Информация.Разобрано Тогда - Результат = Результат + ПредставлениеКомпоненты + " - " + Информация.ОписаниеОшибки + Символы.ПС; - ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка,,, Информация.ОписаниеОшибки); - Продолжить; КонецЕсли; @@ -197,6 +191,11 @@ // Когда уже загружена компонента по дате более свежая, чем на Портале 1С:ИТС, обновление не следует выполнять. Если Выборка.ДатаВерсии > СтрокаРезультата.ДатаВерсии Тогда + ПредставлениеКомпоненты = ВнешниеКомпонентыСлужебный.ПредставлениеКомпоненты( + СтрокаРезультата.Идентификатор, Выборка.Версия); + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 - в программе более новая версия, чем в сервисе (%2 от %3).'"), + ПредставлениеКомпоненты, СтрокаРезультата.Версия, Формат(СтрокаРезультата.ДатаВерсии, "ДЛФ=Д")) + Символы.ПС; Продолжить; КонецЕсли; @@ -222,8 +221,8 @@ Объект.Записать(); - Результат = Результат + ПредставлениеКомпоненты - + " - " + НСтр("ru = 'Успешно обновлена.'") + Символы.ПС; + Результат = Результат + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 - успешно обновлена.'"), ПредставлениеКомпоненты) + Символы.ПС; ЗафиксироватьТранзакцию(); Исключение diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl index 8582b2332..edc038433 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl @@ -198,10 +198,6 @@ КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. -// -// Параметры: -// Типы - Массив из ОбъектМетаданных -// Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.ВнешниеКомпоненты); diff --git a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl index b17ace4ca..0206c4c25 100644 --- a/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеКомпонентыСлужебныйКлиент/Module.bsl @@ -251,7 +251,7 @@ // Параметры: // Результат - Структура - результат подключения компоненты: // * Подключено - Булево - признак подключения; -// * ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. // * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка // Контекст - см. ВнешниеКомпонентыКлиент.КонтекстПодключенияКомпоненты // @@ -418,7 +418,7 @@ // Параметры: // Результат - Структура - результат подключения компоненты: // * Подключено - Булево - признак подключения; -// * ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты. +// * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты. // * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. // Контекст - см. ВнешниеКомпонентыКлиент.КонтекстПодключенияКомпоненты // diff --git a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl index d79badde3..9e7949b31 100644 --- a/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl +++ b/SSL/src/CommonModules/ВнешниеПользователи/Module.bsl @@ -44,7 +44,7 @@ // - СправочникСсылка.ВнешниеПользователи - указанный внешний пользователь. // // Возвращаемое значение: -// Ссылка - объект авторизации одного из типов, указанных в описании типов в свойстве +// ЛюбаяСсылка - объект авторизации одного из типов, указанных в описании типов в свойстве // "Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектыАвторизации.Тип". // Функция ПолучитьОбъектАвторизацииВнешнегоПользователя(ВнешнийПользователь = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl index e538ce8ab..e0a98745e 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержки/Module.bsl @@ -27,11 +27,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -61,8 +57,8 @@ // т.к. невозможно использование функции ИмяКомпьютера в веб клиенте. // // Параметры: -// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. -// НовоеРасположениеФайла - Строка - расположение исполняемого файла для ПК на котором запущен клиент 1С. +// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. +// НовоеРасположениеФайла - Строка - расположение исполняемого файла для ПК на котором запущен клиент 1С. // Процедура СохранитьРасположениеИсполняемогоФайлаВызовОнлайнПоддержки(ИдентификаторКлиента, НовоеРасположениеФайла) Экспорт @@ -79,11 +75,11 @@ // Записывает в регистр сведений настройки учетных записей пользователей для запуска приложения. // // Параметры: -// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. -// Логин - Строка - данные учетной записи приложения. -// Пароль - Строка - данные учетной записи приложения. -// ИспользоватьЛП - Булево - если значение Ложь, параметры Логин, Пароль не доступны. -// ВидимостьКнопкиВызовОнлайнПоддержки - Булево - отображение Кнопки запуска приложения на начальной странице. +// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. +// Логин - Строка - данные учетной записи приложения. +// Пароль - Строка - данные учетной записи приложения. +// ИспользоватьЛП - Булево - если значение Ложь, параметры Логин, Пароль не доступны. +// ВидимостьКнопкиВызовОнлайнПоддержки - Булево - отображение Кнопки запуска приложения на начальной странице. // Процедура СохранитьНастройкиПользователяВХранилище(Логин, Пароль, diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl index 332a800b0..843c55c1b 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиВызовСервера/Module.bsl @@ -11,10 +11,10 @@ // Получает из регистра сведений путь к исполняемому файлу. // // Параметры: -// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. +// ИдентификаторКлиента - УникальныйИдентификатор - идентификатор клиента (программы) 1С. // // ВозвращаемоеЗначение: -// Строка - путь к исполняемому файлу на ПК текущего пользователя. +// Строка - путь к исполняемому файлу на ПК текущего пользователя. // Функция РасположениеИсполняемогоФайла(ИдентификаторКлиента) Экспорт @@ -25,10 +25,10 @@ // Получает из регистра сведений параметры для запуска приложения. // // Параметры: -// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. +// Пользователь - УникальныйИдентификатор - текущий пользователь информационной базы. // // ВозвращаемоеЗначение: -// Структура - настройки пользователя для запуска приложения. +// Структура - настройки пользователя для запуска приложения. // Функция НастройкиУчетнойЗаписиПользователя() Экспорт diff --git a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl index d4b12479a..4a06a1f7e 100644 --- a/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВызовОнлайнПоддержкиКлиент/Module.bsl @@ -76,9 +76,6 @@ // Диалоговое окно для выбора файла. // -// Возвращаемое значение: -// Строка - путь к исполняемому файлу. -// Процедура ВыбратьФайлВызовОнлайнПоддержки(ОповещениеОЗакрытии, ПутьКФайлу = "") Экспорт Каталог = ОбщегоНазначенияКлиентСервер.РазложитьПолноеИмяФайла(ПутьКФайлу); @@ -110,9 +107,6 @@ // Проверяет наличие исполняемого файла по указанному пути. // -// Возвращаемое значение: -// Булево - при значении Истина файл запустится по указанному пути. -// Процедура НаличиеФайлаВызовОнлайнПоддержки(ОповещениеОЗакрытии, Путь) ПроверяемыйФайл = Новый Файл(Путь); Оповещение = Новый ОписаниеОповещения("НаличиеФайлаВызовОнлайнПоддержкиПослеПроверкиСуществования", ЭтотОбъект, ОповещениеОЗакрытии); diff --git a/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl b/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl new file mode 100644 index 000000000..42e3c2c89 --- /dev/null +++ b/SSL/src/CommonModules/ГенерацияШтрихкода/Module.bsl @@ -0,0 +1,405 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Пустая структура для заполнения параметра "ПараметрыШтрихкода" используемого для получения изображения штрих кода. +// +// Возвращаемое значение: +// Структура: +// * Ширина - Число - ширина изображения штрих кода. +// * Высота - Число - высота изображения штрих кода. +// * ТипКода - Число - штрихкода. +// Возможные значение: +// 99 - Авто выбор +// 0 - EAN8 +// 1 - EAN13 +// 2 - EAN128 +// 3 - Code39 +// 4 - Code128 +// 5 - Code16k +// 6 - PDF417 +// 7 - Standart (Industrial) 2 of 5 +// 8 - Interleaved 2 of 5 +// 9 - Code39 Расширение +// 10 - Code93 +// 11 - ITF14 +// 12 - RSS14 +// 14 - EAN13AddOn2 +// 15 - EAN13AddOn5 +// 16 - QR +// 17 - GS1DataBarExpandedStacked +// 18 - Datamatrix ASCII +// 19 - Datamatrix BASE256 +// 20 - Datamatrix TEXT +// 21 - Datamatrix C40 +// 22 - Datamatrix X12 +// 23 - Datamatrix EDIFACT +// 24 - Datamatrix GS1ASCII: +// * ОтображатьТекст - Булево - отображать HRI теста для штрихкода. +// * РазмерШрифта - Число - размер шрифта HRI теста для штрихкода. +// * УголПоворота - Число - угол поворота. +// Возможные значения: 0, 90, 180, 270. +// * Штрихкод - Строка - значение штрихкод в виде строки или Base64. +// * ТипВходныхДанных - Число - тип входных данных +// Возможные значения: 0 - Строка, 1 - Base64 +// * ПрозрачныйФон - Булево - прозрачный фон изображения штрихкода. +// * УровеньКоррекцииQR - Число - уровень коррекции штрихкода QR. +// Возможные значения: 0 - L, 1 - M, 2 - Q, 3 - H. +// * Масштабировать - Булево - масштабировать изображение штрихкода. +// * СохранятьПропорции - Булево - сохранять пропорции изображения штрихкода. +// * ВертикальноеВыравнивание - Число - вертикальное выравнивание штрихкода. +// Возможные значения: 1 - По верхнему краю, 2 - По центру, 3 - По нижнему краю +// * GS1DatabarКоличествоСтрок - Число - количество строк в штрихкоде GS1Databar. +// * УбратьЛишнийФон - Булево +// * ЛоготипКартинка - Строка - строка с base64 представлением png картинки логотипа. +// * ЛоготипРазмерПроцентОтШК - Число - процент от генерированного QR для вписывания логотипа. +// +Функция ПараметрыГенерацииШтрихкода() Экспорт + + ПараметрыШтрихкода = Новый Структура; + ПараметрыШтрихкода.Вставить("Ширина" , 100); + ПараметрыШтрихкода.Вставить("Высота" , 100); + ПараметрыШтрихкода.Вставить("ТипКода" , 99); + ПараметрыШтрихкода.Вставить("ОтображатьТекст" , Истина); + ПараметрыШтрихкода.Вставить("РазмерШрифта" , 12); + ПараметрыШтрихкода.Вставить("УголПоворота" , 0); + ПараметрыШтрихкода.Вставить("Штрихкод" , ""); + ПараметрыШтрихкода.Вставить("ПрозрачныйФон" , Истина); + ПараметрыШтрихкода.Вставить("УровеньКоррекцииQR", 1); + ПараметрыШтрихкода.Вставить("Масштабировать" , Ложь); + ПараметрыШтрихкода.Вставить("СохранятьПропорции" , Ложь); + ПараметрыШтрихкода.Вставить("ВертикальноеВыравнивание" , 1); + ПараметрыШтрихкода.Вставить("GS1DatabarКоличествоСтрок", 2); + ПараметрыШтрихкода.Вставить("ТипВходныхДанных", 0); + ПараметрыШтрихкода.Вставить("УбратьЛишнийФон" , Ложь); + ПараметрыШтрихкода.Вставить("ЛоготипКартинка"); + ПараметрыШтрихкода.Вставить("ЛоготипРазмерПроцентОтШК"); + + Возврат ПараметрыШтрихкода; + +КонецФункции + +// Формирование изображения штрихкода. +// +// Параметры: +// ПараметрыШтрихкода - см. ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода. +// +// Возвращаемое значение: +// Структура: +// Результат - Булево - результат генерации штрихкода. +// ДвоичныеДанные - ДвоичныеДанные - двоичные данные изображения штрихкода. +// Картинка - Картинка - картинка с сформированным штрихкодом или НЕОПРЕДЕЛЕНО. +// +Функция ИзображениеШтрихкода(ПараметрыШтрихкода) Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация; + ТипПлатформыКомпоненты = Строка(СистемнаяИнформация.ТипПлатформы); + + ВнешняяКомпонента = ГенерацияШтрихкодаСерверПовтИсп.ПодключитьКомпонентуГенерацииИзображенияШтрихкода(ТипПлатформыКомпоненты); + + Если ВнешняяКомпонента = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода.'"); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка генерации штрихкода'", + ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + ТекстСообщения); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + + Возврат ПодготовитьИзображениеШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода); + +КонецФункции + +// Возвращает двоичные данные для формирования QR-кода. +// +// Параметры: +// QRСтрока - Строка - данные, которые необходимо разместить в QR-коде. +// +// УровеньКоррекции - Число - уровень погрешности изображения, при котором данный QR-код все еще возможно 100% +// распознать. +// Параметр должен иметь тип целого и принимать одно из 4 допустимых значений: +// 0 (7 % погрешности), 1 (15 % погрешности), 2 (25 % погрешности), 3 (35 % погрешности). +// +// Размер - Число - определяет длину стороны выходного изображения в пикселях. +// Если минимально возможный размер изображения больше этого параметра - код сформирован не будет. +// +// Возвращаемое значение: +// ДвоичныеДанные - буфер, содержащий байты PNG-изображения QR-кода. +// +// Пример: +// +// // Выводим на печать QR-код, содержащий в себе информацию зашифрованную по УФЭБС. +// +// QRСтрока = УправлениеПечатью.ФорматнаяСтрокаУФЭБС(РеквизитыПлатежа); +// ТекстОшибки = ""; +// ДанныеQRКода = УправлениеПечатью.ДанныеQRКода(QRСтрока, 0, 190, ТекстОшибки); +// Если Не ПустаяСтрока(ТекстОшибки) +// ОбщегоНазначения.СообщитьПользователю(ТекстОшибки); +// КонецЕсли; +// +// КартинкаQRКода = Новый Картинка(ДанныеQRКода); +// ОбластьМакета.Рисунки.QRКод.Картинка = КартинкаQRКода; +// +Функция ДанныеQRКода(QRСтрока, УровеньКоррекции, Размер) Экспорт + + ПараметрыШтрихкода = ПараметрыГенерацииШтрихкода(); + ПараметрыШтрихкода.Ширина = Размер; + ПараметрыШтрихкода.Высота = Размер; + ПараметрыШтрихкода.Штрихкод = QRСтрока; + ПараметрыШтрихкода.УровеньКоррекцииQR = УровеньКоррекции; + ПараметрыШтрихкода.ТипКода = 16; // QR + ПараметрыШтрихкода.УбратьЛишнийФон = Истина; + + Попытка + РезультатФормированияШтрихкода = ИзображениеШтрихкода(ПараметрыШтрихкода); + ДвоичныеДанныеКартинки = РезультатФормированияШтрихкода.ДвоичныеДанные; + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка генерации штрихкода'", + ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка,,, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Возврат ДвоичныеДанныеКартинки; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Выполняет подключение внешней компоненты. +// +// Возвращаемое значение: +// ОбъектВнешнейКомпоненты +// Неопределено - если компоненту не удалось загрузить. +// +Функция ПодключитьКомпонентуГенерацииИзображенияШтрихкода() Экспорт + +#Если НЕ МобильноеПриложениеСервер Тогда + УстановитьОтключениеБезопасногоРежима(Истина); +#КонецЕсли + ВнешняяКомпонента = Неопределено; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда + МодульВнешниеКомпонентыСервер = ОбщегоНазначения.ОбщийМодуль("ВнешниеКомпонентыСервер"); + РезультатПодключения = МодульВнешниеКомпонентыСервер.ПодключитьКомпоненту("Barcode"); + Если РезультатПодключения.Подключено Тогда + ВнешняяКомпонента = РезультатПодключения.ПодключаемыйМодуль; + КонецЕсли; + КонецЕсли; + + Если ВнешняяКомпонента = Неопределено Тогда + ВнешняяКомпонента = ОбщегоНазначения.ПодключитьКомпонентуИзМакета("Barcode", "ОбщийМакет.КомпонентаПечатиШтрихкодов"); + КонецЕсли; + + Если ВнешняяКомпонента = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + // Если нет возможности рисовать. + Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда + // То картинку сформировать не сможем. + Возврат Неопределено; + Иначе + ПодготовитьКомпонентуГенерацииИзображенияШтрихкода(ВнешняяКомпонента); + Возврат ВнешняяКомпонента; + КонецЕсли; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Подготовить компоненту генерации изображения штрихкода. +// +// Параметры: +// ВнешняяКомпонента - ОбъектВнешнейКомпоненты - объект внешней компоненты +// +Процедура ПодготовитьКомпонентуГенерацииИзображенияШтрихкода(ВнешняяКомпонента) + + // Установим основные параметры компоненты. + // Если в системе установлен шрифт Tahoma. + Если ВнешняяКомпонента.НайтиШрифт("Tahoma") Тогда + // Выбираем его как шрифт для формирования картинки. + ВнешняяКомпонента.Шрифт = "Tahoma"; + Иначе + // Шрифт Tahoma в системе отсутствует. + // Обойдем все доступные компоненте шрифты. + Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл + // Получим очередной шрифт, доступный компоненте. + ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч); + // Если шрифт доступен + Если ТекущийШрифт <> Неопределено Тогда + // Они и будет шрифтом для формирования штрихкода. + ВнешняяКомпонента.Шрифт = ТекущийШрифт; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + // Установим размер шрифта + ВнешняяКомпонента.РазмерШрифта = 12; + +КонецПроцедуры + +// Подготовить изображения штрихкода. +// +// Параметры: +// ВнешняяКомпонента - ОбъектВнешнейКомпоненты: +// * Высота - Число +// * Ширина - Число +// * АвтоТип - Булево +// * ТипКода - Число +// * ТипВходныхДанных - Число +// * GS1DatabarКоличествоСтрок - Число +// * УбратьЛишнийФон - Булево +// * ОтображатьТекст - Булево +// * ЗначениеКода - Строка +// * УголПоворота - Число +// * УровеньКоррекцииQR - Число +// * ВертикальноеВыравниваниеКода - Число +// * РазмерШрифта - Число +// * ЛоготипКартинка - Строка +// * ЛоготипРазмерПроцентОтШК - Число +// ПараметрыШтрихкода - см. ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода. +// +// Возвращаемое значение: +// Структура: +// Результат - Булево - результат генерации штрихкода. +// ДвоичныеДанные - ДвоичныеДанные - двоичные данные изображения штрихкода. +// Картинка - Картинка - картинка с сформированным штрихкодом или НЕОПРЕДЕЛЕНО. +// +Функция ПодготовитьИзображениеШтрихкода(ВнешняяКомпонента, ПараметрыШтрихкода) + + // Результат + РезультатОперации = Новый Структура(); + РезультатОперации.Вставить("Результат", Ложь); + РезультатОперации.Вставить("ДвоичныеДанные"); + РезультатОперации.Вставить("Картинка"); + + // Зададим размер формируемой картинки. + ШиринаШтрихкода = Окр(ПараметрыШтрихкода.Ширина); + ВысотаШтрихкода = Окр(ПараметрыШтрихкода.Высота); + Если ШиринаШтрихкода <= 0 Тогда + ШиринаШтрихкода = 1 + КонецЕсли; + Если ВысотаШтрихкода <= 0 Тогда + ВысотаШтрихкода = 1 + КонецЕсли; + ВнешняяКомпонента.Ширина = ШиринаШтрихкода; + ВнешняяКомпонента.Высота = ВысотаШтрихкода; + ВнешняяКомпонента.АвтоТип = Ложь; + + ШтрихкодВрем = Строка(ПараметрыШтрихкода.Штрихкод); // Преобразуем явно в строку. + + Если ПараметрыШтрихкода.ТипКода = 99 Тогда + ВнешняяКомпонента.АвтоТип = Истина; + Иначе + ВнешняяКомпонента.АвтоТип = Ложь; + ВнешняяКомпонента.ТипКода = ПараметрыШтрихкода.ТипКода; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("ПрозрачныйФон") Тогда + ВнешняяКомпонента.ПрозрачныйФон = ПараметрыШтрихкода.ПрозрачныйФон; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("ТипВходныхДанных") Тогда + ВнешняяКомпонента.ТипВходныхДанных = ПараметрыШтрихкода.ТипВходныхДанных; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("GS1DatabarКоличествоСтрок") Тогда + ВнешняяКомпонента.GS1DatabarКоличествоСтрок = ПараметрыШтрихкода.GS1DatabarКоличествоСтрок; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("УбратьЛишнийФон") Тогда + ВнешняяКомпонента.УбратьЛишнийФон = ПараметрыШтрихкода.УбратьЛишнийФон; + КонецЕсли; + + ВнешняяКомпонента.ОтображатьТекст = ПараметрыШтрихкода.ОтображатьТекст; + // Формируем картинку штрихкода. + ВнешняяКомпонента.ЗначениеКода = ШтрихкодВрем; + // Угол поворота штрихкода. + ВнешняяКомпонента.УголПоворота = ?(ПараметрыШтрихкода.Свойство("УголПоворота"), ПараметрыШтрихкода.УголПоворота, 0); + // Уровень коррекции QR кода (L=0, M=1, Q=2, H=3). + ВнешняяКомпонента.УровеньКоррекцииQR = ?(ПараметрыШтрихкода.Свойство("УровеньКоррекцииQR"), ПараметрыШтрихкода.УровеньКоррекцииQR, 1); + + // Для обеспечения совместимости с предыдущими версиями БПО. + Если Не ПараметрыШтрихкода.Свойство("Масштабировать") + Или (ПараметрыШтрихкода.Свойство("Масштабировать") И ПараметрыШтрихкода.Масштабировать) Тогда + + Если Не ПараметрыШтрихкода.Свойство("СохранятьПропорции") + Или (ПараметрыШтрихкода.Свойство("СохранятьПропорции") И Не ПараметрыШтрихкода.СохранятьПропорции) Тогда + // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. + Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда + ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; + КонецЕсли; + // Если установленная нами высота меньше минимально допустимой для этого штрихкода. + Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда + ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; + КонецЕсли; + ИначеЕсли ПараметрыШтрихкода.Свойство("СохранятьПропорции") И ПараметрыШтрихкода.СохранятьПропорции Тогда + Пока ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода + Или ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Цикл + // Если установленная нами ширина меньше минимально допустимой для этого штрихкода. + Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда + ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода; + ВнешняяКомпонента.Высота = (ВнешняяКомпонента.МинимальнаяШиринаКода / Окр(ПараметрыШтрихкода.Ширина)) * Окр(ПараметрыШтрихкода.Высота); + КонецЕсли; + // Если установленная нами высота меньше минимально допустимой для этого штрихкода. + Если ВнешняяКомпонента.Высота < ВнешняяКомпонента.МинимальнаяВысотаКода Тогда + ВнешняяКомпонента.Высота = ВнешняяКомпонента.МинимальнаяВысотаКода; + ВнешняяКомпонента.Ширина = (ВнешняяКомпонента.МинимальнаяВысотаКода / Окр(ПараметрыШтрихкода.Высота)) * Окр(ПараметрыШтрихкода.Ширина); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; + + // ВертикальноеВыравниваниеКода: 1 - по верхнему краю, 2 - по центру, 3 - по нижнему краю. + Если ПараметрыШтрихкода.Свойство("ВертикальноеВыравнивание") И (ПараметрыШтрихкода.ВертикальноеВыравнивание > 0) Тогда + ВнешняяКомпонента.ВертикальноеВыравниваниеКода = ПараметрыШтрихкода.ВертикальноеВыравнивание; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И (ПараметрыШтрихкода.РазмерШрифта > 0) + И (ПараметрыШтрихкода.ОтображатьТекст) И (ВнешняяКомпонента.РазмерШрифта <> ПараметрыШтрихкода.РазмерШрифта) Тогда + ВнешняяКомпонента.РазмерШрифта = ПараметрыШтрихкода.РазмерШрифта; + КонецЕсли; + + Если ПараметрыШтрихкода.Свойство("РазмерШрифта") И ПараметрыШтрихкода.РазмерШрифта > 0 + И ПараметрыШтрихкода.Свойство("МонохромныйШрифт") Тогда + Если ПараметрыШтрихкода.МонохромныйШрифт Тогда + ВнешняяКомпонента.МаксимальныйРазмерШрифтаДляПринтеровНизкогоРазрешения = ПараметрыШтрихкода.РазмерШрифта + 1; + Иначе + ВнешняяКомпонента.МаксимальныйРазмерШрифтаДляПринтеровНизкогоРазрешения = -1; + КонецЕсли; + КонецЕсли; + + Если ПараметрыШтрихкода.ТипКода = 16 Тогда // QR + Если ПараметрыШтрихкода.Свойство("ЛоготипКартинка") И Не ПустаяСтрока(ПараметрыШтрихкода.ЛоготипКартинка) Тогда + ВнешняяКомпонента.ЛоготипКартинка = ПараметрыШтрихкода.ЛоготипКартинка; + КонецЕсли; + Если ПараметрыШтрихкода.Свойство("ЛоготипРазмерПроцентОтШК") И Не ПустаяСтрока(ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК) Тогда + ВнешняяКомпонента.ЛоготипРазмерПроцентОтШК = ПараметрыШтрихкода.ЛоготипРазмерПроцентОтШК; + КонецЕсли; + КонецЕсли; + + // Сформируем картинку + ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод(); + РезультатОперации.Результат = ВнешняяКомпонента.Результат = 0; + // Если картинка сформировалась. + Если ДвоичныеДанныеКартинки <> Неопределено Тогда + РезультатОперации.ДвоичныеДанные = ДвоичныеДанныеКартинки; + РезультатОперации.Картинка = Новый Картинка(ДвоичныеДанныеКартинки); // Формируем из двоичных данных. + КонецЕсли; + + Возврат РезультатОперации; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ГенерацияШтрихкода/ГенерацияШтрихкода.mdo b/SSL/src/CommonModules/ГенерацияШтрихкода/ГенерацияШтрихкода.mdo new file mode 100644 index 000000000..3fb4c08b3 --- /dev/null +++ b/SSL/src/CommonModules/ГенерацияШтрихкода/ГенерацияШтрихкода.mdo @@ -0,0 +1,11 @@ + + + ГенерацияШтрихкода + + ru + Генерация штрихкода + + true + true + true + diff --git a/SSL/src/CommonModules/ГенерацияШтрихкодаСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/ГенерацияШтрихкодаСерверПовтИсп/Module.bsl new file mode 100644 index 000000000..9845589be --- /dev/null +++ b/SSL/src/CommonModules/ГенерацияШтрихкодаСерверПовтИсп/Module.bsl @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 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..aff2e7a96 --- /dev/null +++ b/SSL/src/CommonModules/ГенерацияШтрихкодаСерверПовтИсп/ГенерацияШтрихкодаСерверПовтИсп.mdo @@ -0,0 +1,12 @@ + + + ГенерацияШтрихкодаСерверПовтИсп + + ru + Генерация штрихкода сервер повт исп + + true + true + true + DuringSession + diff --git a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl index c43fa413a..8d8b66535 100644 --- a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl @@ -12,15 +12,15 @@ // входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. -// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. -// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. -// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей, +// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей, // или все даты рассчитываются от переданной даты. -// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. +// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. // // Возвращаемое значение: -// Массив, Неопределено - даты, увеличенные на количество дней, входящих в график ГрафикРаботы. +// Массив, Неопределено - даты, увеличенные на количество дней, входящих в график ГрафикРаботы. // Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатыПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, @@ -125,13 +125,13 @@ // входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. -// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. -// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала ДатаОт. -// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. +// ГрафикРаботы - СправочникСсылка.Календари - график, который необходимо использовать. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала ДатаОт. +// ВызыватьИсключение - Булево - если Истина, вызывается исключение в случае незаполненного графика. // // Возвращаемое значение: -// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график ГрафикРаботы. +// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график ГрафикРаботы. // Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатаПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт @@ -157,16 +157,16 @@ // Возвращаемое значение: // Структура: // * ПолучатьПредшествующие - Булево - способ получения ближайшей даты: -// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, -// если Ложь - получаются ближайшие рабочие даты, следующие за начальными датами. -// Значение по умолчанию - Ложь: +// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, +// если Ложь - получаются ближайшие рабочие даты, следующие за начальными датами. +// Значение по умолчанию - Ложь: // * ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. -// Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. -// Значение по умолчанию - Ложь: +// Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. +// Значение по умолчанию - Ложь: // * ВызыватьИсключение - Булево - вызов исключения в случае не заполненного графика -// если Истина, вызвать исключение, если график не заполнен. -// если Ложь - даты, по которым не удалось определить ближайшую дату, будут просто пропущены. -// Значение по умолчанию - Истина. +// если Истина, вызвать исключение, если график не заполнен. +// если Ложь - даты, по которым не удалось определить ближайшую дату, будут просто пропущены. +// Значение по умолчанию - Истина. // Функция ПараметрыПолученияБлижайшихДатПоГрафику() Экспорт Параметры = Новый Структура( @@ -183,11 +183,11 @@ // // Параметры: // ГрафикРаботы - Справочник.Календари. -// НачальныеДаты - Массив Из Дата - даты, относительно которых нужно найти ближайшие. +// НачальныеДаты - Массив из Дата - даты, относительно которых нужно найти ближайшие. // ПараметрыПолучения - см. ПараметрыПолученияБлижайшихДатПоГрафику. // // Возвращаемое значение: -// Соответствие Из КлючИЗначение: +// Соответствие из КлючИЗначение: // * Ключ - Дата - начальная дата, // * Значение - Дата - ближайшая к ней дата, включенная в график. // @@ -219,14 +219,19 @@ |ОБЪЕДИНИТЬ ВСЕ |"; КонецЕсли; - ТекстЗапросаВТ = ТекстЗапросаВТ + " - |ВЫБРАТЬ - | ДАТАВРЕМЯ(" + Формат(НачальнаяДата, "ДФ=гггг,ММ,дд") + ")"; Если ПерваяЧасть Тогда - ТекстЗапросаВТ = ТекстЗапросаВТ + " КАК Дата + ТекстЗапроса = " + |ВЫБРАТЬ + | ДАТАВРЕМЯ(2000,01,01) КАК Дата |ПОМЕСТИТЬ ВТНачальныеДаты |"; + Иначе + ТекстЗапроса = " + |ВЫБРАТЬ + | ДАТАВРЕМЯ(2000,01,01)"; КонецЕсли; + ТекстЗапросаВТ = ТекстЗапросаВТ + СтрЗаменить(ТекстЗапроса, "2000,01,01", + Формат(НачальнаяДата, "ДФ=гггг,ММ,дд")); ПерваяЧасть = Ложь; КонецЦикла; @@ -288,16 +293,16 @@ // Если расписание на предпраздничный день не задано, то оно определяется так, как если бы этот день был бы рабочим. // // Параметры: -// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. -// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - Дата - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // // Возвращаемое значение: // ТаблицаЗначений: -// * ГрафикРаботы - СправочникСсылка.Календари - график работы. -// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. -// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. -// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. +// * ГрафикРаботы - СправочникСсылка.Календари - график работы. +// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. +// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. +// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. // Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -327,9 +332,9 @@ // // Параметры: // МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. -// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. -// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - Дата - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -509,9 +514,9 @@ // на основании которых они заполняются. // // Параметры: -// - УсловияОбновления - таблица значений с колонками. -// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, -// - Год - год, за который нужно обновить данные. +// - УсловияОбновления - ТаблицаЗначений: +// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, +// - Год - год, за который нужно обновить данные. // Процедура ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления) Экспорт @@ -523,7 +528,7 @@ // чтобы на время обновления производственных календарей, графики были недоступны для изменения пользователем. // // Параметры: -// БлокируемыеОбъекты - Массив из Строка - имена метаданных блокируемых объектов. +// БлокируемыеОбъекты - Массив из Строка - имена метаданных блокируемых объектов. // Процедура ЗаполнитьБлокируемыеОбъектыЗависимыеОтПроизводственныхКалендарей(БлокируемыеОбъекты) Экспорт @@ -534,7 +539,7 @@ // Добавляет в список изменяемых объектов регистр календарных графиков. // // Параметры: -// ИзменяемыеОбъекты - Массив из Строка - имена метаданных изменяемых объектов. +// ИзменяемыеОбъекты - Массив из Строка - имена метаданных изменяемых объектов. // Процедура ЗаполнитьИзменяемыеОбъектыЗависимыеОтПроизводственныхКалендарей(ИзменяемыеОбъекты) Экспорт @@ -546,8 +551,8 @@ // приведенные в ВТРазличныеГодыГрафика. // // Параметры: -// - МенеджерВременныхТаблиц - должен содержать ВТРазличныеГодыГрафика с полем Год, типа Число (4,0), -// - ГрафикРаботы - график, который необходимо использовать, тип СправочникСсылка.Календари. +// - МенеджерВременныхТаблиц - должен содержать ВТРазличныеГодыГрафика с полем Год, типа Число (4,0), +// - ГрафикРаботы - график, который необходимо использовать, тип СправочникСсылка.Календари. // Процедура СоздатьВТДанныеГрафика(МенеджерВременныхТаблиц, ГрафикРаботы) Экспорт @@ -587,15 +592,11 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если Метаданные.Обработки.Найти("ЗаполнениеГрафиковРаботы") <> Неопределено Тогда - МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеГрафиковРаботы"); - МодульГрафикиРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); + МодульЗаполнениеГрафиковРаботы = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеГрафиковРаботы"); + МодульЗаполнениеГрафиковРаботы.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; Обработчик = Обработчики.Добавить(); @@ -636,9 +637,7 @@ КонецПроцедуры -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. diff --git a/SSL/src/CommonModules/ГрафикиРаботыКлиент/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботыКлиент/Module.bsl index dd27e9151..1c11edb7d 100644 --- a/SSL/src/CommonModules/ГрафикиРаботыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботыКлиент/Module.bsl @@ -12,12 +12,12 @@ // таким образом, чтобы строки коллекции оставались упорядоченными. // // Параметры: -// КоллекцияСтрок - Массив -// - ДанныеФормыКоллекция -// - ТаблицаЗначений -// ПолеУпорядочивания - имя поля элемента коллекции, +// КоллекцияСтрок - Массив +// - ДанныеФормыКоллекция +// - ТаблицаЗначений +// ПолеУпорядочивания - имя поля элемента коллекции, // по которому производится упорядочивание. -// ТекущаяСтрока - отредактированная строка коллекции. +// ТекущаяСтрока - отредактированная строка коллекции. // Процедура ВосстановитьПорядокСтрокКоллекцииПослеРедактирования(КоллекцияСтрок, ПолеУпорядочивания, ТекущаяСтрока) Экспорт diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl index 9f98edbf2..fcd208122 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl @@ -58,7 +58,7 @@ #Область СлужебныйПрограммныйИнтерфейс // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыВыполнения - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ОбработчикКоманды(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт @@ -73,8 +73,8 @@ // Параметры: // ПараметрыИзменения - Структура: -// * МассивОбъектов - Массив Из ЛюбаяСсылка -// * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// * МассивОбъектов - Массив из ЛюбаяСсылка +// * КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных // Процедура НачатьИзменениеВыделенных(ПараметрыГрупповогоИзменения) diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl index 8611001c6..4f6fa3775 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовПереопределяемый/Module.bsl @@ -13,7 +13,7 @@ // см. ПоискИУдалениеДублейКлиент.ОбъединитьВыделенные и ПоискИУдалениеДублейКлиент.ЗаменитьВыделенные // // Параметры: -// Объекты - Массив из ОбъектМетаданных +// Объекты - Массив из ОбъектМетаданных // // Пример: // Объекты.Добавить(Метаданные.Справочники._ДемоНоменклатура); @@ -29,7 +29,7 @@ // редактирования реквизитов при групповом изменении. // // Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, +// Объекты - Соответствие из КлючИЗначение - в качестве ключа указать полное имя объекта метаданных, // подключенного к подсистеме "Групповое изменение объектов". // Дополнительно в значении могут быть перечислены имена экспортных функций: // "РеквизитыНеРедактируемыеВГрупповойОбработке", diff --git a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl index c3ea82439..fb9b3783e 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзменения/Module.bsl @@ -48,7 +48,7 @@ // подробнее см. функцию ДатыЗапретаИзменения.НайденЗапретИзмененияДанных. // // УзелПроверкиЗапретаЗагрузки - Неопределено -// - ПланыОбменаСсылка - если Неопределено, то проверить запрет +// - ПланОбменаСсылка - если Неопределено, то проверить запрет // изменения данных; иначе - загрузку данных из указанного узла плана обмена. // // Возвращаемое значение: @@ -277,8 +277,7 @@ // запрет изменения данных для всех пользователей (установлена общая дата запрета)". // // УзелПроверкиЗапретаЗагрузки - Неопределено - выполнить проверку изменения данных. -// - ПланыОбменаСсылка.<Имя плана обмена> - выполнить проверку -// загрузки данных для указанного узла. +// - ПланОбменаСсылка - выполнить проверку загрузки данных для указанного узла. // // Возвращаемое значение: // Булево - если Истина, то найден хотя бы один запрет изменения. @@ -308,14 +307,20 @@ // * Данные - ЛюбаяСсылка // - СправочникОбъект // - ДокументОбъект -// - НаборЗаписей - ссылка, объект данных, -// или набор записей регистра, представление которого будет выведено в сообщении о запрете. +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей - ссылка, объект данных, +// или набор записей регистра, представление которого будет выведено в сообщении о запрете. // - Структура: // ** Регистр - Строка - полное имя регистра. -// - НаборЗаписей - набор записей регистра. +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей - набор записей регистра. // ** Отбор - Отбор - отбор набора записей. // - Строка - подготовленное представление данных, -// которое будет выведено в сообщении о запрете. +// которое будет выведено в сообщении о запрете. // Функция ПараметрыСообщенияОЗапрете() Экспорт @@ -334,7 +339,7 @@ // * Дата - Дата - дата без времени, которую нужно проверить на принадлежность установленным запретам. // * Раздел - Строка - одно из имен разделов, указанных в процедуре // ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения -// * Объект - Ссылка - один из типов объектов, указанных для раздела в процедуре +// * Объект - ЛюбаяСсылка - один из типов объектов, указанных для раздела в процедуре // ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения. // Функция ШаблонДанныхДляПроверки() Экспорт @@ -354,17 +359,6 @@ КонецФункции -// Обновляет план видов характеристик РазделыДатЗапретаИзменения по описанию в метаданных. -// Предназначен для вызова из обработчика обновления общих данных (модель сервиса) -// при изменении состава разделов дат запрета изменения или свойств разделов в процедуре -// ПриЗаполненииРазделовДатЗапретаИзменения общего модуля ДатыЗапретаИзмененияПереопределяемый. -// -Процедура ОбновитьРазделыДатЗапретаИзменения() Экспорт - - ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения(); - -КонецПроцедуры - // В текущем сеансе отключает и включает проверку дат запрета изменения и загрузки данных. // Требуется для реализации специальной логики работы и ускорения пакетной обработки данных // при записи объекта или набора записей, когда признак ОбменДанными.Загрузка не установлен. @@ -489,8 +483,7 @@ // // Параметры: // Источник - РегистрСведенийНаборЗаписей -// - РегистрНакопленияНаборЗаписей - набор записей, -// передаваемый в подписку на событие ПередЗаписью. +// - РегистрНакопленияНаборЗаписей - набор записей, передаваемый в подписку на событие ПередЗаписью. // Отказ - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. // Замещение - Булево - параметр, передаваемый в подписку на событие ПередЗаписью. // @@ -578,6 +571,17 @@ КонецПроцедуры +#Область УстаревшиеПроцедурыИФункции + +// Не требуется вызывать, так как обновление выполняется автоматически. +Процедура ОбновитьРазделыДатЗапретаИзменения() Экспорт + + ДатыЗапретаИзмененияСлужебный.ОбновитьРазделыДатЗапретаИзменения(); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl index 7208c0c75..4a7b6c3a7 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияПереопределяемый/Module.bsl @@ -92,7 +92,7 @@ // (который передается из обработчиков ПередЗаписью и ПриЧтенииНаСервере). // // ПроверкаЗапретаИзменения - Булево - установить в Ложь, чтобы пропустить проверку запрета изменения данных. -// УзелПроверкиЗапретаЗагрузки - ПланыОбменаСсылка +// УзелПроверкиЗапретаЗагрузки - ПланОбменаСсылка // - Неопределено - установить в Неопределено, чтобы // пропустить проверку запрета загрузки данных. // ВерсияОбъекта - Строка - установить "СтараяВерсия" или "НоваяВерсия", чтобы @@ -125,7 +125,7 @@ // При этом значение для проверки будет получено из базы данных. // // УзелПроверкиЗапретаЗагрузки - Неопределено -// - ПланыОбменаСсылка - если Неопределено, то проверить запрет +// - ПланОбменаСсылка - если Неопределено, то проверить запрет // изменения данных; иначе - загрузку данных из указанного узла плана обмена. // // ДанныеДляПроверки - см. ДатыЗапретаИзменения.ШаблонДанныхДляПроверки. @@ -163,7 +163,7 @@ // - РегистрРасчетаНаборЗаписей - проверяемый элемент данных или набор записей. // // УзелПроверкиЗапретаЗагрузки - Неопределено -// - ПланыОбменаСсылка - если Неопределено, то проверить запрет +// - ПланОбменаСсылка - если Неопределено, то проверить запрет // изменения данных; иначе - загрузку данных из указанного узла плана обмена. // // ДанныеДляПроверки - см. ДатыЗапретаИзменения.ШаблонДанныхДляПроверки. diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl index b99ea9782..96037c1c3 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl @@ -61,10 +61,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -313,8 +309,7 @@ // * ПроверкаЗапретаИзменения - Булево - если установить Ложь, проверка запрета изменения для пользователей // будет пропущена. По умолчанию Истина. // * УзелПроверкиЗапретаЗагрузки - Неопределено - (начальное значение) выполнить проверку изменения данных. -// - ПланыОбменаСсылка.<Имя плана обмена> - выполнить проверку -// загрузки данных для указанного узла. +// - ПланОбменаСсылка - выполнить проверку загрузки данных для указанного узла. // * ОписаниеОшибки - Null - если возвращать описание найденных запретов не требуются (по умолчанию). // - Строка - если нужно вернуть текстовое описание. // - Структура - если нужно вернуть структурное описание найденных запретов, @@ -436,10 +431,12 @@ КонецФункции // Проверяет необходимость проверки запрета изменения или загрузки данных. -Функция ПропуститьПроверкуДатЗапрета(Объект, - ПроверкаЗапретаИзменения, - УзелПроверкиЗапретаЗагрузки, - ВерсияОбъекта) Экспорт +// +// Возвращаемое значение: +// Булево - Истина, если проверка не требуется. +// +Функция ПропуститьПроверкуДатЗапрета(Объект, ПроверкаЗапретаИзменения, УзелПроверкиЗапретаЗагрузки, + ВерсияОбъекта) Экспорт Если ТипЗнч(Объект) <> Тип("УдалениеОбъекта") И Объект.ДополнительныеСвойства.Свойство("ПропуститьПроверкуЗапретаИзменения") Тогда @@ -509,12 +506,8 @@ ДанныеДляПроверки = ДанныеДляПроверкиИзБазыДанных(Данные, ИдентификаторДанных, ДействующиеДаты, УзелПроверкиЗапретаЗагрузки); - ДанныеИДаты = Новый Структура; - ДанныеИДаты.Вставить("ДействующиеДаты", ДействующиеДаты); - ДанныеИДаты.Вставить("ДанныеДляПроверки", ДанныеДляПроверки); - - ЗапретНайден = НайденЗапретИзмененияДанных(ДанныеИДаты, - ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки); + ЗапретНайден = НайденЗапретИзмененияДанных(ДанныеДляПроверки, + ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки, ДействующиеДаты); КонецЕсли; // Проверка новой версии объекта или набора записей. @@ -526,12 +519,8 @@ ДанныеДляПроверки = ДанныеДляПроверкиИзОбъекта(Данные, ДействующиеДаты, УзелПроверкиЗапретаЗагрузки); - ДанныеИДаты = Новый Структура; - ДанныеИДаты.Вставить("ДействующиеДаты", ДействующиеДаты); - ДанныеИДаты.Вставить("ДанныеДляПроверки", ДанныеДляПроверки); - - ЗапретНайден = НайденЗапретИзмененияДанных(ДанныеИДаты, - ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки); + ЗапретНайден = НайденЗапретИзмененияДанных(ДанныеДляПроверки, + ПараметрыСообщенияОЗапрете, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки, ДействующиеДаты); КонецЕсли; Возврат ЗапретНайден; @@ -542,31 +531,22 @@ // См. ДатыЗапретаИзменения.НайденЗапретИзмененияДанных. // // Параметры: -// ДанныеДляПроверки - см. ДатыЗапретаИзменения.НайденЗапретИзменения.ДанныеДляПроверки -// - Структура: -// * ДанныеДляПроверки - см. ДатыЗапретаИзменения.ШаблонДанныхДляПроверки -// * ДействующиеДаты - см. ДатыЗапретаИзмененияСлужебный.ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения -// -// ПараметрыСообщенияОЗапрете - см. ДатыЗапретаИзменения.НайденЗапретИзмененияДанных.ПараметрыСообщенияОЗапрете -// -// ОписаниеОшибки - см. ДатыЗапретаИзменения.НайденЗапретИзмененияДанных.ОписаниеОшибки -// +// ДанныеДляПроверки - см. ДатыЗапретаИзменения.ШаблонДанныхДляПроверки +// ПараметрыСообщенияОЗапрете - см. ДатыЗапретаИзменения.ПараметрыСообщенияОЗапрете +// ОписаниеОшибки - см. ДатыЗапретаИзменения.НайденЗапретИзмененияДанных.ОписаниеОшибки // УзелПроверкиЗапретаЗагрузки - см. ДатыЗапретаИзменения.НайденЗапретИзмененияДанных.УзелПроверкиЗапретаЗагрузки // -// Возвращаемое значение: -// Булево - если Истина, то найден хотя бы один запрет изменения. +// ДействующиеДаты - см. ДатыЗапретаИзмененияСлужебный.ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения // -Функция НайденЗапретИзмененияДанных(Знач ДанныеДляПроверки, - ПараметрыСообщенияОЗапрете = Неопределено, - ОписаниеОшибки = Null, - УзелПроверкиЗапретаЗагрузки = Неопределено) Экспорт +// Возвращаемое значение: +// Булево - Истина, если найден хотя бы один запрет изменения. +// +Функция НайденЗапретИзмененияДанных(Знач ДанныеДляПроверки, ПараметрыСообщенияОЗапрете, + ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки, ДействующиеДаты = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); - Если ТипЗнч(ДанныеДляПроверки) = Тип("Структура") Тогда - ДействующиеДаты = ДанныеДляПроверки.ДействующиеДаты; - ДанныеДляПроверки = ДанныеДляПроверки.ДанныеДляПроверки; - Иначе + Если ДействующиеДаты = Неопределено Тогда ДействующиеДаты = ДействующиеДатыЗапрета(); КонецЕсли; @@ -757,6 +737,10 @@ КонецФункции // Возвращает действующие даты запрета с учетом последней версии после изменений. +// +// Возвращаемое значение: +// см. ДатыЗапретаИзмененияСлужебный.ЗначениеПараметраСеансаДействующиеДатыЗапретаИзменения +// Функция ДействующиеДатыЗапрета() Экспорт ПоследняяПроверка = ДатыЗапретаИзмененияСлужебныйПовтИсп.ПоследняяПроверкаВерсииДействующихДатЗапрета(); @@ -786,8 +770,11 @@ КонецФункции -// Возвращает источники данных, заполненные в процедуре ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения -// общего модуля ДатыЗапретаИзмененияПереопределяемый. +// Возвращает источники данных, заполненные в +// ДатыЗапретаИзмененияПереопределяемый.ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения. +// +// Возвращаемое значение: +// см. ДатыЗапретаИзмененияПереопределяемый.ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения.ИсточникиДанных // Функция ИсточникиДанныхДляПроверкиЗапретаИзменения() Экспорт @@ -859,7 +846,7 @@ СвойстваРазделов = СвойстваРазделов(); ПустойРаздел = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.ПустаяСсылка(); - МассивСсылокРазделов = Новый Массив; + ОбновляемыеРазделы = Новый Массив; Для Каждого ОписаниеРаздела Из СвойстваРазделов.Разделы Цикл Если ТипЗнч(ОписаниеРаздела.Ключ) = Тип("Строка") @@ -867,82 +854,112 @@ Продолжить; КонецЕсли; СвойстваРаздела = ОписаниеРаздела.Значение; // см. ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.СвойстваРаздела - МассивСсылокРазделов.Добавить(СвойстваРаздела.Ссылка); + ОбновляемыеРазделы.Добавить(СвойстваРаздела.Ссылка); - Объект = СвойстваРаздела.Ссылка.ПолучитьОбъект(); - Записать = Ложь; - - Если Объект = Неопределено Тогда - Объект = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.СоздатьЭлемент(); - Объект.УстановитьСсылкуНового(СвойстваРаздела.Ссылка); - Записать = Истина; - КонецЕсли; - - Если Объект.Наименование <> СвойстваРаздела.Представление Тогда - Объект.Наименование = СвойстваРаздела.Представление; - Записать = Истина; - КонецЕсли; - - Если Объект.ПометкаУдаления Тогда - Объект.ПометкаУдаления = Ложь; - Записать = Истина; - КонецЕсли; - - Если ЗначениеЗаполнено(Объект.УдалитьНоваяСсылка) Тогда - Объект.УдалитьНоваяСсылка = ПустойРаздел; - Записать = Истина; - КонецЕсли; - - ТипыОбъектов = Новый Массив; - Если СвойстваРаздела.ТипыОбъектов.Количество() = 0 Тогда - ТипыОбъектов.Добавить(ТипЗнч(ПустойРаздел)); - Иначе - Для Каждого СвойстваТипа Из СвойстваРаздела.ТипыОбъектов Цикл - ТипыОбъектов.Добавить(ТипЗнч(СвойстваТипа.ПустаяСсылка)); - КонецЦикла; - КонецЕсли; - Если Объект.ТипЗначения.Типы().Количество() <> ТипыОбъектов.Количество() Тогда - Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); - Записать = Истина; - Иначе - Для Каждого Тип Из ТипыОбъектов Цикл - Если Не Объект.ТипЗначения.СодержитТип(Тип) Тогда - Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); - Записать = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - Если Записать Тогда - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект, Ложь); - КонецЕсли; + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировки = БлокировкаДанных.Добавить("ПланВидовХарактеристик.РазделыДатЗапретаИзменения"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", СвойстваРаздела.Ссылка); + БлокировкаДанных.Заблокировать(); + + Объект = СвойстваРаздела.Ссылка.ПолучитьОбъект(); + Записать = Ложь; + + Если Объект = Неопределено Тогда + Объект = ПланыВидовХарактеристик.РазделыДатЗапретаИзменения.СоздатьЭлемент(); + Объект.УстановитьСсылкуНового(СвойстваРаздела.Ссылка); + Записать = Истина; + КонецЕсли; + + Если Объект.Наименование <> СвойстваРаздела.Представление Тогда + Объект.Наименование = СвойстваРаздела.Представление; + Записать = Истина; + КонецЕсли; + + Если Объект.ПометкаУдаления Тогда + Объект.ПометкаУдаления = Ложь; + Записать = Истина; + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.УдалитьНоваяСсылка) Тогда + Объект.УдалитьНоваяСсылка = ПустойРаздел; + Записать = Истина; + КонецЕсли; + + ТипыОбъектов = Новый Массив; + Если СвойстваРаздела.ТипыОбъектов.Количество() = 0 Тогда + ТипыОбъектов.Добавить(ТипЗнч(ПустойРаздел)); + Иначе + Для Каждого СвойстваТипа Из СвойстваРаздела.ТипыОбъектов Цикл + ТипыОбъектов.Добавить(ТипЗнч(СвойстваТипа.ПустаяСсылка)); + КонецЦикла; + КонецЕсли; + Если Объект.ТипЗначения.Типы().Количество() <> ТипыОбъектов.Количество() Тогда + Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); + Записать = Истина; + Иначе + Для Каждого Тип Из ТипыОбъектов Цикл + Если Не Объект.ТипЗначения.СодержитТип(Тип) Тогда + Объект.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектов); + Записать = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Записать Тогда + ОбновлениеИнформационнойБазы.ЗаписатьОбъект(Объект, Ложь); + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецЦикла; // Пометка на удаление устаревших непредопределенных разделов. - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Разделы", МассивСсылокРазделов); - Запрос.Текст = - "ВЫБРАТЬ - | Разделы.Ссылка КАК Ссылка, - | Разделы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, - | Разделы.УдалитьНоваяСсылка КАК УдалитьНоваяСсылка - |ИЗ - | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы - |ГДЕ - | НЕ Разделы.ПометкаУдаления - | И НЕ Разделы.Ссылка В (&Разделы) - | И Разделы.ИмяПредопределенныхДанных = """""; - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - Если ЗначениеЗаполнено(Выборка.УдалитьНоваяСсылка) - И ОбщегоНазначения.РазделениеВключено() Тогда - Продолжить; - КонецЕсли; - Объект = Выборка.Ссылка.ПолучитьОбъект(); - Объект.ПометкаУдаления = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект, Ложь); - КонецЦикла; + НачатьТранзакцию(); + Попытка + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировки = БлокировкаДанных.Добавить("ПланВидовХарактеристик.РазделыДатЗапретаИзменения"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + БлокировкаДанных.Заблокировать(); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Разделы", ОбновляемыеРазделы); + Запрос.Текст = + "ВЫБРАТЬ + | Разделы.Ссылка КАК Ссылка, + | Разделы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + | Разделы.УдалитьНоваяСсылка КАК УдалитьНоваяСсылка + |ИЗ + | ПланВидовХарактеристик.РазделыДатЗапретаИзменения КАК Разделы + |ГДЕ + | НЕ Разделы.ПометкаУдаления + | И НЕ Разделы.Ссылка В (&Разделы) + | И Разделы.ИмяПредопределенныхДанных = """""; + + УстаревшиеРазделы = Запрос.Выполнить().Выгрузить(); + + ЭлементБлокировки = БлокировкаДанных.Добавить("ПланВидовХарактеристик.РазделыДатЗапретаИзменения"); + ЭлементБлокировки.ИсточникДанных = УстаревшиеРазделы; + ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка"); + БлокировкаДанных.Заблокировать(); + + Для каждого УстаревшийРаздел Из УстаревшиеРазделы Цикл + Если ЗначениеЗаполнено(УстаревшийРаздел.УдалитьНоваяСсылка) + И ОбщегоНазначения.РазделениеВключено() Тогда + Продолжить; + КонецЕсли; + Объект = УстаревшийРаздел.Ссылка.ПолучитьОбъект(); + Объект.ПометкаУдаления = Истина; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект, Ложь); + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -1180,13 +1197,7 @@ // // Параметры: // Запрос - Запрос -// Отбор - РегистрСведенийНаборЗаписей.Отбор -// - РегистрНакопленияНаборЗаписей.Отбор -// - РегистрБухгалтерииНаборЗаписей.Отбор -// - РегистрРасчетаНаборЗаписей.Отбор -// -// Возвращаемое значение: -// Строка +// Отбор - Отбор // Процедура ВставитьПараметрыИУсловиеОтбора(Запрос, Отбор) @@ -1230,7 +1241,7 @@ ДанныеДляПроверки = ДатыЗапретаИзменения.ШаблонДанныхДляПроверки(); Если ИсточникиДанных.ЭтоРегистр Тогда - ЗначенияПолей = Данные.Выгрузить(, ИсточникиДанных.ПоляРегистра); + ЗначенияПолей = Данные.Выгрузить(, ИсточникиДанных.ПоляРегистра); // ТаблицаЗначений ЗначенияПолей.Свернуть(ИсточникиДанных.ПоляРегистра); Если ЗначенияПолей.Колонки.Найти("Регистратор") <> Неопределено И Данные.Отбор.Найти("Регистратор") <> Неопределено @@ -1257,7 +1268,7 @@ Иначе СтрокаДаты = Новый Структура("Значение", ЗначениеПоля(Данные, ИсточникДанных.ПолеДаты)); Поле = ИсточникДанных.ПолеОбъекта.Имя; - ЗначенияОбъекта = Данные[ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть].Выгрузить(, Поле); + ЗначенияОбъекта = Данные[ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияОбъекта.Свернуть(Поле); Для Каждого СтрокаОбъекта Из ЗначенияОбъекта Цикл ДобавитьСтрокуДанных(СтрокаДаты, СтрокаОбъекта, ИсточникДанных, ДанныеДляПроверки); @@ -1270,7 +1281,7 @@ СтрокаОбъекта = Новый Структура("Значение", ЗначениеПоля(Данные, ИсточникДанных.ПолеОбъекта)); КонецЕсли; Поле = ИсточникДанных.ПолеДаты.Имя; - ЗначенияДаты = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поле); + ЗначенияДаты = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияДаты.Свернуть(Поле); Для Каждого СтрокаДаты Из ЗначенияДаты Цикл ДобавитьСтрокуДанных(СтрокаДаты, СтрокаОбъекта, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); @@ -1283,19 +1294,19 @@ Иначе Поля = ИсточникДанных.ПолеДаты.Имя + "," + ИсточникДанных.ПолеОбъекта.Имя; КонецЕсли; - Значения = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поля); + Значения = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поля); // ТаблицаЗначений Значения.Свернуть(Поля); Для Каждого Строка Из Значения Цикл ДобавитьСтрокуДанных(Строка, Строка, ИсточникДанных, ДанныеДляПроверки, БезОбъекта); КонецЦикла; Иначе Поле = ИсточникДанных.ПолеДаты.Имя; - ЗначенияДаты = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поле); + ЗначенияДаты = Данные[ИсточникДанных.ПолеДаты.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияДаты.Свернуть(Поле); Если Не БезОбъекта Тогда Поле = ИсточникДанных.ПолеОбъекта.Имя; - ЗначенияОбъекта = Данные[ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть].Выгрузить(, Поле); + ЗначенияОбъекта = Данные[ИсточникДанных.ПолеОбъекта.ТабличнаяЧасть].Выгрузить(, Поле); // ТаблицаЗначений ЗначенияОбъекта.Свернуть(Поле); КонецЕсли; @@ -1453,7 +1464,7 @@ // ** ИспользоватьВнешнихПользователей - Булево // ** ПоказыватьРазделы - Булево // ** ПустыеСсылкиУзловПлановОбмена - ФиксированныйМассив -// ** Разделы - ФиксированноеСоответствие: +// ** Разделы - ФиксированноеСоответствие из КлючИЗначение: // *** Ключ - Строка // *** Значение - ФиксированнаяСтруктура: // **** Имя - Строка diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl index 92fb42488..c7c0a9340 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебныйПовтИсп/Module.bsl @@ -33,7 +33,7 @@ Функция ПоляШапки(Таблица) Экспорт СхемаЗапроса = Новый СхемаЗапроса; - СхемаЗапроса.УстановитьТекстЗапроса("ВЫБРАТЬ * ИЗ " + Таблица); + СхемаЗапроса.УстановитьТекстЗапроса(СтрЗаменить("ВЫБРАТЬ * ИЗ #Таблица", "#Таблица", Таблица)); ПоляШапки = Новый Структура; Для Каждого Колонка Из СхемаЗапроса.ПакетЗапросов[0].Колонки Цикл diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl index e9884a3b6..daceeb3cb 100644 --- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl @@ -294,11 +294,12 @@ // "Отменено", если задание отменено пользователем или администратором. // * ИдентификаторЗадания - УникальныйИдентификатор - если Статус = "Выполняется", то содержит // идентификатор запущенного фонового задания. -// * АдресРезультата - Строка - адрес временного хранилища, в которое будет -// помещен (или уже помещен) результат работы процедуры. +// * АдресРезультата - Строка - адрес временного хранилища, в которое будет помещен результат работы процедуры +// (или уже помещен, если Статус = "Выполнено"). // * АдресДополнительногоРезультата - Строка - если установлен параметр ДополнительныйРезультат, // содержит адрес дополнительного временного хранилища, -// в которое будет помещен (или уже помещен) результат работы процедуры. +// в которое будет помещен результат работы процедуры +// (или уже помещен, если Статус = "Выполнено"). // * КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". // * ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". // * Сообщения - ФиксированныйМассив - если Статус <> "Выполняется", то массив объектов СообщениеПользователю, @@ -358,14 +359,28 @@ КонецЕсли; #КонецЕсли - Если ПараметрыВыполнения.Свойство("АдресРезультата") И ПараметрыВыполнения.АдресРезультата = Неопределено Тогда - ПараметрыВыполнения.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы); - КонецЕсли; - Результат = Новый Структура; - Результат.Вставить("Статус", "Выполняется"); + Результат.Вставить("Статус", "Выполняется"); Результат.Вставить("ИдентификаторЗадания", Неопределено); Если ПараметрыВыполнения.Свойство("АдресРезультата") Тогда + Если ПараметрыВыполнения.АдресРезультата = Неопределено Тогда + Если Не ЗначениеЗаполнено(ПараметрыВыполнения.ИдентификаторФормы) И ОбщегоНазначения.РежимОтладки() Тогда + Попытка + ВызватьИсключение НСтр("ru = 'Не указан ни уникальный идентификатор формы в параметре ПараметрыВыполнения.ИдентификаторФормы, + |ни адрес временного хранилища в ПараметрыВыполнения.АдресРезультата в ДлительныеОперации.ВыполнитьВФоне. + |Убедиться, что при обработке результата временное хранилище очищается явно методом УдалитьИзВременногоХранилища.'"); + Исключение + // АПК:154-выкл Не ошибка, а предупреждение (рекомендация разработчику). + ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Диагностика'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Предупреждение, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + // АПК:154-вкл + КонецПопытки; + КонецЕсли; + ПараметрыВыполнения.АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы); + ИначеЕсли Не ЭтоАдресВременногоХранилища(ПараметрыВыполнения.АдресРезультата) Тогда + ВызватьИсключение НСтр("ru = 'Не указан адрес временного хранилища в параметре ПараметрыВыполнения.АдресРезультата + |в ДлительныеОперации.ВыполнитьВФоне.'"); + КонецЕсли; Результат.Вставить("АдресРезультата", ПараметрыВыполнения.АдресРезультата); КонецЕсли; Если ПараметрыВыполнения.Свойство("ДополнительныйРезультат") Тогда @@ -416,7 +431,7 @@ Результат.Статус = "Ошибка"; Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), + ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки); КонецПопытки; Возврат Результат; @@ -471,13 +486,16 @@ // Возвращает новую структуру для параметра ПараметрыВыполнения функции ВыполнитьВФоне. // // Параметры: -// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, -// во временное хранилище которой надо поместить результат выполнения процедуры. -// +// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, во временное хранилище которой +// необходимо поместить результат выполнения процедуры. +// - Неопределено - если временное хранилище не нужно создавать автоматически на время жизни +// формы, а его адрес предполагается задавать явно в свойстве АдресРезультата. +// В таком случае, временное хранилище нужно очищать явно при обработке результата +// длительной операции с помощью метода УдалитьИзВременногоХранилища. // Возвращаемое значение: // Структура: // * ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, -// во временное хранилище которой надо поместить результат выполнения процедуры. +// во временное хранилище которой надо поместить результат выполнения процедуры. // * ДополнительныйРезультат - Булево - признак использования дополнительного временного хранилища для передачи // результата из фонового задания в родительский сеанс. По умолчанию - Ложь. // * ОжидатьЗавершение - Число @@ -489,7 +507,8 @@ // * КлючФоновогоЗадания - Строка - уникальный ключ для активных фоновых заданий, имеющих такое же имя процедуры. // По умолчанию не задан. // * АдресРезультата - Строка - адрес временного хранилища, в которое должен быть помещен результат -// работы процедуры. Если не задан, адрес формируется автоматически. +// работы процедуры. Если не задан, адрес формируется автоматически +// на время жизни формы с помощью идентификатора ИдентификаторФормы. // * ЗапуститьВФоне - Булево - если Истина, то задание будет всегда выполняться в фоне, // за исключением режима отладки. // В файловом варианте при наличии ранее запущенных заданий, @@ -499,7 +518,7 @@ // * БезРасширений - Булево - если Истина, то фоновое задание будет запущено без подключения // расширений конфигурации. // -Функция ПараметрыВыполненияВФоне(Знач ИдентификаторФормы) Экспорт +Функция ПараметрыВыполненияВФоне(Знач ИдентификаторФормы = Неопределено) Экспорт Результат = ОбщиеПараметрыВыполненияВФоне(); ДобавитьПараметрыВыполненияДляВозвратаРезультата(Результат, ИдентификаторФормы); @@ -809,7 +828,7 @@ Если Задание = Неопределено Тогда Пояснение = НСтр("ru = 'Операция не выполнена из-за аварийного завершения фонового задания. |Фоновое задание не существует'") + ": " + Строка(ИдентификаторЗадания); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции'", ОбщегоНазначения.КодОсновногоЯзыка()), + ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительные операции.Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , Пояснение); Если ИсключениеПриОшибке Тогда ВызватьИсключение(НСтр("ru = 'Не удалось выполнить данную операцию.'")); diff --git a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl index b5341ee73..675f61201 100644 --- a/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперацииКлиент/Module.bsl @@ -18,16 +18,16 @@ // Параметры процедуры-обработчика оповещения: // * Результат - Структура // - Неопределено - структура со свойствами или Неопределено, если задание было отменено: -// ** Статус - Строка - "Выполнено", если задание было успешно выполнено; +// ** Статус - Строка - "Выполнено", если задание было успешно выполнено; // "Ошибка", если задание завершено с ошибкой. -// ** АдресРезультата - Строка - адрес временного хранилища, в которое будет +// ** АдресРезультата - Строка - адрес временного хранилища, в которое будет // помещен (или уже помещен) результат работы процедуры. -// ** АдресДополнительногоРезультата - Строка - если установлен параметр ДополнительныйРезультат, +// ** АдресДополнительногоРезультата - Строка - если установлен параметр ДополнительныйРезультат, // содержит адрес дополнительного временного хранилища, // в которое будет помещен (или уже помещен) результат работы процедуры. -// ** КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". -// ** ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". -// ** Сообщения - ФиксированныйМассив +// ** КраткоеПредставлениеОшибки - Строка - краткая информация об исключении, если Статус = "Ошибка". +// ** ПодробноеПредставлениеОшибки - Строка - подробная информация об исключении, если Статус = "Ошибка". +// ** Сообщения - ФиксированныйМассив // - Неопределено - массив объектов СообщениеПользователю, // сформированных в процедуре-обработчике длительной операции. // * ДополнительныеПараметры - Произвольный - произвольные данные, переданные в описании оповещения. diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl index 9b69c16c7..73380b9bd 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -19,8 +19,8 @@ // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - подключаемая обработка. // // Возвращаемое значение: -// * Строка - имя подключенного отчета или обработки. -// * Неопределено - если передана некорректная ссылка. +// Строка - имя подключенного отчета или обработки. +// Неопределено - если передана некорректная ссылка. // Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт @@ -116,9 +116,9 @@ // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - подключаемый отчет или обработка. // // Возвращаемое значение: -// * ВнешняяОбработкаОбъект - объект подключенной обработки. -// * ВнешнийОтчетОбъект - объект подключенного отчета. -// * Неопределено - если передана некорректная ссылка. +// ВнешняяОбработка - объект подключенной обработки. +// ВнешнийОтчет - объект подключенного отчета. +// Неопределено - если передана некорректная ссылка. // Функция ОбъектВнешнейОбработки(Ссылка) Экспорт @@ -318,7 +318,7 @@ // * ИдентификаторКоманды - Строка - имя выполняемой команды. // * ОбъектыНазначения - Массив - ссылки объектов, для которых выполняется обработка. Обязательный для // назначаемых обработок. -// АдресРезультата - Строка - необязательный. Адрес временного хранилища по которому будет размещен результат +// АдресРезультата - Строка - адрес временного хранилища по которому будет размещен результат // выполнения. // // Возвращаемое значение: @@ -374,10 +374,12 @@ ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами(РазделыМетаданные); + // АПК:1383-выкл получение модуля менеджера, а не общего модуля. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСДополнительнымиОтчетами(РазделыМетаданные); КонецЕсли; + // АПК:1383-вкл Возврат РазделыМетаданные; КонецФункции @@ -391,10 +393,12 @@ Функция РазделыДополнительныхОбработок() Экспорт РазделыМетаданные = Новый Массив; + // АПК:1383-выкл получение модуля менеджера, а не общего модуля. Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСДополнительнымиОбработками(РазделыМетаданные); КонецЕсли; + // АПК:1383-вкл ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками(РазделыМетаданные); @@ -512,14 +516,14 @@ // - Строка - ссылка или полное имя объекта метаданных, // к которому привязаны искомые дополнительные отчеты и обработки. // Глобальные обработки размещаются в разделах, контекстные - в справочниках и документах. -// ЭтоФормаОбъекта - Булево - необязательный. +// ЭтоФормаОбъекта - Булево - // Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. // Истина - только отчеты и обработки, привязанные к формам объектов. // Ложь - только отчеты и обработки, привязанные к формам списков. // ТипыКоманд - ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок - тип получаемых команд. -// - Массив - типы команд, которые необходимо получить: +// - Массив - типы команд, которые необходимо получить: // * ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок -// ТолькоВключенные - Булево - необязательный. +// ТолькоВключенные - Булево - // Тип форм, в которых размещены контекстные дополнительные отчеты и обработки. // Истина - только отчеты и обработки, привязанные к формам объектов. // Ложь - только отчеты и обработки, привязанные к формам списков. @@ -716,7 +720,7 @@ | Представление"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ПолноИмяРегистра", "РегистрСведений." + ИмяРегистра); Иначе - Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПОМЕСТИТЬ ИтоговаяТаблица", ""); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПОМЕСТИТЬ ИтоговаяТаблица", ""); // @query-part Запрос.Текст = Запрос.Текст + " | |УПОРЯДОЧИТЬ ПО @@ -727,16 +731,17 @@ КонецФункции // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыВыполнения - Структура: -// * ОписаниеКоманды - Структура: -// ** Идентификатор - Строка - идентификатор команды. -// ** Представление - Строка - представление команды в форме. -// ** Имя - Строка - имя команды в форме. -// ** ДополнительныеПараметры - см. ДополнительныеПараметрыКомандыЗаполнения -// * Форма - ФормаКлиентскогоПриложения - форма, из которой была вызвана команда. -// * Источник - ДанныеФормыСтруктура -// - ТаблицаФормы - объект или список формы с полем "Ссылка". +// * ОписаниеКоманды - Структура: +// ** Идентификатор - Строка - идентификатор команды. +// ** Представление - Строка - представление команды в форме. +// ** Имя - Строка - имя команды в форме. +// ** ДополнительныеПараметры - см. ДополнительныеПараметрыКомандыЗаполнения +// * Форма - ФормаКлиентскогоПриложения - форма, из которой была вызвана команда. +// * Источник - ДанныеФормыСтруктура: +// ** Ссылка - ЛюбаяСсылка +// - ТаблицаФормы - объект или список формы с полем "Ссылка". // Процедура ОбработчикКомандыЗаполнения(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт ВыполняемаяКоманда = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры; @@ -882,7 +887,9 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если ОбщегоНазначения.РазделениеВключено() Или Не ПравоДоступа("Редактирование", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) @@ -963,9 +970,6 @@ КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. -// Параметры: -// ВидыДоступа - см. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа.ВидыДоступа -// Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); @@ -1011,11 +1015,7 @@ КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -1054,7 +1054,7 @@ Запрос.Параметры.Вставить("Пользователь", СведенияОПользователе.ПользовательСсылка); - РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // см. ПользователиСлужебный.НовоеОписаниеНастройки НастройкаБыстрогоДоступа = Новый Структура; НастройкаБыстрогоДоступа.Вставить("НазваниеНастройки", НазваниеНастройки); @@ -1146,10 +1146,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт @@ -1680,14 +1680,10 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// Массив - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить("Справочник.ДополнительныеОтчетыИОбработки.ТабличнаяЧасть.Разделы.Реквизит.Раздел"); - Массив.Добавить("Справочник.ДополнительныеОтчетыИОбработки.ТабличнаяЧасть.Назначение.Реквизит.ОбъектНазначения"); + ИсключенияПоискаСсылок.Добавить("Справочник.ДополнительныеОтчетыИОбработки.ТабличнаяЧасть.Разделы.Реквизит.Раздел"); + ИсключенияПоискаСсылок.Добавить("Справочник.ДополнительныеОтчетыИОбработки.ТабличнаяЧасть.Назначение.Реквизит.ОбъектНазначения"); КонецПроцедуры @@ -2019,7 +2015,7 @@ // Выполняет команду дополнительного отчета или обработки из объекта. Функция ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата) - СведенияОВнешнемОбъекте = ВнешнийОбъект.СведенияОВнешнейОбработке(); + СведенияОВнешнемОбъекте = ВнешнийОбъект.СведенияОВнешнейОбработке(); // см. СведенияОВнешнейОбработке ВидОбработки = ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СведенияОВнешнемОбъекте.Вид); @@ -2232,11 +2228,11 @@ КонецПроцедуры // Возвращаемое значение: -// ТаблицаЗначений: -// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки -// * Версия - Строка -// * ИмяОбъекта - Строка -// * ИмяФайла - Строка +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * Версия - Строка +// * ИмяОбъекта - Строка +// * ИмяФайла - Строка // Функция ОбработкиИзКонфигурации() Перем ОбработкиИзКонфигурации; @@ -2853,13 +2849,13 @@ КонецФункции // Параметры: -// Объект - СправочникСсылка.ДополнительныеОтчетыИОбработки -// ЭтоОтчет - Булево -// ИмяОбъекта - Строка +// Объект - СправочникСсылка.ДополнительныеОтчетыИОбработки +// ЭтоОтчет - Булево +// ИмяОбъекта - Строка // Возвращаемое значение: -// ТаблицаЗначений: -// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки -// * Представление - Строка +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * Представление - Строка // Функция КонфликтующиеДополнительныеОтчетыИОбработки(Объект, ЭтоОтчет, ИмяОбъекта) УстановитьПривилегированныйРежим(Истина); @@ -2917,9 +2913,9 @@ // Для внутреннего использования. // // Параметры: -// Объект - СправочникОбъект.ДополнительныеОтчетыИОбработки -// - Неопределено -// РегистрационныеДанные - см. СведенияОВнешнейОбработке +// Объект - СправочникОбъект.ДополнительныеОтчетыИОбработки +// - Неопределено +// РегистрационныеДанные - см. СведенияОВнешнейОбработке // Процедура ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, ПараметрыРегистрации, РезультатРегистрации) @@ -3079,15 +3075,14 @@ КонецФункции // Возвращаемое значение: -// -// Структура: -// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки -// * Вид - Строка -// * ВариантЗапуска - Строка -// * Идентификатор - Строка -// * ПоказыватьОповещение - Строка -// * Представление - Строка -// * ЭтоОтчет - Булево +// Структура: +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * Вид - Строка +// * ВариантЗапуска - Строка +// * Идентификатор - Строка +// * ПоказыватьОповещение - Строка +// * Представление - Строка +// * ЭтоОтчет - Булево // Функция ДополнительныеПараметрыКомандыЗаполнения() КлючиПараметровОбработчика = "Ссылка, Идентификатор, ВариантЗапуска, Представление, ПоказыватьОповещение, ЭтоОтчет"; @@ -3095,19 +3090,19 @@ КонецФункции // Параметры: -// ИдентификаторыОбъектов - Массив +// ИдентификаторыОбъектов - Массив // // Возвращаемое значение: -// ТаблицаЗначений: -// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки -// * Команды - ТаблицаЗначений: -// ** Идентификатор - Строка -// ** ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок -// ** Представление - Строка -// ** ПоказыватьОповещение - Булево -// ** Скрыть - Булево -// * Назначение - ТаблицаЗначений: -// ** ОбъектНазначения - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// ТаблицаЗначений: +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки +// * Команды - ТаблицаЗначений: +// ** Идентификатор - Строка +// ** ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок +// ** Представление - Строка +// ** ПоказыватьОповещение - Булево +// ** Скрыть - Булево +// * Назначение - ТаблицаЗначений: +// ** ОбъектНазначения - СправочникСсылка.ИдентификаторыОбъектовМетаданных // Функция ТаблицаОтчетовИОбработок(Знач ИдентификаторыОбъектов) Запрос = Новый Запрос; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl index 9dcf23aa0..be4aebfd8 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl @@ -214,7 +214,7 @@ // в текущей модели информационной базы. // // Параметры: -// НедоступныеВидыПубликации - Массив Из Строка +// НедоступныеВидыПубликации - Массив из Строка // Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт @@ -231,7 +231,7 @@ // // Параметры: // Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, -// Отказ - булево - флаг отказа от выполнения записи элемента справочника. +// Отказ - Булево - флаг отказа от выполнения записи элемента справочника. // Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl index b46f2f35e..887dbfcbc 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl @@ -12,9 +12,10 @@ // Функция должна возвращать одно и то же значение при многократном вызове. // // Параметры: -// ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль. +// ВнешнийМодуль - ЛюбаяСсылка - ссылка на внешний модуль. // -// Возвращаемое значение - Строка - шаблон имя профиля безопасности, содержащий символы +// Возвращаемое значение: +// Строка - шаблон имя профиля безопасности, содержащий символы // "%1", вместо которых в дальнейшем будет подставлен уникальный идентификатор. // Функция ШаблонИмениПрофиляБезопасности(Знач ВнешнийМодуль) Экспорт @@ -36,7 +37,8 @@ // // ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль, // -// Возвращаемое значение - Картинка. +// Возвращаемое значение: +// Картинка. // Функция ПиктограммаВнешнегоМодуля(Знач ВнешнийМодуль) Экспорт @@ -55,7 +57,8 @@ // Возвращает словарь представлений для внешних модулей контейнера. // -// Возвращаемое значение - Структура: +// Возвращаемое значение: +// Структура: // * Именительный - Строка - представление типа внешнего модуля в именительном падеже, // * Родительный - Строка - представление типа внешнего модуля в родительном падеже. // @@ -73,7 +76,8 @@ // Возвращает массив ссылочных объектов метаданных, которые могут использоваться в // качестве контейнера внешних модулей. // -// Возвращаемое значение - Массив(ОбъектМетаданных). +// Возвращаемое значение: +// Массив из ОбъектМетаданных // Функция КонтейнерыВнешнихМодулей() Экспорт @@ -144,12 +148,12 @@ КонецФункции // Параметры: -// Объект - СправочникСсылка.ДополнительныеОтчетыИОбработки -// ЗначениеФО - Булево -// - Неопределено -// ПометкаУдаления - Булево +// Объект - СправочникСсылка.ДополнительныеОтчетыИОбработки +// ЗначениеФО - Булево +// - Неопределено +// ПометкаУдаления - Булево // Возвращаемое значение: -// Массив +// Массив // Функция ЗапросыРазрешенийДополнительнойОбработки(Знач Объект, Знач ЗначениеФО = Неопределено, Знач ПометкаУдаления = Неопределено) diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl index ee79c161d..90bca4442 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl @@ -14,15 +14,10 @@ #Область БазоваяФункциональность -// Заполняет массив списком имен объектов метаданных, данные которых могут содержать ссылки на различные объекты метаданных, -// но при этом эти ссылки не должны учитываться в бизнес-логике приложения. -// -// Параметры: -// Массив - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить( + ИсключенияПоискаСсылок.Добавить( Метаданные.РегистрыСведений.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных.ПолноеИмя()); КонецПроцедуры @@ -115,7 +110,7 @@ // в текущей модели информационной базы. // // Параметры: -// НедоступныеВидыПубликации - Массив Из Строка +// НедоступныеВидыПубликации - Массив из Строка // Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт @@ -354,10 +349,10 @@ // Параметры: // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - дополнительный отчет или обработка. // СтандартнаяОбработка - Булево - флаг необходимости выполнения стандартной обработки подключения -// внешней обработки. -// Результат - ВнешняяОбработкаОбъект -// - ВнешнийОтчетОбъект - объект подключенного внешнего отчета или -// обработки (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). +// внешней обработки. +// Результат - ВнешняяОбработка +// - ВнешнийОтчет - объект подключенного внешнего отчета или обработки +// (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). // Процедура ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт @@ -426,11 +421,7 @@ #Область ОбновлениеИнформационнойБазы -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -900,9 +891,10 @@ // Параметры: // ИспользуемаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки. // -// Возвращаемое значение - Структура: -// * ХранилищеОбработки - ХранилищеЗначения, содержащее ДвоичныеДанные дополнительного отчета -// или обработки, +// Возвращаемое значение: +// Структура: +// * ХранилищеОбработки - ХранилищеЗначения - содержит ДвоичныеДанные дополнительного отчета +// или обработки, // * БезопасныйРежим - Булево - флаг подключения обработки в безопасном режиме. // Функция ПараметрыПодключенияИспользуемойОбработки(Знач ИспользуемаяОбработка) Экспорт @@ -1006,9 +998,9 @@ // Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий // // Параметры: -// СоответствиеИменПсевдонимам - Соответствие: +// СоответствиеИменПсевдонимам - Соответствие из КлючИЗначение: // Ключ - псевдоним метода, например ОчиститьОбластьДанных -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных +// Значение - имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных // В качестве значения можно указать Неопределено, в этом случае считается что имя // совпадает с псевдонимом. // @@ -1076,10 +1068,10 @@ // со старыми версиями ИБ-корреспондентов. // // Параметры: -// ИнтерфейсСообщения - строка - название программного интерфейса сообщения, для которого определяется версия -// ПараметрыПодключения - структура - параметры подключения к ИБ-корреспонденту -// ПредставлениеПолучателя - строка - представление ИБ-корреспондента -// Результат - строка - определяемая версия. Значение данного параметра может быть изменено в данной процедуре. +// ИнтерфейсСообщения - Строка - название программного интерфейса сообщения, для которого определяется версия +// ПараметрыПодключения - Структура - параметры подключения к ИБ-корреспонденту +// ПредставлениеПолучателя - Строка - представление ИБ-корреспондента +// Результат - Строка - определяемая версия. Значение данного параметра может быть изменено в данной процедуре. // Процедура ПриОпределенииВерсииИнтерфейсаКорреспондента(Знач ИнтерфейсСообщения, Знач ПараметрыПодключения, Знач ПредставлениеПолучателя, Результат) Экспорт @@ -1111,11 +1103,7 @@ #Область ВыгрузкаЗагрузкаОбластейДанных -// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. -// -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.РегистрыСведений.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных); @@ -1179,7 +1167,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево - возвращаемое. +// Загружать - Булево - возвращаемое. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -1219,7 +1207,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено - полное имя извлеченного файла. Файл будет автоматически удален +// ПутьКФайлу - Строка, Неопределено - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. // @@ -1374,7 +1362,7 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// * ОбластьДанных - Число (7,0) - номер области данных. +// * ОбластьДанных - Число - число длиной 7 символов, номер области данных. // * ИспользуемаяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки - дополнительная обработка. // Функция ПереченьИнсталляций(Знач ПоставляемаяОбработка) @@ -1400,7 +1388,7 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// * ОбластьДанных - Число (7,0) - номер области данных. +// * ОбластьДанных - Число - число длиной 7 символов, номер области данных. // * ПараметрыУстановки - ХранилищеЗначения - очередь инсталляций. // Функция ОчередьИнсталляций(Знач ПоставляемаяОбработка) @@ -1663,8 +1651,8 @@ // по элементу справочника ПоставляемыеДополнительныеОтчетыИОбработки. // // Параметры: -// ИспользуемаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки -// ПоставляемаяОбработка - СправочникОбъект.ПоставляемыеДополнительныеОтчетыИОбработки +// ИспользуемаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки +// ПоставляемаяОбработка - СправочникОбъект.ПоставляемыеДополнительныеОтчетыИОбработки // Процедура ЗаполнитьНастройкиИспользуемойОбработки(ИспользуемаяОбработка, ПоставляемаяОбработка) @@ -1751,8 +1739,8 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// ConfigarationName - строка - имя конфигурации, -// VersionNumber - строка - версия конфигурации. +// ConfigarationName - Строка - имя конфигурации, +// VersionNumber - Строка - версия конфигурации. // Функция ПрочитатьТаблицуСовместимости(Знач ТаблицаСовместимости) Экспорт @@ -1781,8 +1769,8 @@ // использование дополнительных отчетов и обработок. // // Параметры: -// Константа - строка - имя измененной константы, как оно задано в метаданных, -// Значение - булево - новое значение измененной константы. +// Константа - Строка - имя измененной константы, как оно задано в метаданных, +// Значение - Булево - новое значение измененной константы. // Процедура СинхронизацияЗначенийРегулирующихКонстант(Знач Константа, Знач Значение) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl index 88fc976ab..0396e4e41 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс/Module.bsl @@ -60,7 +60,7 @@ // Возвращает тип {http://www.1c.ru/1cFresh/ApplicationExtensions/Core/a.b.c.d}ExtensionAssignmentObject // // Параметры: -// ИспользуемыйПакет - строка - пространство имен версии интерфейса сообщений, для которой +// ИспользуемыйПакет - Строка - пространство имен версии интерфейса сообщений, для которой // получается тип сообщения. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl index e1ef74f68..058a08896 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl @@ -25,15 +25,15 @@ КонецФункции // Создает и возвращает экземпляр внешней обработки (отчета). -// Подробнее см. ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(). +// Подробнее см. ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки. // // Параметры: // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - подключаемый отчет или обработка. // // Возвращаемое значение: -// ВнешняяОбработкаОбъект - объект подключенной обработки. -// ВнешнийОтчетОбъект - объект подключенного отчета. -// Неопределено - если передана некорректная ссылка. +// ВнешняяОбработка +// ВнешнийОтчет +// Неопределено - если передана некорректная ссылка. // Функция ОбъектВнешнейОбработки(Ссылка) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl index 248e82995..f2e031c46 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -265,7 +265,7 @@ // Открывает список команд дополнительных отчетов и обработок. // // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыВыполнения - Структура: // * ОписаниеКоманды - Структура: // ** Идентификатор - Строка - идентификатор команды. @@ -492,8 +492,8 @@ // Показывает диалог установки расширения, затем выгружает данные дополнительного отчета или обработки. // // Параметры: -// ПараметрыВыгрузки - Структура: -// * Ссылка - ЛюбаяСсылка +// ПараметрыВыгрузки - Структура: +// * Ссылка - ЛюбаяСсылка // Процедура ВыгрузитьВФайл(ПараметрыВыгрузки) Экспорт Перем Адрес; diff --git a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl index 47a89ac56..7c415403d 100644 --- a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl @@ -82,7 +82,9 @@ // // ПараметрыОтчета - Структура - содержит параметры для чтения событий журнала регистрации. Содержит поля: // * Журнал - ТаблицаЗначений - содержит записи журнала регистрации. -// * ОтборЖурналаНаКлиенте - Структура - настройки отбора для чтения записей журнала регистрации. +// * ОтборЖурналаРегистрации - Структура - настройки отбора для чтения записей журнала регистрации: +// ** ДатаНачала - Дата - дата начала событий (опционально). +// ** ДатаОкончания - Дата - дата окончания событий (опционально). // * КоличествоСобытий - Число - ограничение числа считываемых событий журнала. // * УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. // * МенеджерВладельца - Произвольный - менеджер объекта, в форме которого отображается журнал @@ -419,7 +421,7 @@ // Преобразование отбора. // // Параметры: -// Отбор - отбор - передаваемый отбор. +// Отбор - Отбор - передаваемый отбор. // Процедура ПреобразованиеОтбора(Отбор, СмещениеВремениСервера) @@ -441,8 +443,8 @@ // Преобразование элемента отбора. // // Параметры: -// Отбор - отбор - передаваемый отбор. -// Отбор - элемент отбора - элемент передаваемого отбора. +// Отбор - Отбор - передаваемый отбор. +// Отбор - ЭлементОтбора - элемент передаваемого отбора. // Процедура ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора) diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl index 85b9d8597..05a999715 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl @@ -27,10 +27,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -77,9 +75,13 @@ КонецПроцедуры // См. ПоискИУдалениеДублей.ТипыИсключаемыеИзВозможныхДублей +// +// Параметры: +// ИсключаемыеТипы - см. ПоискИУдалениеДублей.ТипыИсключаемыеИзВозможныхДублей +// Процедура ПриДобавленииТиповИсключаемыхИзВозможныхДублей(ИсключаемыеТипы) Экспорт - ИсключаемыеТипы.Добавить(Тип("СправочникСсылка.Заметки")); + ИсключаемыеТипы.Добавить(Тип("СправочникСсылка.Заметки")); КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl b/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl index 04372557a..1f314cef4 100644 --- a/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗаполнениеОбъектов/Module.bsl @@ -51,10 +51,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт КомандыЗаполнения = Команды.СкопироватьКолонки(); diff --git a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl index 561b5ea35..448bc1b7a 100644 --- a/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗаполнениеОбъектовПереопределяемый/Module.bsl @@ -13,7 +13,7 @@ // Синтаксис процедуры ДобавитьКомандыЗаполнения см. в документации. // // Параметры: -// Объекты - Массив - объекты метаданных (тип ОбъектМетаданных) с командами заполнения. +// Объекты - Массив из ОбъектМетаданных - объекты метаданных с командами заполнения. // // Пример: // Объекты.Добавить(Метаданные.Справочники.Организации); @@ -33,7 +33,7 @@ // Настройки внешнего вида: // * Представление - Строка - представление команды в форме. // * Важность - Строка - группа в подменю, в которой следует вывести эту команду. -// Допустимо использовать: "Важное", "Обычное" и "СмТакже". +// Варианты: "Важное", "Обычное" и "СмТакже". // * Порядок - Число - порядок размещения команды в подменю. Используется для настройки под конкретное // рабочее место. // * Картинка - Картинка - картинка команды. @@ -45,47 +45,43 @@ // * ФункциональныеОпции - Строка - имена функциональных опций через запятую, определяющих видимость команды. // * УсловияВидимости - Массив - определяет видимость команды в зависимости от контекста. // Для регистрации условий следует использовать процедуру -// ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды(). +// ПодключаемыеКоманды.ДобавитьУсловиеВидимостиКоманды. // Условия объединяются по "И". // * ИзменяетВыбранныеОбъекты - Булево - определяет доступность команды, когда у пользователя нет прав на // изменение объекта. Если Истина, то в описанной выше ситуации кнопка будет недоступна. -// Необязательный. Значение по умолчанию - Истина. +// Значение по умолчанию - Истина. // // Настройки процесса выполнения: // * МножественныйВыбор - Булево -// - Неопределено - если Истина, то команда поддерживает множественный выбор. +// - Неопределено - если Истина (по умолчанию), то команда поддерживает множественный выбор. // В этом случае в параметре выполнения будет передан список ссылок. -// Необязательный. Значение по умолчанию - Истина. // * РежимЗаписи - Строка - действия, связанные с записью объекта, которые выполняются перед обработчиком команды: -// ** "НеЗаписывать" - объект не записывается, а в параметрах обработчика вместо ссылок передается -// вся форма. В этом режиме рекомендуется работать напрямую с формой, -// которая передается в структуре 2-го параметра обработчика команды. -// ** "ЗаписыватьТолькоНовые" - записывать новые объекты. -// ** "Записывать" - записывать новые и модифицированные объекты. -// ** "Проводить" - проводить документы. -// Перед записью и проведением у пользователя запрашивается подтверждение. -// Необязательный. Значение по умолчанию - "Записывать". +// "Записывать" - записывать новые и модифицированные объекты (по умолчанию). +// Перед записью и проведением у пользователя запрашивается подтверждение. +// "НеЗаписывать" - объект не записывается, а в параметрах обработчика вместо ссылок передается +// вся форма. В этом режиме рекомендуется работать напрямую с формой, +// которая передается в структуре 2-го параметра обработчика команды. +// "ЗаписыватьТолькоНовые" - записывать новые объекты. +// "Проводить" - проводить документы. // * ТребуетсяРаботаСФайлами - Булево - если Истина, то в веб-клиенте предлагается -// установить расширение для работы с 1С:Предприятием. -// Необязательный. Значение по умолчанию - Ложь. +// установить расширение для работы с 1С:Предприятием. Значение по умолчанию - Ложь. // // Настройки обработчика: // * Менеджер - Строка - объект, отвечающий за выполнение команды. // * ИмяФормы - Строка - имя формы, которую требуется получить для выполнения команды. // Если Обработчик не указан, то у формы вызывается метод "Открыть". // * ПараметрыФормы - Неопределено -// - ФиксированнаяСтруктура - необязательный. Параметры формы, указанной в ИмяФормы. +// - ФиксированнаяСтруктура - параметры формы, указанной в ИмяФормы. // * Обработчик - Строка - описание процедуры, обрабатывающей основное действие команды. // Формат "<ИмяОбщегоМодуля>.<ИмяПроцедуры>" используется, когда процедура размещена в общем модуле. // Формат "<ИмяПроцедуры>" используется в следующих случаях: // - если ИмяФормы заполнено, то в модуле указанной формы ожидается клиентская процедура; // - если ИмяФормы не заполнено, то в модуле менеджера этого объекта ожидается серверная процедура. -// * ДополнительныеПараметры - ФиксированнаяСтруктура - необязательный. Параметры обработчика, указанного в Обработчик. +// * ДополнительныеПараметры - ФиксированнаяСтруктура - параметры обработчика, указанного в Обработчик. // // Параметры - Структура - сведения о контексте исполнения: // * ИмяФормы - Строка - полное имя формы. -// -// СтандартнаяОбработка - Булево - если установить в Ложь, то событие "ДобавитьКомандыЗаполнения" менеджера объекта не +// СтандартнаяОбработка - Булево - если установить в Ложь, то событие ДобавитьКомандыЗаполнения менеджера объекта не // будет вызвано. // Процедура ПередДобавлениемКомандЗаполнения(КомандыЗаполнения, Параметры, СтандартнаяОбработка) Экспорт diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl index 95d5c3c94..e6e5f70fd 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl @@ -81,25 +81,19 @@ КонецПроцедуры -// Возвращает список реквизитов объекта, по которым установлен запрет редактирования. +// Возвращает список реквизитов и табличных частей объекта, по которым установлен запрет редактирования. // // Параметры: // ИмяОбъекта - Строка - полное имя объекта метаданных. // // Возвращаемое значение: -// Массив - имена реквизитов и табличных частей, для которых установлен запрет редактирования. +// Массив из Строка // Функция БлокируемыеРеквизитыОбъекта(ИмяОбъекта) Экспорт + ОписанияРеквизитов = ЗапретРедактированияРеквизитовОбъектовСлужебный.БлокируемыеРеквизитыОбъектаИЭлементыФормы(ИмяОбъекта); + Результат = Новый Массив; - - Объекты = ЗапретРедактированияРеквизитовОбъектовСлужебный.ОбъектыСЗаблокированнымиРеквизитами(); - Если Объекты[ИмяОбъекта] = Неопределено Тогда - Возврат Результат; - КонецЕсли; - - ОписанияРеквизитов = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьБлокируемыеРеквизитыОбъекта(); - Для Каждого ОписаниеРеквизита Из ОписанияРеквизитов Цикл ЧастиСтроки = СтрРазделить(ОписаниеРеквизита, ";", Ложь); ИмяРеквизита = ЧастиСтроки[0]; diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl index ef4b16a08..e0f09a623 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовПереопределяемый/Module.bsl @@ -19,9 +19,9 @@ // имя элемента надписи нужно указать после точки с запятой, как написано выше. // // Параметры: -// Объекты - Соответствие - в качестве ключа указать полное имя объекта метаданных, -// подключенного к подсистеме "Запрет редактирования реквизитов объектов", -// в качестве значения - пустую строку. +// Объекты - Соответствие из КлючИЗначение: +// * Ключ - Строка - полное имя объекта метаданных, подключенного к подсистеме; +// * Значение - Строка - пустая строка. // // Пример: // Объекты.Вставить(Метаданные.Документы.ЗаказПокупателя.ПолноеИмя(), ""); @@ -38,6 +38,18 @@ +КонецПроцедуры + +// Позволяет переопределить список заблокированных реквизитов, заданных в модуле менеджера объекта. +// +// Параметры: +// ИмяОбъектаМетаданных - Строка - например, "Справочник.Файлы". +// ЗаблокированныеРеквизиты - Массив из Строка - строки в формате "ИмяРеквизита[;ИмяЭлементаФормы,...]", +// где ИмяРеквизита - имя реквизита объекта, ИмяЭлементаФормы - +// имя элемента формы, связанного с реквизитом. Например: "Объект.Автор", "ПолеАвтор". +// +Процедура ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъектаМетаданных, ЗаблокированныеРеквизиты) Экспорт + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl index 878985608..874add78c 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовСлужебный/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Запрет редактирования реквизитов объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Настраивает форму объекта для работы подсистемы: @@ -48,7 +43,8 @@ Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); - БлокируемыеРеквизиты = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Ссылка).ПолучитьБлокируемыеРеквизитыОбъекта(); + МетаданныеОбъекта = Ссылка.Метаданные(); + БлокируемыеРеквизиты = БлокируемыеРеквизитыОбъектаИЭлементыФормы(МетаданныеОбъекта.ПолноеИмя()); ВсеРеквизитыБезПраваРедактирования = Истина; РеквизитыФормы = Неопределено; @@ -56,17 +52,16 @@ ОписаниеРеквизита = Форма.ПараметрыЗапретаРедактированияРеквизитов.Добавить(); - ИнформацияОБР = СтрРазделить(БлокируемыйРеквизит, ";", Ложь); - ОписаниеРеквизита.ИмяРеквизита = ИнформацияОБР[0]; + ИнформацияОБлокируемомРеквизите = СтрРазделить(БлокируемыйРеквизит, ";", Ложь); + ОписаниеРеквизита.ИмяРеквизита = ИнформацияОБлокируемомРеквизите[0]; - Если ИнформацияОБР.Количество() > 1 Тогда - БлокируемыеЭлементы = СтрРазделить(ИнформацияОБР[1], ",", Ложь); + Если ИнформацияОБлокируемомРеквизите.Количество() > 1 Тогда + БлокируемыеЭлементы = СтрРазделить(ИнформацияОБлокируемомРеквизите[1], ",", Ложь); Для Каждого БлокируемыйЭлемент Из БлокируемыеЭлементы Цикл ОписаниеРеквизита.БлокируемыеЭлементы.Добавить(СокрЛП(БлокируемыйЭлемент)); КонецЦикла; КонецЕсли; - МетаданныеОбъекта = Ссылка.Метаданные(); ЭтоПланСчетов = ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта); ЕстьСтандартныеТабличныеЧасти = ЭтоПланСчетов Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта); @@ -125,7 +120,7 @@ // Добавление команды и кнопки, если есть права. Если Пользователи.РолиДоступны("РедактированиеРеквизитовОбъектов") - И ПравоДоступа("Редактирование", Ссылка.Метаданные()) + И ПравоДоступа("Редактирование", МетаданныеОбъекта) И НЕ ВсеРеквизитыБезПраваРедактирования Тогда // Добавление команды @@ -180,7 +175,7 @@ КонецПроцедуры -Функция ОбъектыСЗаблокированнымиРеквизитами() Экспорт +Функция ОбъектыСЗаблокированнымиРеквизитами() Объекты = Новый Соответствие; ИнтеграцияПодсистемБСП.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); @@ -190,4 +185,29 @@ КонецФункции +// Возвращает список реквизитов и табличных частей объекта, по которым установлен запрет редактирования, +// а также связанные с ними элементы формы. +// +// Параметры: +// ИмяОбъекта - Строка - полное имя объекта метаданных. +// +// Возвращаемое значение: +// Массив из Строка +// +Функция БлокируемыеРеквизитыОбъектаИЭлементыФормы(ИмяОбъекта) Экспорт + + Результат = Новый Массив; + + Объекты = ОбъектыСЗаблокированнымиРеквизитами(); + Если Объекты[ИмяОбъекта] = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Результат = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьБлокируемыеРеквизитыОбъекта(); + ЗапретРедактированияРеквизитовОбъектовПереопределяемый.ПриОпределенииЗаблокированныхРеквизитов(ИмяОбъекта, Результат); + + Возврат Результат; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl index afddb087d..363bf1173 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl @@ -15,7 +15,7 @@ // - таблица формы, связанная с реквизитом "ОбластиПерсональныхДанных". // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма настройки системы. +// Форма - ФормаКлиентскогоПриложения - форма настройки системы. // Процедура ПриСозданииФормыНастройкиРегистрацииСобытий(Форма) Экспорт @@ -67,7 +67,7 @@ // имя которой так же - "ОбластиПерсональныхДанных". // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма настройки системы. +// Форма - ФормаКлиентскогоПриложения - форма настройки системы. // Процедура ПриЗаписиФормыНастройкиРегистрацииСобытий(Форма) Экспорт @@ -213,10 +213,10 @@ // Получение сведений производится в привилегированном режиме. // // Параметры: -// Субъект - ОпределяемыйТип.СубъектПерсональныхДанных - субъект, наличие согласия которого определяется, -// Организация - СправочникСсылка.Организации - оператор персональных данных, которому предоставлено согласие, -// Дата - Дата - дата, на которую запрашивается состояние, если не указана, выбирается последняя запись. -// ИсключаемыйРегистратор - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных - текущий документ; +// Субъект - ОпределяемыйТип.СубъектПерсональныхДанных - субъект, наличие согласия которого определяется, +// Организация - СправочникСсылка.Организации - оператор персональных данных, которому предоставлено согласие, +// Дата - Дата - дата, на которую запрашивается состояние, если не указана, выбирается последняя запись. +// ИсключаемыйРегистратор - ДокументСсылка.СогласиеНаОбработкуПерсональныхДанных - текущий документ; // передается для того, чтобы при поиске согласия игнорировать выполненные текущим документом движения. // // Возвращаемое значение: @@ -311,9 +311,9 @@ // Скрывает персональные данные субъектов. Состав персональных данных определяется программно. // // Параметры: -// Субъекты - Массив -// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок одного типа на субъекты. -// СообщатьОбИсключениях - Булево - признак необходимости информирования пользователя о добавленных исключениях. +// Субъекты - Массив +// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок одного типа на субъекты. +// СообщатьОбИсключениях - Булево - признак необходимости информирования пользователя о добавленных исключениях. // Процедура СкрытьПерсональныеДанныеСубъектов(Знач Субъекты, СообщатьОбИсключениях = Ложь) Экспорт @@ -494,9 +494,9 @@ // Определяет наличие скрытых персональных данных в объекте. В качестве объекта может быть передан и сам субъект. // // Параметры: -// Объект - СправочникОбъект -// - ДокументОбъект -// - РегистрСведенийНаборЗаписей - проверяемый объект. Также +// Объект - СправочникОбъект +// - ДокументОбъект +// - РегистрСведенийНаборЗаписей - проверяемый объект. Также // в качестве значения параметра могут быть указаны наборы записей других регистров // или значения типа СправочникСсылка, ДокументСсылка. // @@ -582,7 +582,7 @@ // из записей регистра сведений СогласияНаОбработкуПерсональныхДанных. // // Параметры: -// Объект - ПланОбменаОбъект - узел плана обмена, для которого выполнялось получение данных. +// Объект - ПланОбменаОбъект - узел плана обмена, для которого выполнялось получение данных. // Процедура ПослеЗагрузкиДанных(Объект) Экспорт @@ -785,7 +785,7 @@ // Параметры: -// СписокМакетов - Массив - макеты. +// СписокМакетов - Массив - макеты. // Процедура ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере(СписокМакетов) Экспорт СписокМакетов.Добавить("Документ.СогласиеНаОбработкуПерсональныхДанных.ПФ_DOC_СогласиеНаОбработкуПерсональныхДанных_ru"); @@ -794,9 +794,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -817,7 +815,7 @@ КонецПроцедуры // Параметры: -// ТекущиеДела - см. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел.Обработчики +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -857,9 +855,7 @@ КонецПроцедуры -// Параметры: -// Разделы - см. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения.Разделы -// +// См. ДатыЗапретаИзмененияПереопределяемый.ПриЗаполненииРазделовДатЗапретаИзменения. Процедура ПриЗаполненииРазделовДатЗапретаИзменения(Разделы) Экспорт Раздел = Разделы.Добавить(); @@ -891,8 +887,10 @@ МодульВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.СогласияНаОбработкуПерсональныхДанныхИстекающие); КонецПроцедуры +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +// // Параметры: -// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки +// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт @@ -929,12 +927,7 @@ КонецПроцедуры -// Параметры: -// ЭлементДанных - см. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного.ЭлементДанных -// ПолучениеЭлемента - см. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного.ПолучениеЭлемента -// ОтправкаНазад - см. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного.ОтправкаНазад -// Отправитель - см. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного.Отправитель -// +// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного. Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт // Стандартная обработка не переопределяется. @@ -995,9 +988,7 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ПолучениеСубъектовДляСкрытияПерсональныхДанных"); @@ -1005,9 +996,7 @@ КонецПроцедуры -// Параметры: -// Объекты - см. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.Объекты -// +// См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.Документы.ОтзывСогласияНаОбработкуПерсональныхДанных); @@ -1015,8 +1004,7 @@ КонецПроцедуры -// Параметры: -// Наборы - см. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств.Наборы +// См. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств. // Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт @@ -1035,8 +1023,10 @@ // Проверяет необходимость регистрации объекта на узлах плана обмена. // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, для которого будет выполнен механизм регистрации. -// Объект - СправочникОбъект, ДокументОбъект, РегистрСведенийНаборЗаписей и т.п. - проверяемый объект. +// ИмяПланаОбмена - Строка - имя плана обмена, для которого будет выполнен механизм регистрации. +// Объект - СправочникОбъект +// - ДокументОбъект +// - РегистрСведенийНаборЗаписей и т.п. - проверяемый объект. // Функция ПропуститьРегистрациюОбъекта(ИмяПланаОбмена, Объект) Экспорт @@ -1204,20 +1194,23 @@ МетаданныеСубъекта = КлючИЗначение.Значение; // ОбъектМетаданных - ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ") + " + ФрагментЗапроса = " | |ВЫБРАТЬ | СправочникСубъекта.Ссылка КАК Субъект - |[ПомещениеВоВременнуюТаблицу] + | ,&ПомещениеВоВременнуюТаблицу |ИЗ - | Справочник." + МетаданныеСубъекта.Имя + " КАК СправочникСубъекта + | &МетаданныеСубъекта КАК СправочникСубъекта | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СубъектыДляСкрытияПерсональныхДанных КАК СубъектыДляСкрытияПерсональныхДанных | ПО СправочникСубъекта.Ссылка = СубъектыДляСкрытияПерсональныхДанных.Субъект |ГДЕ | СубъектыДляСкрытияПерсональныхДанных.Субъект ЕСТЬ NULL"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПомещениеВоВременнуюТаблицу]", + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&МетаданныеСубъекта", + "Справочник." + МетаданныеСубъекта.Имя); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, ",&ПомещениеВоВременнуюТаблицу", ?(ВоВременнуюТаблицу И ОсновнаяТаблица, "ПОМЕСТИТЬ ВТСубъектыДляСкрытия", "")); + ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса), "", " ОБЪЕДИНИТЬ ВСЕ") + ФрагментЗапроса; ОсновнаяТаблица = Ложь; @@ -1422,7 +1415,7 @@ КонецПроцедуры // Параметры: -// Список - ДинамическийСписок - список субъектов. +// Список - ДинамическийСписок - список субъектов. // Процедура УстановитьУсловноеОформление(Список) @@ -1596,8 +1589,8 @@ // Определяет факт наличия среди переданных в параметре субъектов тех, по которым выполнялось скрытие персональных данных. // // Параметры: -// Субъекты - Массив -// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. +// Субъекты - Массив +// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. // // Возвращаемое значение: // Булево - признак наличия хотя бы одного субъекта. @@ -1637,9 +1630,9 @@ // был обработан в ходе скрытия персональных данных. // // Параметры: -// Объект - СправочникОбъект -// - ДокументОбъект - объект со ссылкой на субъект в табличной части. -// ПолныеИменаРеквизитов - Массив - полные имена реквизитов, содержащих ссылку на субъект, разделенные запятой: +// Объект - СправочникОбъект +// - ДокументОбъект - объект со ссылкой на субъект в табличной части. +// ПолныеИменаРеквизитов - Массив - полные имена реквизитов, содержащих ссылку на субъект, разделенные запятой: // Например: "ФизическоеЛицо" или "ФизическиеЛица.ФизическоеЛицо". // // Возвращаемое значение: @@ -1696,11 +1689,11 @@ // Возвращает существующие настройки скрытия субъектов. // // Параметры: -// Субъекты - Массив -// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. +// Субъекты - Массив +// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - ОпределяемыйТип.СубъектПерсональныхДанных - субъект. // * Значение - см. НастройкиСкрытияСубъектовПоУмолчанию. // @@ -1752,8 +1745,8 @@ // Записывает настройки скрытия субъектов. // // Параметры: -// Субъекты - Массив -// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. +// Субъекты - Массив +// - ОпределяемыйТип.СубъектПерсональныхДанных - ссылка или массив ссылок на субъекты. // НастройкиСкрытия - см. НастройкиСкрытияСубъектовПоУмолчанию. // Процедура ЗаписатьНастройкиСкрытияСубъектов(Знач Субъекты, НастройкиСкрытия = Неопределено) diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl index 449c8391c..8eb5fb5e1 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl @@ -12,7 +12,7 @@ // используется как клиентский обработчик печати (поэтому является функцией, а не процедурой). // // Параметры: -// ПараметрыПечати - Структура - параметры обработки команды печати: +// ПараметрыПечати - Структура - параметры обработки команды печати: // * ОбъектыПечати - Массив - в первом элементе ожидается субъект персональных данных; // * Форма - ФормаКлиентскогоПриложения - форма, из которой выполняется печать. // @@ -27,6 +27,7 @@ Субъект = ПараметрыПечати.ОбъектыПечати[0]; ОткрытьФорму("Документ.СогласиеНаОбработкуПерсональныхДанных.ФормаОбъекта", Новый Структура("Субъект", Субъект), ПараметрыПечати.Форма); + Возврат Неопределено; КонецФункции @@ -136,8 +137,8 @@ #Область СлужебныеПроцедурыИФункции // Параметры: -// ФоновоеЗадание -// ДополнительныеПараметры - см. ДополнительныеПараметрыИзмененияНастроекСкрытияПерсональныхДанных +// ФоновоеЗадание +// ДополнительныеПараметры - см. ДополнительныеПараметрыИзмененияНастроекСкрытияПерсональныхДанных // Процедура ПослеИзмененияНастроекСкрытияПерсональныхДанных(ФоновоеЗадание, ДополнительныеПараметры) Экспорт @@ -187,7 +188,7 @@ КонецПроцедуры // Возвращаемое значение: -// Структура: +// Структура: // * ДоступностьЭлементов - Соответствие // * Форма - ФормаКлиентскогоПриложения // diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl index d3a85b046..5ddd80c41 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПереопределяемый/Module.bsl @@ -48,10 +48,10 @@ // Обеспечивает составление коллекции областей персональных данных. // // Параметры: -// ОбластиПерсональныхДанных - ТаблицаЗначений: -// * Имя - Строка - идентификатор области данных. -// * Представление - Строка - пользовательское представление области данных. -// * Родитель - Строка - идентификатор родительской области данных. +// ОбластиПерсональныхДанных - ТаблицаЗначений: +// * Имя - Строка - идентификатор области данных. +// * Представление - Строка - пользовательское представление области данных. +// * Родитель - Строка - идентификатор родительской области данных. // Процедура ЗаполнитьОбластиПерсональныхДанных(ОбластиПерсональныхДанных) Экспорт @@ -63,8 +63,8 @@ // переданных в качестве параметров, субъектов. // // Параметры: -// СубъектыПерсональныхДанных - ДанныеФормыКоллекция - содержит сведения о субъектах. -// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. +// СубъектыПерсональныхДанных - ДанныеФормыКоллекция - содержит сведения о субъектах. +// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. // Процедура ДополнитьДанныеСубъектовПерсональныхДанных(СубъектыПерсональныхДанных, ДатаАктуальности) Экспорт @@ -75,9 +75,9 @@ // Вызывается при заполнении формы "Согласие на обработку персональных данных" данными организации. // // Параметры: -// Организация - ОпределяемыйТип.Организация - оператор персональных данных. -// ДанныеОрганизации - Структура - данные об организации (адрес, ФИО ответственного и т.д.). -// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. +// Организация - ОпределяемыйТип.Организация - оператор персональных данных. +// ДанныеОрганизации - Структура - данные об организации (адрес, ФИО ответственного и т.д.). +// ДатаАктуальности - Дата - дата, на которую нужно заполнить сведения. // Процедура ДополнитьДанныеОрганизацииОператораПерсональныхДанных(Организация, ДанныеОрганизации, ДатаАктуальности) Экспорт @@ -89,8 +89,8 @@ // Предназначена для заполнения поля ФИО ответственного за обработку ПДн. // // Параметры: -// ФизическоеЛицо - ОпределяемыйТип.ФизическоеЛицо - ответственный за обработку персональных данных. -// ФИО - Строка - ФИО ответственного, которые нужно заполнить. +// ФизическоеЛицо - ОпределяемыйТип.ФизическоеЛицо - ответственный за обработку персональных данных. +// ФИО - Строка - ФИО ответственного, которые нужно заполнить. // Процедура ЗаполнитьФИОФизическогоЛица(ФизическоеЛицо, ФИО) Экспорт diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl index d63301be2..0c23bc5f7 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхПовтИсп/Module.bsl @@ -28,10 +28,10 @@ // Возвращает полные имена объектов метаданных содержащих персональные данные. // // Параметры: -// Нет +// Нет // // Возвращаемое значение -// Массив - массив строк. Например: "РегистрСведений.ДокументыФизическихЛиц". +// Массив - массив строк. Например: "РегистрСведений.ДокументыФизическихЛиц". // Функция ИменаИсточниковПерсональныхДанных() Экспорт @@ -48,10 +48,10 @@ // Возвращает полные имена реквизитов объекта метаданных содержащего персональные данные по его полному имени. // // Параметры: -// ИмяИсточника - Строка - полное имя источника метаданных. Например: "Справочник.ФизическиеЛица". +// ИмяИсточника - Строка - полное имя источника метаданных. Например: "Справочник.ФизическиеЛица". // // Возвращаемое значение -// Массив - массив строк. Например: "ФизическоеЛицо" или "ФизическиеЛица.ФизическоеЛицо". +// Массив - массив строк. Например: "ФизическоеЛицо" или "ФизическиеЛица.ФизическоеЛицо". // Функция ИменаРеквизитовИсточникаСодержащихСубъект(ИмяИсточника) Экспорт @@ -163,12 +163,12 @@ // Возвращает имена полей регистрации и полей доступа сведений о персональных данных объекта по его полному имени. // // Параметры: -// ИмяОбъекта - Строка - полное имя объекта метаданных. Например: "Справочник.ФизическиеЛица". +// ИмяОбъекта - Строка - полное имя объекта метаданных. Например: "Справочник.ФизическиеЛица". // // Возвращаемое значение -// Структура: -/// ПоляРегистрации - Массив - массив строк. Например: "ФизическоеЛицо" или "ФизическиеЛица.ФизическоеЛицо". -/// ПоляДоступа - Массив - массив строк. Например: "ИНН" или "ФизическиеЛица.ИНН". +// Структура: +/// ПоляРегистрации - Массив - массив строк. Например: "ФизическоеЛицо" или "ФизическиеЛица.ФизическоеЛицо". +/// ПоляДоступа - Массив - массив строк. Например: "ИНН" или "ФизическиеЛица.ИНН". // Функция ИменаПолейСведенийОПерсональныхДанныхОбъекта(ИмяОбъекта) @@ -223,9 +223,9 @@ КонецФункции // Возвращаемое значение: -// ФиксированноеСоответствие: -// * Ключ - Тип -// * Значение - ОбъектМетаданных +// ФиксированноеСоответствие из КлючИЗначение: +// * Ключ - Тип +// * Значение - ОбъектМетаданных // Функция МетаданныеПоТипамСубъекта() Экспорт @@ -241,7 +241,7 @@ КонецФункции // Возвращаемое значение: -// ФиксированныйМассив - типы субъектов персональных данных. +// ФиксированныйМассив - типы субъектов персональных данных. // Функция ТипыСубъектов() Экспорт diff --git a/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl b/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl index 8f171a60b..9e89b82f2 100644 --- a/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ЗаявлениеНаСертификатПереопределяемый/Module.bsl @@ -13,10 +13,10 @@ // Параметры: // Параметры - Структура: // -// * Организация - СправочникСсылка.Организации - организация, которую нужно заполнить. +// * Организация - ОпределяемыйТип.Организация - организация, которую нужно заполнить. // Если организация уже заполнена, требуется перезаполнить ее свойства - например, // при повтором вызове, когда пользователь выбрал другую организацию. -// - Неопределено - если ОпределяемыйТип.Организации не настроен. +// - Неопределено - если ОпределяемыйТип.Организация не настроен. // Пользователю недоступен выбор организации. // // * ЭтоИндивидуальныйПредприниматель - Булево - (возвращаемое значение): @@ -68,8 +68,8 @@ // // Параметры: // Параметры - Структура: -// * Организация - СправочникСсылка.Организации - выбранная организация, на которую оформляется сертификат. -// - Неопределено - если ОпределяемыйТип.Организации не настроен. +// * Организация - ОпределяемыйТип.Организация - выбранная организация, на которую оформляется сертификат. +// - Неопределено - если ОпределяемыйТип.Организация не настроен. // // * ТипВладельца - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы, из которых можно сделать выбор. // - Неопределено - (возвращаемое значение) выбор владельца не поддерживается. @@ -160,8 +160,8 @@ // // Параметры: // Параметры - Структура: -// * Организация - СправочникСсылка.Организации - выбранная организация, на которую оформляется сертификат. -// - Неопределено - если ОпределяемыйТип.Организации не настроен. +// * Организация - ОпределяемыйТип.Организация - выбранная организация, на которую оформляется сертификат. +// - Неопределено - если ОпределяемыйТип.Организация не настроен. // // * ТипРуководителя - ОписаниеТипов - (возвращаемое значение) содержит ссылочные типы, из которых можно сделать выбор. // - Неопределено - (возвращаемое значение) выбор партнера не поддерживается. @@ -190,8 +190,8 @@ // // Параметры: // Параметры - Структура: -// * Организация - СправочникСсылка.Организации - выбранная организация, на которую оформляется сертификат. -// - Неопределено - если ОпределяемыйТип.Организации не настроен. +// * Организация - ОпределяемыйТип.Организация - выбранная организация, на которую оформляется сертификат. +// - Неопределено - если ОпределяемыйТип.Организация не настроен. // // * ТипПартнера - ОписаниеТипов - содержит ссылочные типы из которых можно сделать выбор. // - Неопределено - выбор партнера не поддерживается. diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl index d7b913eaf..f02d87fdb 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСП/Module.bsl @@ -8,7 +8,156 @@ #Область ПрограммныйИнтерфейс +// Определяет события, на которые могут подписаться другие библиотеки. +// +// Возвращаемое значение: +// Структура - ключами свойств структуры являются имена событий, на которые +// могут быть подписаны библиотеки. +// +Функция СобытияБСП() Экспорт + + События = Новый Структура; + + // БазоваяФункциональность + События.Вставить("ПриДобавленииПодсистем", Ложь); + События.Вставить("ПриУстановкеПараметровСеанса", Ложь); + События.Вставить("ПриДобавленииОбработчиковУстановкиПараметровСеанса", Ложь); + События.Вставить("ПриДобавленииИсключенийПоискаСсылок", Ложь); + События.Вставить("ПриДобавленииПереименованийОбъектовМетаданных", Ложь); + События.Вставить("ПриЗаполненииВсехПараметровРаботыРасширений", Ложь); + События.Вставить("ПриОчисткеВсехПараметровРаботыРасширений", Ложь); + События.Вставить("ПриОтправкеДанныхГлавному", Ложь); + События.Вставить("ПриОтправкеДанныхПодчиненному", Ложь); + События.Вставить("ПриПолученииДанныхОтГлавного", Ложь); + События.Вставить("ПриПолученииДанныхОтПодчиненного", Ложь); + События.Вставить("ПослеПолученияДанных", Ложь); + События.Вставить("ПриВключенииРазделенияПоОбластямДанных", Ложь); + События.Вставить("ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов", Ложь); + События.Вставить("ПриДобавленииПараметровРаботыКлиентаПриЗапуске", Ложь); + События.Вставить("ПриДобавленииПараметровРаботыКлиента", Ложь); + События.Вставить("ПередЗапускомПрограммы", Ложь); + + // ВариантыОтчетов + События.Вставить("ПриОпределенииНастроекВариантовОтчетов", Ложь); + События.Вставить("ПриОпределенииРазделовСВариантамиОтчетов", Ложь); + События.Вставить("ПриНастройкеВариантовОтчетов", Ложь); + События.Вставить("ПриИзмененииКлючейВариантовОтчетов", Ложь); + События.Вставить("ПриОпределенииОбъектовСКомандамиОтчетов", Ложь); + События.Вставить("ПередДобавлениемКомандОтчетов", Ложь); + События.Вставить("ПриДополненииСвязиОбъектовМетаданных", Ложь); + События.Вставить("ПриОпределенииПараметровВыбораВариантыОтчетов", Ложь); + События.Вставить("ПриСозданииНаСервереВариантыОтчетов", Ложь); + События.Вставить("ПередЗагрузкойВариантаНаСервере", Ложь); + + // ГрупповоеИзменениеОбъектов + События.Вставить("ПриОпределенииОбъектовСРедактируемымиРеквизитами", Ложь); + + // ДатыЗапретаИзменений + События.Вставить("ПриЗаполненииРазделовДатЗапретаИзменения", Ложь); + События.Вставить("ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения", Ложь); + + // ДополнительныеОтчетыИОбработки + События.Вставить("ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных", Ложь); + + // ЗагрузкаДанныхИзФайла + События.Вставить("ПриОпределенииСправочниковДляЗагрузкиДанных", Ложь); + + // ЗапретРедактированияРеквизитовОбъектов + События.Вставить("ПриОпределенииОбъектовСЗаблокированнымиРеквизитами", Ложь); + + // ИнтерфейсOData + События.Вставить("ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData", Ложь); + + // КонтрольВеденияУчета + События.Вставить("ПриОпределенииПроверок", Ложь); + + // НапоминанияПользователя + События.Вставить("ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания", Ложь); + + // ОбменДанными + События.Вставить("ПриНастройкеПодчиненногоУзлаРИБ", Ложь); + + //ОбновлениеВерсииИБ + События.Вставить("ПриДобавленииОбработчиковОбновления", Ложь); // Для обратной совместимости с БТС 1.2.2. + События.Вставить("ПослеОбновленияИнформационнойБазы", Ложь); + События.Вставить("ПриПолученииПриоритетаОбновления", Ложь); + + // Печать + События.Вставить("ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере", Ложь); + События.Вставить("ПриОпределенииОбъектовСКомандамиПечати", Ложь); + События.Вставить("ПередДобавлениемКомандПечати", Ложь); + События.Вставить("ПриПолученииНастроекСпискаКомандПечати", Ложь); + События.Вставить("ПриПечати", Ложь); + События.Вставить("ПередОтправкойПоПочте", Ложь); + События.Вставить("ПриПолученииПодписейИПечатей", Ложь); + События.Вставить("ПечатьДокументовПриСозданииНаСервере", Ложь); + События.Вставить("ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере", Ложь); + События.Вставить("ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере", Ложь); + События.Вставить("ПечатьДокументовПриВыполненииКоманды", Ложь); + + // ПодключаемыеКоманды + События.Вставить("ПриОпределенииВидовПодключаемыхКоманд", Ложь); + События.Вставить("ПриОпределенииСоставаНастроекПодключаемыхОбъектов", Ложь); + События.Вставить("ПриОпределенииКомандПодключенныхКОбъекту", Ложь); + События.Вставить("ПриОпределенииОбъектовСКомандамиСозданияНаОсновании", Ложь); + События.Вставить("ПередДобавлениемКомандСозданияНаОсновании", Ложь); + События.Вставить("ПриДобавленииКомандСозданияНаОсновании", Ложь); + + // Пользователи + События.Вставить("ПриОпределенииНастроек", Ложь); + События.Вставить("ПриОпределенииНазначенияРолей", Ложь); + События.Вставить("ПриОпределенииДействийВФорме", Ложь); + События.Вставить("ПриПолученииПрочихНастроек", Ложь); + События.Вставить("ПриСохраненииПрочихНастроек", Ложь); + События.Вставить("ПриУдаленииПрочихНастроек", Ложь); + События.Вставить("ПриЗавершенииОбработкиПользователяИБ", Ложь); + + //ПрофилиБезопасности + События.Вставить("ПриПроверкеВозможностиНастройкиПрофилейБезопасности", Ложь); + События.Вставить("ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов", Ложь); + События.Вставить("ПриЗапросеСозданияПрофиляБезопасности", Ложь); + События.Вставить("ПриЗапросеУдаленияПрофиляБезопасности", Ложь); + События.Вставить("ПриПодключенииВнешнегоМодуля", Ложь); + События.Вставить("ПриВключенииИспользованияПрофилейБезопасности", Ложь); + События.Вставить("ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам", Ложь); + + // РаботаСФайлами + События.Вставить("ПриОпределенииОбъектовИсключенияСинхронизацииФайлов", Ложь); + + // РегламентныеЗадания + События.Вставить("ПриОпределенииНастроекРегламентныхЗаданий", Ложь); + + // Свойства + События.Вставить("ПриПолученииПредопределенныхНаборовСвойств", Ложь); + + // ТекущиеДела + События.Вставить("ПриОпределенииОбработчиковТекущихДел", Ложь); + События.Вставить("ПриЗаполненииСпискаТекущихДел", Ложь); + События.Вставить("ПриОпределенииПорядкаРазделовКомандногоИнтерфейса", Ложь); + События.Вставить("ПриОтключенииТекущихДел", Ложь); + События.Вставить("ПриОпределенииНастроекТекущихДел", Ложь); + События.Вставить("ПриУстановкеОбщихПараметровЗапросов", Ложь); + События.Вставить("ПриСозданииНаСервереТекущиеДела", Ложь); + События.Вставить("ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела", Ложь); + + // УправлениеДоступом + События.Вставить("ПриЗаполненииВидовДоступа", Ложь); + События.Вставить("ПриЗаполненииСписковСОграничениемДоступа", Ложь); + События.Вставить("ПриЗаполненииПоставляемыхПрофилейГруппДоступа", Ложь); + События.Вставить("ПриЗаполненииЗависимостейПравДоступа", Ложь); + События.Вставить("ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов", Ложь); + События.Вставить("ПриЗаполненииИспользованияВидаДоступа", Ложь); + События.Вставить("ПриЗаполненииВидовОграниченийПравОбъектовМетаданных", Ложь); + + // ЦентрМониторинга + События.Вставить("ПриСбореПоказателейСтатистикиКонфигурации", Ложь); + + Возврат События; + +КонецФункции + #Область ОбработчикиСобытийБТС + // Обработка программных событий, возникающих в подсистемах БТС. // Только для вызовов из библиотеки БТС в БСП. @@ -338,7 +487,12 @@ КонецПроцедуры -// См. РаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы. +// Позволяет переопределить результат функции РаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы. +// +// Параметры: +// ИдентификаторПользователя - УникальныйИдентификатор - идентификатор пользователя. +// Псевдоним - Строка - псевдоним пользователя информационной базы для отображения в интерфейсе. +// Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда @@ -417,7 +571,7 @@ МодульУдалениеПомеченныхОбъектовСлужебный.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриПолученииСпискаШаблонов(ШаблоныЗаданий); КонецЕсли; @@ -590,14 +744,12 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда МодульЗагрузкаКлассификатораБанков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКлассификатораБанков"); - МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); - МодульЗагрузкаКлассификатораБанков.ПриДобавленииКлассификаторов(Классификаторы, МодульРаботаСКлассификаторами.ОписаниеКлассификатора()); + МодульЗагрузкаКлассификатораБанков.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда МодульЗагрузкаКурсовВалют = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗагрузкаКурсовВалют"); - МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); - МодульЗагрузкаКурсовВалют.ПриДобавленииКлассификаторов(Классификаторы, МодульРаботаСКлассификаторами.ОписаниеКлассификатора()); + МодульЗагрузкаКурсовВалют.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда @@ -608,8 +760,7 @@ Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") И Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено Тогда МодульРаботаСАдресами = ОбщегоНазначения.ОбщийМодуль("РаботаСАдресами"); - МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); - МодульРаботаСАдресами.ПриДобавленииКлассификаторов(Классификаторы, МодульРаботаСКлассификаторами.ОписаниеКлассификатора()); + МодульРаботаСАдресами.ПриДобавленииКлассификаторов(Классификаторы); КонецЕсли; КонецПроцедуры @@ -688,7 +839,9 @@ КонецПроцедуры -// См. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса. +// Параметры: +// Параметры - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса. +// Процедура ПриУстановкеПараметровСеанса(Параметры) Экспорт Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриУстановкеПараметровСеанса Тогда @@ -767,10 +920,6 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда @@ -844,11 +993,7 @@ КонецПроцедуры -// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов. -// -// Параметры: -// ПодчиненныеОбъекты - см. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов -// +// См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов Процедура ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда @@ -909,8 +1054,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда - МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); - МодульОбработкиПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + МодульПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда @@ -1283,26 +1428,26 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов. -Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(Знач СтруктураПоддерживаемыхВерсий) Экспорт +Процедура ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии) Экспорт Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов Тогда МодульИнтеграцияПодсистемБТС = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБТС"); - МодульИнтеграцияПодсистемБТС.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + МодульИнтеграцияПодсистемБТС.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - МодульОбменДаннымиСервер.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + МодульОбменДаннымиСервер.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); - МодульОбменДаннымиВМоделиСервиса.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + МодульОбменДаннымиВМоделиСервиса.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБИП().ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов Тогда МодульИнтеграцияПодсистемБИП = ОбщегоНазначения.ОбщийМодуль("ИнтеграцияПодсистемБИП"); - МодульИнтеграцияПодсистемБИП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(СтруктураПоддерживаемыхВерсий); + МодульИнтеграцияПодсистемБИП.ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов(ПоддерживаемыеВерсии); КонецЕсли; КонецПроцедуры @@ -1506,6 +1651,8 @@ МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; + ПользователиСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда МодульУправлениеКонтактнойИнформациейСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформациейСлужебный"); МодульУправлениеКонтактнойИнформациейСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); @@ -1526,6 +1673,11 @@ МодульРассылкаОтчетов.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + МодульУправлениеДоступомСлужебный.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда МодульУчетОригиналовПервичныхДокументов = ОбщегоНазначения.ОбщийМодуль("УчетОригиналовПервичныхДокументов"); МодульУчетОригиналовПервичныхДокументов.ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты); @@ -1953,11 +2105,11 @@ // отчета или обработки в область данных. // // Параметры: -// ДополнительнаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки, элемент справочника, -// который записывается пользователем. -// Результат - Булево - в этот параметр в данной процедуре устанавливается флаг наличия права, -// СтандартнаяОбработка - Булево - в этот параметр в данной процедуре устанавливается флаг выполнения -// стандартной обработки проверки права. +// ДополнительнаяОбработка - СправочникОбъект.ДополнительныеОтчетыИОбработки - элемент справочника, +// который записывается пользователем. +// Результат - Булево - в этот параметр в данной процедуре устанавливается флаг наличия права, +// СтандартнаяОбработка - Булево - в этот параметр в данной процедуре устанавливается флаг выполнения +// стандартной обработки проверки права. // Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт @@ -2029,7 +2181,7 @@ // в текущей модели информационной базы. // // Параметры: -// НедоступныеВидыПубликации - Массив Из Строка. +// НедоступныеВидыПубликации - Массив из Строка // Процедура ПриЗаполненииНедоступныхВидовПубликации(Знач НедоступныеВидыПубликации) Экспорт @@ -2052,7 +2204,7 @@ // // Параметры: // Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, -// Отказ - булево - флаг отказа от выполнения записи элемента справочника. +// Отказ - Булево - флаг отказа от выполнения записи элемента справочника. // Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт @@ -2072,7 +2224,7 @@ // // Параметры: // Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, -// Отказ - булево - флаг отказа от выполнения удаления элемента справочника из информационной базы. +// Отказ - Булево - флаг отказа от выполнения удаления элемента справочника из информационной базы. // Процедура ПередУдалениемДополнительнойОбработки(Источник, Отказ) Экспорт @@ -2118,9 +2270,9 @@ // Параметры: // Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки, // СтандартнаяОбработка - Булево - флаг необходимости выполнения стандартной обработки подключения -// внешней обработки, -// Результат - ВнешняяОбработкаОбъект -// - ВнешнийОтчетОбъект - объект подключенного внешнего отчета или +// внешней обработки. +// Результат - ВнешняяОбработка +// - ВнешнийОтчет - объект подключенного внешнего отчета или // обработки (в том случае, если в обработчике для параметра СтандартнаяОбработка было установлено значение Ложь). // Процедура ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат) Экспорт @@ -2260,11 +2412,7 @@ #Область ИнтерфейсOData -// Формирует массив метаданных, исключаемых из загрузки/выгрузки. -// -// Возвращаемое значение: -// ФиксированныйМассив - массив метаданных. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData(ИсключаемыеТипы) Экспорт ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(ИсключаемыеТипы); @@ -2472,6 +2620,11 @@ МодульКонтрольВеденияУчетаСлужебный.ПриДобавленииОбработчиковОбновления(Обработчики); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриДобавленииОбработчиковОбновления(Обработчики); + КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииОбработчиковОбновления(Обработчики); @@ -2615,10 +2768,10 @@ // Например, БТС может переопределить приоритет обновления для каждой области данных в режиме сервиса. // // Параметры: -// Приоритет - Строка - новое значение приоритета обновления (возвращаемое). Возвращать можно следующие значения: -// * "РаботаПользователей" - приоритет на обработку пользователей (в один поток); -// * "ОбработкаДанных" - приоритет на обработку данных (в несколько потоков); -// * Любое другое - использовать приоритет из константы СведенияОбОбновленииИБ (не переопределять). +// Приоритет - Строка - новое значение приоритета обновления (возвращаемое): +// "РаботаПользователей" - приоритет на обработку пользователей (в один поток); +// "ОбработкаДанных" - приоритет на обработку данных (в несколько потоков); +// Любое другое - использовать приоритет из константы СведенияОбОбновленииИБ (не переопределять). // Процедура ПриПолученииПриоритетаОбновления(Приоритет) Экспорт @@ -2865,8 +3018,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - МодульУдалениеПомеченныхОбъектов = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); - МодульУдалениеПомеченныхОбъектов.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); + МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда @@ -2913,10 +3066,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт @@ -2961,8 +3114,8 @@ КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") Тогда - МодульУдалениеПомеченныхОбъектов = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); - МодульУдалениеПомеченныхОбъектов.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); + МодульУдалениеПомеченныхОбъектовСлужебный = ОбщегоНазначения.ОбщийМодуль("УдалениеПомеченныхОбъектовСлужебный"); + МодульУдалениеПомеченныхОбъектовСлужебный.ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды); КонецЕсли; Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.СтруктураПодчиненности") Тогда @@ -3320,7 +3473,7 @@ // Вызывается при авторизации нового пользователя информационной базы. // // Параметры: -// ПользовательИБ - ПользовательИнформационнойБазы, текущий пользователь информационной базы, +// ПользовательИБ - ПользовательИнформационнойБазы - текущий пользователь информационной базы, // СтандартнаяОбработка - Булево - значение может быть установлено внутри обработчика, в этом случае // стандартная обработка авторизации нового пользователя ИБ выполняться не будет. // @@ -3429,11 +3582,12 @@ КонецПроцедуры -// Доопределяет действия при создании администратора в подсистеме Пользователи. -// +// Доопределяет действия при создании администратора в подсистеме Пользователи, а также +// при входе пользователя с ролями администратора, которые могли быть назначены в конфигураторе. +// // Параметры: -// Администратор - СправочникСсылка.Пользователи (изменение объекта запрещено). -// Уточнение - Строка - поясняет при каких условиях был создан администратор. +// Администратор - СправочникСсылка.Пользователи +// Уточнение - Строка - поясняет, при каких условиях был создан администратор. // Процедура ПриСозданииАдминистратора(Администратор, Уточнение) Экспорт @@ -3468,15 +3622,13 @@ // связей в регистре СоставыГруппПользователей. // // Параметры: -// УчастникиИзменений - Массив значений типов: -// - СправочникСсылка.Пользователи. -// - СправочникСсылка.ВнешниеПользователи. -// Пользователи которые участвовали в изменении состава групп. +// УчастникиИзменений - Массив из СправочникСсылка.Пользователи +// - Массив из СправочникСсылка.ВнешниеПользователи - +// пользователи, которые участвовали в изменении состава групп. // -// ИзмененныеГруппы - Массив значений типов: -// - СправочникСсылка.ГруппыПользователей. -// - СправочникСсылка.ГруппыВнешнихПользователей. -// Группы, состав которых был изменен. +// ИзмененныеГруппы - Массив из СправочникСсылка.ГруппыПользователей +// - Массив из СправочникСсылка.ГруппыВнешнихПользователей - +// группы, состав которых был изменен. // Процедура ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы) Экспорт @@ -3496,7 +3648,7 @@ // // Параметры: // ВнешнийПользователь - СправочникСсылка.ВнешниеПользователи - внешний пользователь. -// СтарыйОбъектАвторизации - NULL - при добавлении внешнего пользователя. +// СтарыйОбъектАвторизации - Null - при добавлении внешнего пользователя. // - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. // НовыйОбъектАвторизации - ОпределяемыйТип.ВнешнийПользователь - тип объекта авторизации. // @@ -3680,10 +3832,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда @@ -4036,7 +4184,9 @@ КонецПроцедуры -// См. ТекущиеДелаСлужебный.СформироватьСписокТекущихДелПользователя. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если ИнтеграцияПодсистемБСППовтИсп.ПодпискиБТС().ПриЗаполненииСпискаТекущихДел Тогда @@ -4422,12 +4572,12 @@ // исполнителей задач, которые соответствуют ключам адресации // (РольИсполнителя + ОсновнойОбъектАдресации + ДополнительныйОбъектАдресации). // -// При изменении состава дополнительных групп пользователей, необходимо вызвать +// При изменении состава дополнительных групп пользователей, необходимо вызвать // процедуру ОбновитьПользователейГруппИсполнителей в модуле УправлениеДоступом, // чтобы применить изменения к внутренним данным подсистемы. // // Параметры: -// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц, в который можно поместить таблицу: +// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - в который можно поместить таблицу // ТаблицаГруппИсполнителей с полями: // ГруппаИсполнителей - Например, // СправочникСсылка.ГруппыИсполнителейЗадач. @@ -4520,156 +4670,4 @@ #КонецОбласти -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -// Определяет события, на которые могут подписаться другие библиотеки. -// -// Возвращаемое значение: -// События - Структура - ключами свойств структуры являются имена событий, на которые -// могут быть подписаны библиотеки. -// -Функция СобытияБСП() Экспорт - - События = Новый Структура; - - // БазоваяФункциональность - События.Вставить("ПриДобавленииПодсистем", Ложь); - События.Вставить("ПриУстановкеПараметровСеанса", Ложь); - События.Вставить("ПриДобавленииОбработчиковУстановкиПараметровСеанса", Ложь); - События.Вставить("ПриДобавленииИсключенийПоискаСсылок", Ложь); - События.Вставить("ПриДобавленииПереименованийОбъектовМетаданных", Ложь); - События.Вставить("ПриЗаполненииВсехПараметровРаботыРасширений", Ложь); - События.Вставить("ПриОчисткеВсехПараметровРаботыРасширений", Ложь); - События.Вставить("ПриОтправкеДанныхГлавному", Ложь); - События.Вставить("ПриОтправкеДанныхПодчиненному", Ложь); - События.Вставить("ПриПолученииДанныхОтГлавного", Ложь); - События.Вставить("ПриПолученииДанныхОтПодчиненного", Ложь); - События.Вставить("ПослеПолученияДанных", Ложь); - События.Вставить("ПриВключенииРазделенияПоОбластямДанных", Ложь); - События.Вставить("ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов", Ложь); - События.Вставить("ПриДобавленииПараметровРаботыКлиентаПриЗапуске", Ложь); - События.Вставить("ПриДобавленииПараметровРаботыКлиента", Ложь); - События.Вставить("ПередЗапускомПрограммы", Ложь); - - // ВариантыОтчетов - События.Вставить("ПриОпределенииНастроекВариантовОтчетов", Ложь); - События.Вставить("ПриОпределенииРазделовСВариантамиОтчетов", Ложь); - События.Вставить("ПриНастройкеВариантовОтчетов", Ложь); - События.Вставить("ПриИзмененииКлючейВариантовОтчетов", Ложь); - События.Вставить("ПриОпределенииОбъектовСКомандамиОтчетов", Ложь); - События.Вставить("ПередДобавлениемКомандОтчетов", Ложь); - События.Вставить("ПриДополненииСвязиОбъектовМетаданных", Ложь); - События.Вставить("ПриОпределенииПараметровВыбораВариантыОтчетов", Ложь); - События.Вставить("ПриСозданииНаСервереВариантыОтчетов", Ложь); - События.Вставить("ПередЗагрузкойВариантаНаСервере", Ложь); - - // ГрупповоеИзменениеОбъектов - События.Вставить("ПриОпределенииОбъектовСРедактируемымиРеквизитами", Ложь); - - // ДатыЗапретаИзменений - События.Вставить("ПриЗаполненииРазделовДатЗапретаИзменения", Ложь); - События.Вставить("ПриЗаполненииИсточниковДанныхДляПроверкиЗапретаИзменения", Ложь); - - // ДополнительныеОтчетыИОбработки - События.Вставить("ПриУстановкеРежимаПодключенияДополнительногоОтчетаИлиОбработкиВОбластиДанных", Ложь); - - // ЗагрузкаДанныхИзФайла - События.Вставить("ПриОпределенииСправочниковДляЗагрузкиДанных", Ложь); - - // ЗапретРедактированияРеквизитовОбъектов - События.Вставить("ПриОпределенииОбъектовСЗаблокированнымиРеквизитами", Ложь); - - // ИнтерфейсOData - События.Вставить("ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузкиOData", Ложь); - - // КонтрольВеденияУчета - События.Вставить("ПриОпределенииПроверок", Ложь); - - // НапоминанияПользователя - События.Вставить("ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания", Ложь); - - // ОбменДанными - События.Вставить("ПриНастройкеПодчиненногоУзлаРИБ", Ложь); - - //ОбновлениеВерсииИБ - События.Вставить("ПриДобавленииОбработчиковОбновления", Ложь); // Для обратной совместимости с БТС 1.2.2. - События.Вставить("ПослеОбновленияИнформационнойБазы", Ложь); - События.Вставить("ПриПолученииПриоритетаОбновления", Ложь); - - // Печать - События.Вставить("ПриПодготовкеСпискаМакетовВФорматеОфисныхДокументовФормируемыхНаСервере", Ложь); - События.Вставить("ПриОпределенииОбъектовСКомандамиПечати", Ложь); - События.Вставить("ПередДобавлениемКомандПечати", Ложь); - События.Вставить("ПриПолученииНастроекСпискаКомандПечати", Ложь); - События.Вставить("ПриПечати", Ложь); - События.Вставить("ПередОтправкойПоПочте", Ложь); - События.Вставить("ПриПолученииПодписейИПечатей", Ложь); - События.Вставить("ПечатьДокументовПриСозданииНаСервере", Ложь); - События.Вставить("ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере", Ложь); - События.Вставить("ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере", Ложь); - События.Вставить("ПечатьДокументовПриВыполненииКоманды", Ложь); - - // ПодключаемыеКоманды - События.Вставить("ПриОпределенииВидовПодключаемыхКоманд", Ложь); - События.Вставить("ПриОпределенииСоставаНастроекПодключаемыхОбъектов", Ложь); - События.Вставить("ПриОпределенииКомандПодключенныхКОбъекту", Ложь); - События.Вставить("ПриОпределенииОбъектовСКомандамиСозданияНаОсновании", Ложь); - События.Вставить("ПередДобавлениемКомандСозданияНаОсновании", Ложь); - События.Вставить("ПриДобавленииКомандСозданияНаОсновании", Ложь); - - // Пользователи - События.Вставить("ПриОпределенииНастроек", Ложь); - События.Вставить("ПриОпределенииНазначенияРолей", Ложь); - События.Вставить("ПриОпределенииДействийВФорме", Ложь); - События.Вставить("ПриПолученииПрочихНастроек", Ложь); - События.Вставить("ПриСохраненииПрочихНастроек", Ложь); - События.Вставить("ПриУдаленииПрочихНастроек", Ложь); - События.Вставить("ПриЗавершенииОбработкиПользователяИБ", Ложь); - - //ПрофилиБезопасности - События.Вставить("ПриПроверкеВозможностиНастройкиПрофилейБезопасности", Ложь); - События.Вставить("ПриЗапросеРазрешенийНаИспользованиеВнешнихРесурсов", Ложь); - События.Вставить("ПриЗапросеСозданияПрофиляБезопасности", Ложь); - События.Вставить("ПриЗапросеУдаленияПрофиляБезопасности", Ложь); - События.Вставить("ПриПодключенииВнешнегоМодуля", Ложь); - События.Вставить("ПриВключенииИспользованияПрофилейБезопасности", Ложь); - События.Вставить("ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам", Ложь); - - // РаботаСФайлами - События.Вставить("ПриОпределенииОбъектовИсключенияСинхронизацииФайлов", Ложь); - - // РегламентныеЗадания - События.Вставить("ПриОпределенииНастроекРегламентныхЗаданий", Ложь); - - // Свойства - События.Вставить("ПриПолученииПредопределенныхНаборовСвойств", Ложь); - - // ТекущиеДела - События.Вставить("ПриОпределенииОбработчиковТекущихДел", Ложь); - События.Вставить("ПриЗаполненииСпискаТекущихДел", Ложь); - События.Вставить("ПриОпределенииПорядкаРазделовКомандногоИнтерфейса", Ложь); - События.Вставить("ПриОтключенииТекущихДел", Ложь); - События.Вставить("ПриОпределенииНастроекТекущихДел", Ложь); - События.Вставить("ПриУстановкеОбщихПараметровЗапросов", Ложь); - События.Вставить("ПриСозданииНаСервереТекущиеДела", Ложь); - События.Вставить("ПередЗагрузкойДанныхИзНастроекНаСервереТекущиеДела", Ложь); - - // УправлениеДоступом - События.Вставить("ПриЗаполненииВидовДоступа", Ложь); - События.Вставить("ПриЗаполненииСписковСОграничениемДоступа", Ложь); - События.Вставить("ПриЗаполненииПоставляемыхПрофилейГруппДоступа", Ложь); - События.Вставить("ПриЗаполненииЗависимостейПравДоступа", Ложь); - События.Вставить("ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов", Ложь); - События.Вставить("ПриЗаполненииИспользованияВидаДоступа", Ложь); - События.Вставить("ПриЗаполненииВидовОграниченийПравОбъектовМетаданных", Ложь); - - // ЦентрМониторинга - События.Вставить("ПриСбореПоказателейСтатистикиКонфигурации", Ложь); - - Возврат События; - -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl index df00822bc..ba291de44 100644 --- a/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl +++ b/SSL/src/CommonModules/ИнтеграцияПодсистемБСПКлиент/Module.bsl @@ -354,6 +354,11 @@ // См. ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки. Процедура ПриОбработкеРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда + МодульАнализЖурналаРегистрацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АнализЖурналаРегистрацииКлиент"); + МодульАнализЖурналаРегистрацииКлиент.ФормаОтчетаОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка); + КонецЕсли; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольВеденияУчета") Тогда МодульКонтрольВеденияУчетаСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("КонтрольВеденияУчетаСлужебныйКлиент"); МодульКонтрольВеденияУчетаСлужебныйКлиент.ПриОбработкеРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка); @@ -439,6 +444,11 @@ МодульКонтрольВеденияУчетаСлужебныйКлиент.ОбработкаВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка); КонецЕсли; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеДоступомСлужебныйКлиент"); + МодульУправлениеДоступомСлужебныйКлиент.ОбработкаВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка); + КонецЕсли; + Если ИнтеграцияПодсистемБСПКлиентПовтИсп.ПодпискиБТС().ПриОбработкеВыбораТабличногоДокумента Тогда МодульИнтеграцияПодсистемБТСКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ИнтеграцияПодсистемБТСКлиент"); МодульИнтеграцияПодсистемБТСКлиент.ПриОбработкеВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка); @@ -488,8 +498,8 @@ // Вызывается при завершении сеанса средствами подсистемы ЗавершениеРаботыПользователей. // // Параметры: -// ФормаВладелец - ФормаКлиентскогоПриложения, из которой выполняется завершение сеанса, -// НомераСеансов - Число (8, 0, +) - номер сеанса, который будет завершен, +// ФормаВладелец - ФормаКлиентскогоПриложения - из которой выполняется завершение сеанса, +// НомераСеансов - Число - число длиной 8 символов, номер сеанса, который будет завершен, // СтандартнаяОбработка - Булево - флаг выполнения стандартной обработки завершения сеанса // (подключение к агенту сервера через COM-соединение или сервер администрирования с // запросом параметров подключения к кластеру у текущего пользователя). Может быть @@ -648,8 +658,8 @@ // Определяет события, на которые могут подписаться другие библиотеки. // // Возвращаемое значение: -// События - Структура - ключами свойств структуры являются имена событий, на которые -// могут быть подписаны библиотеки. +// Структура - ключами свойств структуры являются имена событий, на которые +// могут быть подписаны библиотеки. // Функция СобытияБСП() Экспорт diff --git a/SSL/src/CommonModules/ИнтерфейсODataСлужебный/Module.bsl b/SSL/src/CommonModules/ИнтерфейсODataСлужебный/Module.bsl index 51e89bf4a..6aff3f391 100644 --- a/SSL/src/CommonModules/ИнтерфейсODataСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ИнтерфейсODataСлужебный/Module.bsl @@ -229,7 +229,7 @@ // Возвращает ссылки точек маршрута бизнес-процессов. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип - тип ТочкаМаршрутаБизнесПроцессаСсылка, // * Значение - Строка - имя бизнес-процесса. // @@ -255,20 +255,14 @@ КонецЕсли; Для Каждого КлассМодели Из Модель Цикл - ОписаниеОбъекта = КлассМодели.Значение.Получить(Имя); - Если ОписаниеОбъекта <> Неопределено Тогда - Если ПолноеИмя = ОписаниеОбъекта.ПолноеИмя Тогда - Возврат ОписаниеОбъекта; - КонецЕсли; - КонецЕсли; - КонецЦикла; + Возврат Неопределено; КонецФункции diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl index f49aefbff..b4d4e464b 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl @@ -12,7 +12,7 @@ // Пример использования: после очистки хранилищ настроек. // // Параметры: -// Настройки - Структура - необязательный. Настройки обновления: +// Настройки - Структура: // * ОбщиеДанные - Булево - необязательный. Обновлять неразделенные данные. // * РазделенныеДанные - Булево - необязательный. Обновлять разделенные данные. // * Оперативное - Булево - необязательный. Оперативное обновление данных. @@ -75,10 +75,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); Обработчик.ВыполнятьВГруппеОбязательных = Истина; diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl index 9903fc8d4..534ec8a13 100644 --- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -12,17 +12,17 @@ // входящих в указанный график ГрафикРаботы. // // Параметры: -// ГрафикРаботы - СправочникСсылка.Календари +// ГрафикРаботы - СправочникСсылка.Календари // - СправочникСсылка.ПроизводственныеКалендари - график или // производственный календарь, который необходимо использовать для расчета дат. -// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. -// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. -// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала. +// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или // все даты рассчитываются от переданной даты. -// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // // Возвращаемое значение: -// Неопределено, Массив - массив дат, увеличенных на количество дней, входящих в график, +// Неопределено, Массив - массив дат, увеличенных на количество дней, входящих в график, // Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатыПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт @@ -122,15 +122,15 @@ // входящих в указанный график или производственный календарь ГрафикРаботы. // // Параметры: -// ГрафикРаботы - СправочникСсылка.Календари +// ГрафикРаботы - СправочникСсылка.Календари // - СправочникСсылка.ПроизводственныеКалендари - график или // производственный календарь, который необходимо использовать для расчета даты. -// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. -// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала. -// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней. +// КоличествоДней - Число - количество дней, на которые нужно увеличить дату начала. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // // Возвращаемое значение: -// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график. +// Дата, Неопределено - дата, увеличенная на количество дней, входящих в график. // Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция ДатаПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт @@ -160,15 +160,15 @@ // Определяет количество дней, входящих в график, для указанного периода. // // Параметры: -// ГрафикРаботы - СправочникСсылка.Календари +// ГрафикРаботы - СправочникСсылка.Календари // - СправочникСсылка.ПроизводственныеКалендари - график или // производственный календарь, который необходимо использовать для расчета дней. -// ДатаНачала - Дата - дата начала периода. -// ДатаОкончания - Дата - дата окончания периода. -// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ДатаНачала - Дата - дата начала периода. +// ДатаОкончания - Дата - дата окончания периода. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. // // Возвращаемое значение: -// Число - количество дней между датами начала и окончания. +// Число - количество дней между датами начала и окончания. // Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. // Функция РазностьДатПоКалендарю(Знач ГрафикРаботы, Знач ДатаНачала, Знач ДатаОкончания, ВызыватьИсключение = Истина) Экспорт @@ -199,7 +199,7 @@ Если ПустаяСтрока(ТекстЗапроса) Тогда ШаблонОбъединения = "ВЫБРАТЬ - | ДАТАВРЕМЯ(%1) КАК ДатаГрафика + | ДАТАВРЕМЯ(2020,01,01) КАК ДатаГрафика |ПОМЕСТИТЬ ВТДатыГрафика |"; Иначе @@ -207,10 +207,10 @@ "ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ - | ДАТАВРЕМЯ(%1)"; + | ДАТАВРЕМЯ(2020,01,01)"; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонОбъединения, Формат(ДатаГрафика, "ДФ='гггг, ММ, д'")); // АПК:1367 Форматирование даты в технических целях, не отображается пользователю + ТекстЗапроса = ТекстЗапроса + СтрЗаменить( + ШаблонОбъединения, "2020,01,01", Формат(ДатаГрафика, "ДФ='гггг,ММ,д'")); // АПК:1367 Форматирование даты в технических целях, не отображается пользователю КонецЦикла; МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; @@ -338,29 +338,29 @@ // См. БлижайшиеРабочиеДаты. // // Параметры: -// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - необязательный, +// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - // если указан, то НерабочиеПериоды будет по умолчанию заполнен как Массив из описаний, // полученных методом ПериодыНерабочихДней. // // Возвращаемое значение: // Структура: // * ПолучатьПредшествующие - Булево - способ получения ближайшей даты: -// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, -// если Ложь - получаются ближайшие рабочие даты, следующие за начальными датами. -// Значение по умолчанию - Ложь: +// если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, +// если Ложь - получаются ближайшие рабочие даты, следующие за начальными датами. +// Значение по умолчанию - Ложь: // * УчитыватьНерабочиеПериоды - Булево - определяет отношение к датам, выпадающим на периоды нерабочих дней календаря, -// если Истина, даты, выпадающие на период нерабочих дней будут считаться нерабочими, -// если Ложь, периоды нерабочих дней будут игнорироваться. -// Значение по умолчанию - Истина: +// если Истина, даты, выпадающие на период нерабочих дней будут считаться нерабочими, +// если Ложь, периоды нерабочих дней будут игнорироваться. +// Значение по умолчанию - Истина: // * НерабочиеПериоды - Неопределено - уточняет периоды нерабочих дней, которые нужно учитывать, -// можно установить Массив номеров периодов или описаний, полученных методом ПериодыНерабочихДней, -// если Неопределено, будут учтены все периоды, -// если заполнен параметр ПроизводственныйКалендарь, то все периоды этого календаря будут заполнены в НерабочиеПериоды. -// Значение по умолчанию - Неопределено: +// можно установить Массив номеров периодов или описаний, полученных методом ПериодыНерабочихДней, +// если Неопределено, будут учтены все периоды, +// если заполнен параметр ПроизводственныйКалендарь, то все периоды этого календаря будут заполнены в НерабочиеПериоды. +// Значение по умолчанию - Неопределено: // * ВызыватьИсключение - Булево - вызов исключения в случае не заполненного графика -// если Истина, вызвать исключение, если график не заполнен. -// если Ложь - даты, по которым не удалось определить ближайшую дату, будут просто пропущены. -// Значение по умолчанию - Истина. +// если Истина, вызвать исключение, если график не заполнен. +// если Ложь - даты, по которым не удалось определить ближайшую дату, будут просто пропущены. +// Значение по умолчанию - Истина. // Функция ПараметрыПолученияБлижайшихРабочихДат(ПроизводственныйКалендарь = Неопределено) Экспорт Параметры = Новый Структура( @@ -381,11 +381,11 @@ // // Параметры: // ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - календарь, используемый для расчета. -// НачальныеДаты - Массив Из Дата - даты, относительно которых будет выполнен поиск ближайших. +// НачальныеДаты - Массив из Дата - даты, относительно которых будет выполнен поиск ближайших. // ПараметрыПолучения - см. ПараметрыПолученияБлижайшихРабочихДат. // // Возвращаемое значение: -// Соответствие Из КлючИЗначение: +// Соответствие из КлючИЗначение: // * Ключ - Дата - начальная дата, // * Значение - Дата - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). // @@ -486,16 +486,16 @@ // Необходимо учитывать, что для работы этой функции обязательно наличие подсистемы ГрафикиРаботы. // // Параметры: -// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. -// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - Дата - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // // Возвращаемое значение: // ТаблицаЗначений: -// * ГрафикРаботы - СправочникСсылка.Календари - график работы. -// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. -// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. -// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. +// * ГрафикРаботы - СправочникСсылка.Календари - график работы. +// * ДатаГрафика - Дата - дата в графике работы ГрафикРаботы. +// * ВремяНачала - Дата - время начала работы в день ДатаГрафика. +// * ВремяОкончания - Дата - время окончания работы в день ДатаГрафика. // Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -514,9 +514,9 @@ // // Параметры: // МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер, в котором будет создана временная таблица. -// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. -// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. -// ДатаОкончания - Дата - дата окончания периода. +// Графики - Массив - массив элементов типа СправочникСсылка.Календари, для которых составляются расписания. +// ДатаНачала - Дата - дата начала периода, за который нужно составить расписания. +// ДатаОкончания - Дата - дата окончания периода. // Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт @@ -533,9 +533,9 @@ // Заполняет реквизит в форме, в том случае, если используется единственный производственный календарь. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма, в которой требуется заполнить реквизит. -// ПутьРеквизита - Строка - путь к данным, например: "Объект.ПроизводственныйКалендарь". -// КПП - Строка - индивидуальный номер налогоплательщика (код причины постановки на учет) для определения региона. +// Форма - ФормаКлиентскогоПриложения - форма, в которой требуется заполнить реквизит. +// ПутьРеквизита - Строка - путь к данным, например: "Объект.ПроизводственныйКалендарь". +// КПП - Строка - индивидуальный номер налогоплательщика (код причины постановки на учет) для определения региона. // Процедура ЗаполнитьПроизводственныйКалендарьВФорме(Форма, ПутьРеквизита, КПП = Неопределено) Экспорт @@ -565,8 +565,8 @@ Возврат Неопределено; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Возврат МодульКалендарныеГрафики.ОсновнойПроизводственныйКалендарь(); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульЗаполнениеКалендарныхГрафиков.ОсновнойПроизводственныйКалендарь(); КонецФункции @@ -574,15 +574,15 @@ // Такие периоды могут учитываться графиками, переопределяя заполнение по данным производственного календаря. // // Параметры: -// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - календарь, который является источником. -// ПериодОтбор - СтандартныйПериод - временной интервал, в пределах которого нужно определить нерабочие периоды. +// ПроизводственныйКалендарь - СправочникСсылка.ПроизводственныеКалендари - календарь, который является источником. +// ПериодОтбор - СтандартныйПериод - временной интервал, в пределах которого нужно определить нерабочие периоды. // Возвращаемое значение: -// Массив - массив элементов типа Структура с полями: -// * Номер - Число - порядковый номер периода, может использоваться для идентификации. -// * Период - СтандартныйПериод - нерабочий период. -// * Основание - Строка - нормативный акт, на основании которого установлен нерабочий период. -// * Даты - Массив Из Дата - даты, входящие в нерабочий период. -// * Представление - Строка - пользовательское представление периода. +// Массив - массив элементов типа Структура с полями: +// * Номер - Число - порядковый номер периода, может использоваться для идентификации. +// * Период - СтандартныйПериод - нерабочий период. +// * Основание - Строка - нормативный акт, на основании которого установлен нерабочий период. +// * Даты - Массив из Дата - даты, входящие в нерабочий период. +// * Представление - Строка - пользовательское представление периода. // Функция ПериодыНерабочихДней(ПроизводственныйКалендарь, ПериодОтбор) Экспорт @@ -591,8 +591,8 @@ Возврат Периоды; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Периоды = МодульКалендарныеГрафики.ПериодыНерабочихДней(ПроизводственныйКалендарь, ПериодОтбор); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Периоды = МодульЗаполнениеКалендарныхГрафиков.ПериодыНерабочихДней(ПроизводственныйКалендарь, ПериодОтбор); УдалитьПериодыНеСоответствующиеОтбору(Периоды, ПериодОтбор); @@ -607,29 +607,27 @@ // Событие возникает при сборе информации о классификаторах, регистрируем производственные календари. // // Параметры: -// Классификаторы - см. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов.Классификаторы +// Классификаторы - см. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов.Классификаторы // Процедура ПриДобавленииКлассификаторов(Классификаторы) Экспорт - Описатель = Неопределено; - + Описание = Неопределено; Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); - Описатель = МодульРаботаСКлассификаторами.ОписаниеКлассификатора(); + Описание = МодульРаботаСКлассификаторами.ОписаниеКлассификатора(); КонецЕсли; - - Если Описатель = Неопределено Тогда + Если Описание = Неопределено Тогда Возврат; КонецЕсли; - Описатель.Идентификатор = ИдентификаторКлассификатора(); - Описатель.Наименование = НСтр("ru = 'Календари'"); - Описатель.ОбновлятьАвтоматически = Истина; - Описатель.ОбщиеДанные = Истина; - Описатель.ОбработкаРазделенныхДанных = Истина; - Описатель.СохранятьФайлВКэш = Истина; + Описание.Идентификатор = ИдентификаторКлассификатора(); + Описание.Наименование = НСтр("ru = 'Календари'"); + Описание.ОбновлятьАвтоматически = Истина; + Описание.ОбщиеДанные = Истина; + Описание.ОбработкаРазделенныхДанных = Истина; + Описание.СохранятьФайлВКэш = Истина; - Классификаторы.Добавить(Описатель); + Классификаторы.Добавить(Описание); КонецПроцедуры @@ -655,22 +653,24 @@ // - или ГрафикиРаботы.БлижайшиеДатыВключенныеВГрафик - для графика работы. // Определяет для каждой даты дату ближайшего к ней рабочего дня. // -// Параметры: -// График - СправочникСсылка.Календари +// Параметры: +// График - СправочникСсылка.Календари // - СправочникСсылка.ПроизводственныеКалендари - график или // производственный календарь, который необходимо использовать для расчета. -// НачальныеДаты - Массив - массив дат (Дата). -// ПолучатьПредшествующие - Булево - способ получения ближайшей даты: +// НачальныеДаты - Массив - массив дат (Дата). +// ПолучатьПредшествующие - Булево - способ получения ближайшей даты: // если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, // если Ложь - получаются даты не ранее начальной даты. -// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. -// ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. +// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика. +// ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. // Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут. // -// Возвращаемое значение: -// Соответствие, Неопределено - соответствие, где ключ - дата из переданного массива, -// значение - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). -// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено. +// Возвращаемое значение: +// - Соответствие из КлючИЗначение: +// * Ключ - Дата - дата из переданного массива +// * Значение - Дата - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается). +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено +// - Неопределено // Функция ДатыБлижайшихРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие = Ложь, ВызыватьИсключение = Истина, ИгнорироватьНезаполненностьГрафика = Ложь) Экспорт @@ -703,9 +703,9 @@ // формируется строка с индексом элемента и значением - количеством дней. // // Параметры: -// - МенеджерВременныхТаблиц, -// - МассивДней - массив - количество дней, -// - РассчитыватьСледующуюДатуОтПредыдущей - необязательный, по умолчанию Ложь. +// - МенеджерВременныхТаблиц, +// - МассивДней - Массив - количество дней, +// - РассчитыватьСледующуюДатуОтПредыдущей - по умолчанию Ложь. // Процедура СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь) Экспорт @@ -750,9 +750,9 @@ // например, Графиков работы. // // Параметры: -// ТаблицаИзменений - таблица с колонками. -// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, -// - Год - год, за который нужно обновить данные. +// ТаблицаИзменений - ТаблицаЗначений: +// * КодПроизводственногоКалендаря - Число - код производственного календаря, данные которого изменились, +// * Год - Число - год, за который нужно обновить данные. // Процедура РаспространитьИзмененияДанныхПроизводственныхКалендарей(ТаблицаИзменений) Экспорт @@ -771,9 +771,9 @@ // например, Графиков работы. // // Параметры: -// ТаблицаИзменений - таблица с колонками. -// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, -// - Год - год, за который нужно обновить данные. +// ТаблицаИзменений - ТаблицаЗначений: +// * КодПроизводственногоКалендаря - Число - код производственного календаря, данные которого изменились, +// * Год - Число - год, за который нужно обновить данные. // Процедура ЗаполнитьДанныеЗависимыеОтПроизводственныхКалендарей(ТаблицаИзменений) Экспорт @@ -793,7 +793,7 @@ // Определяет внутренний идентификатор классификатора для подсистемы РаботаСКлассификаторами. // // Возвращаемое значение: -// Строка - идентификатор классификатора. +// Строка - идентификатор классификатора. // Функция ИдентификаторКлассификатора() Экспорт Возврат "Calendars20"; @@ -810,8 +810,8 @@ Возврат 0; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Возврат МодульКалендарныеГрафики.ВерсияКалендарей(); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульЗаполнениеКалендарныхГрафиков.ВерсияКалендарей(); КонецФункции @@ -843,11 +843,11 @@ // Возвращаемое значение: // Структура: // * ПроизводственныеКалендари - Структура: -// * ИмяТаблицы - Строка - имя таблицы. -// * Данные - ТаблицаЗначений - преобразованная из XML таблица календарей. +// * ИмяТаблицы - Строка - имя таблицы. +// * Данные - ТаблицаЗначений - преобразованная из XML таблица календарей. // * ДанныеПроизводственныхКалендарей - Структура: -// * ИмяТаблицы - Строка - имя таблицы. -// * Данные - ТаблицаЗначений - преобразованная из XML таблица данных календарей. +// * ИмяТаблицы - Строка - имя таблицы. +// * Данные - ТаблицаЗначений - преобразованная из XML таблица данных календарей. // Функция ДанныеКлассификатора() Экспорт @@ -922,9 +922,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -966,9 +964,7 @@ КонецПроцедуры -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -978,7 +974,7 @@ КонецПроцедуры // Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.Типы +// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.Типы // Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт @@ -1044,8 +1040,8 @@ Возврат Неопределено; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Возврат МодульКалендарныеГрафики.РегиональныйПроизводственныйКалендарь(КПП); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульЗаполнениеКалендарныхГрафиков.РегиональныйПроизводственныйКалендарь(КПП); КонецФункции @@ -1162,8 +1158,8 @@ Возврат "1.0.0.1"; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Возврат МодульКалендарныеГрафики.ВерсияОбновленияПроизводственныхКалендарей(); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульЗаполнениеКалендарныхГрафиков.ВерсияОбновленияПроизводственныхКалендарей(); КонецФункции @@ -1173,8 +1169,8 @@ Возврат "1.0.0.1"; КонецЕсли; - МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); - Возврат МодульКалендарныеГрафики.ВерсияОбновленияДанныхПроизводственныхКалендарей(); + МодульЗаполнениеКалендарныхГрафиков = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаполнениеКалендарныхГрафиков"); + Возврат МодульЗаполнениеКалендарныхГрафиков.ВерсияОбновленияДанныхПроизводственныхКалендарей(); КонецФункции @@ -1403,7 +1399,6 @@ Обработчик = Обработчики.Добавить(); Обработчик.Версия = ВерсияОбновленияДанныхПроизводственныхКалендарей(); Обработчик.Процедура = "КалендарныеГрафики.ОбновитьДанныеЗависимыеОтПроизводственныхКалендарей"; - Обработчик.ОчередьОтложеннойОбработки = 2; Обработчик.ПроцедураЗаполненияДанныхОбновления = "КалендарныеГрафики.ЗаполнитьДанныеОбновленияДанныхЗависимыхОтПроизводственныхКалендарей"; Обработчик.РежимВыполнения = "Отложенно"; Обработчик.ЗапускатьИВПодчиненномУзлеРИБСФильтрами = Истина; diff --git a/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl index 7fa59fe7e..244e43fed 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафикиПереопределяемый/Module.bsl @@ -12,9 +12,9 @@ // В случае, если разделение включено, выполняется в не разделенном режиме. // // Параметры: -// УсловияОбновления - ТаблицаЗначений: -// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; -// * Год - Число - календарный год, за который изменились данные. +// УсловияОбновления - ТаблицаЗначений: +// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; +// * Год - Число - календарный год, за который изменились данные. // Процедура ПриОбновленииПроизводственныхКалендарей(УсловияОбновления) Экспорт @@ -24,9 +24,9 @@ // В случае, если разделение включено, выполняется в областях данных. // // Параметры: -// УсловияОбновления - ТаблицаЗначений: -// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; -// * Год - Число - календарный год, за который изменились данные. +// УсловияОбновления - ТаблицаЗначений: +// * КодПроизводственногоКалендаря - Строка - код производственного календаря, данные которого изменились; +// * Год - Число - календарный год, за который изменились данные. // Процедура ПриОбновленииДанныхЗависимыхОтПроизводственныхКалендарей(УсловияОбновления) Экспорт @@ -37,7 +37,7 @@ // которые следует заблокировать от использования на период обновления производственных календарей. // // Параметры: -// БлокируемыеОбъекты - Массив - имена метаданных блокируемых объектов. +// БлокируемыеОбъекты - Массив - имена метаданных блокируемых объектов. // Процедура ПриЗаполненииБлокируемыхОбъектовЗависимыхОтПроизводственныхКалендарей(БлокируемыеОбъекты) Экспорт @@ -48,7 +48,7 @@ // которые будут изменяться при обновлении производственных календарей. // // Параметры: -// ИзменяемыеОбъекты - Массив - имена метаданных изменяемых объектов. +// ИзменяемыеОбъекты - Массив - имена метаданных изменяемых объектов. // Процедура ПриЗаполненииИзменяемыхОбъектовЗависимыхОтПроизводственныхКалендарей(ИзменяемыеОбъекты) Экспорт diff --git a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl index 6e7401865..698e29f60 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчета/Module.bsl @@ -21,7 +21,7 @@ // - Массив - произвольные дополнительные параметры проверки, // которые уточняют, что и как именно проверять. // См. КонтрольВеденияУчета.ПараметрыВыполненияПроверки. -// - Структура: +// - Структура: // * Свойство1 - ЛюбаяСсылка // - Булево // - Число @@ -527,22 +527,17 @@ ТекстЗапроса = ТекущийСписок.ТекстЗапроса; Иначе ИсполняемаяСхема = ТаблицаФормы.ПолучитьИсполняемуюСхемуКомпоновкиДанных(); - НаборДанныхДинамическогоСписка = ИсполняемаяСхема.НаборыДанных.Найти("НаборДанныхДинамическогоСписка"); + НаборДанныхДинамическогоСписка = ИсполняемаяСхема.НаборыДанных.Найти("НаборДанныхДинамическогоСписка"); // НаборДанныхЗапросСхемыКомпоновкиДанных Если НаборДанныхДинамическогоСписка <> Неопределено Тогда ТекущийСписок.ПроизвольныйЗапрос = Истина; ТекстЗапроса = НаборДанныхДинамическогоСписка.Запрос; КонецЕсли; КонецЕсли; - Если Не ЗначениеЗаполнено(ТекстЗапроса) Тогда + Если Не ЗначениеЗаполнено(ТекстЗапроса) Или Не СтрНачинаетсяС(ТекстЗапроса, "ВЫБРАТЬ") Тогда Продолжить; КонецЕсли; - НачалоЗапроса = Лев(ТекстЗапроса, 7); - Если НачалоЗапроса <> "ВЫБРАТЬ" Тогда - Продолжить; - КонецЕсли; - Если ИмяПоляИндикатораПроблем = Неопределено Тогда ИмяКолонки = "ИндикаторОшибки_" + ОбщегоНазначения.КонтрольнаяСуммаСтрокой(Форма.ИмяФормы + ПолучитьРазделительПути() + ИмяСписка); Иначе @@ -561,7 +556,25 @@ СтруктураСвойствДинамическогоСписка = ОбщегоНазначения.СтруктураСвойствДинамическогоСписка(); ДобавляемоеПоле = " 0 КАК " + ИмяКолонки + ","; ЗапросМассивом = СтрРазделить(ТекстЗапроса, Символы.ПС); - ЗапросМассивом.Вставить(1, ДобавляемоеПоле); + ПозицияДляВставки = Неопределено; + Если СтрЧислоВхождений(ТекстЗапроса, "ВЫБРАТЬ") > 1 Тогда + Индекс = 0; + Для Каждого СтрокаЗапроса Из ЗапросМассивом Цикл + Если СтрНачинаетсяС(СокрЛП(СтрокаЗапроса), "ВЫБРАТЬ") Тогда + Если ПозицияДляВставки = Неопределено Тогда + ПозицияДляВставки = Индекс + 1; + Иначе + Прервать; + КонецЕсли; + ИначеЕсли СтрНачинаетсяС(СокрЛП(СтрокаЗапроса), "ПОМЕСТИТЬ") Тогда + ПозицияДляВставки = Неопределено; + КонецЕсли; + Индекс = Индекс + 1; + КонецЦикла; + Иначе + ПозицияДляВставки = 1; + КонецЕсли; + ЗапросМассивом.Вставить(ПозицияДляВставки, ДобавляемоеПоле); СтруктураСвойствДинамическогоСписка.ТекстЗапроса = СтрСоединить(ЗапросМассивом, Символы.ПС); ОбщегоНазначения.УстановитьСвойстваДинамическогоСписка(ТаблицаФормы, СтруктураСвойствДинамическогоСписка); КонецЕсли; @@ -663,10 +676,10 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - форма объекта. // ТекущийОбъект - ДокументОбъект - объект, который будет прочитан. -// - СправочникОбъект -// - ПланОбменаОбъект -// - ПланВидовХарактеристикОбъект -// - ПланСчетовОбъект +// - СправочникОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект // - ПланВидовРасчетаОбъект // - ЗадачаОбъект // @@ -738,11 +751,11 @@ // установлено свойство ПоддерживаетВыборочнуюПроверку в значение Истина. // // Параметры: -// ТекущийОбъект - - ДокументОбъект - <ВидОбъектаМетаданных>Объект.<ИмяОбъектаМетаданных>. -// - СправочникОбъект -// - ПланОбменаОбъект -// - ПланВидовХарактеристикОбъект -// - ПланСчетовОбъект +// ТекущийОбъект - ДокументОбъект - <ВидОбъектаМетаданных>Объект.<ИмяОбъектаМетаданных>. +// - СправочникОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект // - ПланВидовРасчетаОбъект // - ЗадачаОбъект // diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаВызовСервера/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаВызовСервера/Module.bsl index 0854caeab..255a15690 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаВызовСервера/Module.bsl @@ -113,7 +113,7 @@ Значение = Расшифровка[0].Значение; ЗначениеЧастями = СтрРазделить(Значение, ";"); - Если ЗначениеЧастями.Количество() <> 5 Тогда + Если ЗначениеЧастями.Количество() < 5 Тогда Возврат Неопределено; КонецЕсли; diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl index 712a8866a..f6cc6ef16 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаКлиент/Module.bsl @@ -30,7 +30,7 @@ // Открывает форму отчета при нажатии на гиперссылку, сигнализирующую о наличии проблем. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - управляемая форма проблемного объекта. +// Форма - ФормаКлиентскогоПриложения - форма проблемного объекта. // ПроблемныйОбъект - СсылкаНаОбъект - ссылка на проблемный объект. // СтандартнаяОбработка - Булево - в данный параметр передается признак выполнения // стандартной (системной) обработки события. @@ -56,7 +56,7 @@ // сигнализирующей о наличии проблем с выделенным объектом. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - управляемая форма проблемного объекта. +// Форма - ФормаКлиентскогоПриложения - форма проблемного объекта. // ИмяСписка - Строка - имя целевого динамического списка как реквизита формы. // Поле - ПолеФормы - колонка в которой располагается картинка, // сигнализирующая о наличии проблем. diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаПереопределяемый/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаПереопределяемый/Module.bsl index fe8689ce6..a9fbe0367 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаПереопределяемый/Module.bsl @@ -12,7 +12,7 @@ // // Параметры: // Настройки - Структура: -// * КартинкаИндикатораПроблем - картинка, которая будет выводиться в качестве +// * КартинкаИндикатораПроблем - Картинка - которая будет выводиться в качестве // индикатора ошибки в колонке динамического списка // форм списков и на специальной панели форм объектов. // * ПояснениеИндикатораПроблем - Строка - поясняющая строка к ошибке. @@ -85,7 +85,7 @@ // * УточнениеКонтекстаПроверокВеденияУчета - ОпределяемыйТип.УточнениеКонтекстаПроверокВеденияУчета - второе значение, // дополнительно уточняющее принадлежность проверки ведения учета // к определенной группе или категории. -// * ДополнительныеПараметры - ХранилищеЗначений - произвольная дополнительная информация о проверке +// * ДополнительныеПараметры - ХранилищеЗначения - произвольная дополнительная информация о проверке // для программного использования. // * Комментарий - Строка - текстовый комментарий к проверке. // * Отключена - Булево - если Истина, то проверка не будет выполняться в фоне по расписанию. @@ -169,7 +169,7 @@ // идентифицировать ответственного в проблемном объекте. // * ИгнорироватьПроблему - Булево - флаг игнорирования проблемы. Если имеет значение "Истина", // запись о проблеме игнорируется подсистемой. -// * ДополнительнаяИнформация - ХранилищеЗначений - служебное свойство с дополнительными +// * ДополнительнаяИнформация - ХранилищеЗначения - служебное свойство с дополнительными // сведениями, связанными с выявленной проблемой. // * Выявлено - Дата - серверное время идентификации проблемы. // @@ -219,7 +219,7 @@ // которая выявила проблему. // * ВидПроверки - СправочникСсылка.ВидыПроверок - вид проверки // с дополнительной информацией о проблеме. -// * ДополнительныеПараметры - ХранилищеЗначений - дополнительная информация по проверке. +// * ДополнительныеПараметры - ХранилищеЗначения - дополнительная информация по проверке. // // Пример: // Проверка = Проверки.Добавить(); diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl index 80d80c766..fde455015 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебный/Module.bsl @@ -9,10 +9,6 @@ #Область СлужебныйПрограммныйИнтерфейс // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если ЕстьИзмененияПараметровПроверокУчета() Тогда @@ -56,10 +52,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -124,9 +118,7 @@ КонецПроцедуры -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт // Результаты проверки ведения учета будут заново сформированы при следующей проверке, @@ -135,9 +127,7 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ПроверкаВеденияУчета"); @@ -727,7 +717,8 @@ // Параметры: // КлючиСтрок - Массив - массив, содержащий все ключи строк динамического списка. // -// Возвращаемое значение - Массив из ЛюбаяСсылка - массив проблемных объектов. +// Возвращаемое значение: +// Массив из ЛюбаяСсылка - массив проблемных объектов. // Функция ПроблемныеОбъекты(КлючиСтрок, ВключаяВажность = Ложь) Экспорт @@ -910,7 +901,8 @@ // Параметры // ИдентификаторРегламентногоЗадания - Строка - Поле для связки с текущим фоновым заданием. // -// Возвращаемое значение - Структура - со свойствами, Неопределено: +// Возвращаемое значение: +// Структура - со свойствами, Неопределено: // * Идентификатор - Строка - строковый идентификатор проверки. // Функция ПараметрыПроверкиПоИдентификаторуРегламентногоЗадания(ИдентификаторРегламентногоЗадания) @@ -1029,8 +1021,9 @@ ГруппаПроверокОбъект.КонтекстПроверокВеденияУчета = ГруппаПроверок.КонтекстПроверокВеденияУчета; КонецЕсли; + // АПК:1327-выкл блокировка устанавливается выше по стеку. ОбновлениеИнформационнойБазы.ЗаписатьДанные(ГруппаПроверокОбъект); - + // АПК:1327-вкл КонецЦикла; Запрос = Новый Запрос( @@ -1058,7 +1051,9 @@ Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("ГруппыПроверок", ГруппыПроверок); + // АПК:1327-выкл блокировка устанавливается выше по стеку. Результат = Запрос.Выполнить().Выбрать(); + // АПК:1327-вкл Пока Результат.Следующий() Цикл ГруппаПроверокОбъект = Результат.Ссылка.ПолучитьОбъект(); ГруппаПроверокОбъект.УстановитьПометкуУдаления(Истина); @@ -1115,7 +1110,9 @@ ПроверкаОбъект.ДатаНачалаПроверки = Проверка.ДатаНачалаПроверки; КонецЕсли; + // АПК:1327-выкл блокировка устанавливается выше по стеку. ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПроверкаОбъект); + // АПК:1327-вкл КонецЦикла; Запрос = Новый Запрос( @@ -1143,7 +1140,9 @@ Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.УстановитьПараметр("Проверки", Проверки); + // АПК:1327-выкл блокировка устанавливается выше по стеку. Результат = Запрос.Выполнить().Выбрать(); + // АПК:1327-вкл Пока Результат.Следующий() Цикл ПроверкаОбъект = Результат.Ссылка.ПолучитьОбъект(); ПроверкаОбъект.УстановитьПометкуУдаления(Истина); @@ -2146,9 +2145,9 @@ // Параметры: -// ОбъектМетаданных - ОбъектМетаданных +// ОбъектМетаданных - ОбъектМетаданных // Возвращаемое значение: -// Массив из Строка +// Массив из Строка // Функция СсылочныеРеквизитыОбъекта(ОбъектМетаданных) @@ -2582,9 +2581,9 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрСведений -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы -// ПроверенныеСсылки - Соответствие +// ОбъектМетаданных - ОбъектМетаданныхРегистрСведений +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ПроверенныеСсылки - Соответствие // Процедура НайтиБитыеСсылкиВНезависимыхНеПериодическихРегистрахСведений(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки) @@ -2684,10 +2683,10 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы -// ВидыСубконто - Массив -// ПроверенныеСсылки - Соответствие +// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ВидыСубконто - Массив +// ПроверенныеСсылки - Соответствие // Процедура НайтиБитыеСсылкиВРегистрахБухгалтерии(ОбъектМетаданных, ПараметрыПроверки, ВидыСубконто, ПроверенныеСсылки) @@ -2809,9 +2808,9 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрРасчета -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы -// ПроверенныеСсылки - Соответствие +// ОбъектМетаданных - ОбъектМетаданныхРегистрРасчета +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ПроверенныеСсылки - Соответствие // Процедура НайтиБитыеСсылкиВРегистрахРасчета(ОбъектМетаданных, ПараметрыПроверки, ПроверенныеСсылки) @@ -3027,8 +3026,8 @@ // Параметры: -// ОбъектМетаданных - Произвольный -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ОбъектМетаданных - Произвольный +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы // Процедура НайтиНезаполненныеОбязательныеРеквизиты(ОбъектМетаданных, ПараметрыПроверки) @@ -3161,12 +3160,12 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии -// - Произвольный -// - ОбъектМетаданныхРегистрСведений -// - ОбъектМетаданныхРегистрНакопления -// - ОбъектМетаданныхРегистрРасчета -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии +// - Произвольный +// - ОбъектМетаданныхРегистрСведений +// - ОбъектМетаданныхРегистрНакопления +// - ОбъектМетаданныхРегистрРасчета +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы // Процедура НайтиНезаполненныеОбязательныеРеквизитыВПодчиненныхПериодическихРегистрах(ОбъектМетаданных, ПараметрыПроверки) @@ -3294,12 +3293,12 @@ // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии -// - Произвольный -// - ОбъектМетаданныхРегистрСведений -// - ОбъектМетаданныхРегистрНакопления -// - ОбъектМетаданныхРегистрРасчета -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии +// - Произвольный +// - ОбъектМетаданныхРегистрСведений +// - ОбъектМетаданныхРегистрНакопления +// - ОбъектМетаданныхРегистрРасчета +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы // Процедура НайтиНезаполненныеОбязательныеРеквизитыВПодчиненныхНепериодическихРегистрах(ОбъектМетаданных, ПараметрыПроверки) @@ -3377,12 +3376,12 @@ // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии -// - Произвольный -// - ОбъектМетаданныхРегистрСведений -// - ОбъектМетаданныхРегистрНакопления -// - ОбъектМетаданныхРегистрРасчета -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии +// - Произвольный +// - ОбъектМетаданныхРегистрСведений +// - ОбъектМетаданныхРегистрНакопления +// - ОбъектМетаданныхРегистрРасчета +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы // Процедура НайтиНезаполненныеОбязательныеРеквизитыВНезависимыхНепериодическихРегистрахСведений(ОбъектМетаданных, ПараметрыПроверки) @@ -3514,12 +3513,12 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии -// - Произвольный -// - ОбъектМетаданныхРегистрСведений -// - ОбъектМетаданныхРегистрНакопления -// - ОбъектМетаданныхРегистрРасчета -// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы +// ОбъектМетаданных - ОбъектМетаданныхРегистрБухгалтерии +// - Произвольный +// - ОбъектМетаданныхРегистрСведений +// - ОбъектМетаданныхРегистрНакопления +// - ОбъектМетаданныхРегистрРасчета +// ПараметрыПроверки - см. КонтрольВеденияУчета.ОписаниеПроблемы // Процедура НайтиНезаполненныеОбязательныеРеквизитыВНезависимыхПериодическихРегистрахСведений(ОбъектМетаданных, ПараметрыПроверки) @@ -3737,9 +3736,9 @@ КонецФункции // Параметры: -// СтандартныеРеквизиты - ОписанияСтандартныхРеквизитов +// СтандартныеРеквизиты - ОписанияСтандартныхРеквизитов // Возвращаемое значение: -// Булево +// Булево // Функция ЕстьИерархия(СтандартныеРеквизиты) @@ -3837,8 +3836,8 @@ КонецФункции // Возвращаемое значение: -// ТаблицаЗначений: -// * Ссылка - ЛюбаяСсылка +// ТаблицаЗначений: +// * Ссылка - ЛюбаяСсылка // Функция ДочерниеЭлементыРодителя(СсылкаНаОбъект, Знач ИсключениеВыборки) Перем Результат; @@ -3929,7 +3928,6 @@ ТекстВременнойТаблицы = ""; ТекстВыборки = ""; - ПараметрыЗапроса = Новый Структура; Запрос = Новый Запрос; Для Каждого ОбъектМетаданных Из ВидМетаданных Цикл @@ -4209,8 +4207,9 @@ // ПараметрыВыполненияПроверки - Структура // - Массив - произвольные дополнительные параметры проверки, // которые уточняют, что и как именно проверять. -// - Структура - один параметр проверки. Состав свойств см. КонтрольВеденияУчета.ПараметрыВыполненияПроверки. -// - Массив - несколько параметров проверки (элементы массива типа Структура, как описано выше). +// - Структура - один параметр проверки. Состав свойств см. КонтрольВеденияУчета.ПараметрыВыполненияПроверки. +// - Массив - несколько параметров проверки (элементы массива типа Структура, как +// описано выше). // // Возвращаемое значение: // см. КонтрольВеденияУчета.ОписаниеПроблемы. @@ -4411,7 +4410,16 @@ // Возвращает допустимые типы параметров проверки. // // Возвращаемое значение: -// см. КонтрольВеденияУчетаСлужебный.ПодготовитьПараметрыПроверки. +// Структура: +// * ВажностьПроблемы - ПеречислениеСсылка.ВажностьПроблемыУчета +// * ГлобальныеНастройки - Структура +// * ДатаНачалаПроверки - Дата +// * Идентификатор - Строка +// * ИдентификаторРегламентногоЗадания - Строка +// * ИтерацияПроверки - Число +// * ЛимитПроблем - Число +// * Наименование - Строка +// * Проверка - СправочникСсылка.ПравилаПроверкиУчета // Функция ОжидаемыеТипыСвойствПараметровПроверки() Экспорт @@ -4453,7 +4461,7 @@ // ПолноеОписаниеПроблемы - Булево - влияет на состав свойств возвращаемого значения. // // Возвращаемое значение: -// Проблема - Структура: +// Структура: // * ПроблемныйОбъект - ЛюбаяСсылка - ссылка на объект "Источник" проблем. // * ПравилоПроверки - СправочникСсылка.ПравилаПроверкиУчета - ссылка на выполненную проверку. // * ВидПроверки - СправочникСсылка.ВидыПроверок - ссылка на вид проверки, к которому @@ -4470,7 +4478,7 @@ // * ИгнорироватьПроблему - Булево - флаг игнорирования проблемы. Если имеет значение "Истина", // запись о проблеме игнорируется подсистемой. // Возвращается, если параметр ПолноеОписаниеПроблемы = Истина. -// * ДополнительнаяИнформация - ХранилищеЗначений - служебное свойство с дополнительными +// * ДополнительнаяИнформация - ХранилищеЗначения - служебное свойство с дополнительными // сведениями, связанными с выявленной проблемой. // Возвращается, если параметр ПолноеОписаниеПроблемы = Истина. // * Выявлено - Дата - серверное время идентификации проблемы. diff --git a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl index 6a0d60f68..2f83436a2 100644 --- a/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонтрольВеденияУчетаСлужебныйКлиент/Module.bsl @@ -100,10 +100,10 @@ КонецПроцедуры // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения: -// * ОтчетТабличныйДокумент - ТабличныйДокумент -// Команда - КомандаФормы -// Результат - Булево +// ФормаОтчета - ФормаКлиентскогоПриложения: +// * ОтчетТабличныйДокумент - ТабличныйДокумент +// Команда - КомандаФормы +// Результат - Булево // Процедура ПриОбработкеКоманды(ФормаОтчета, Команда, Результат) Экспорт diff --git a/SSL/src/CommonModules/МультиязычностьКлиент/Module.bsl b/SSL/src/CommonModules/МультиязычностьКлиент/Module.bsl index cf212917e..65c2e5cd2 100644 --- a/SSL/src/CommonModules/МультиязычностьКлиент/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьКлиент/Module.bsl @@ -12,7 +12,7 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма содержащая мультиязычные реквизиты. -// Объект - ДанныеФормыСтруктура - объект на форме: +// Объект - ДанныеФормыСтруктура: // * Ссылка - ЛюбаяСсылка // Элемент - ПолеФормы - элемент формы, для которого будет открыта форма ввода на разных языках. // СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. @@ -45,8 +45,8 @@ КонецЕсли; ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("Форма", Форма); - ДополнительныеПараметры.Вставить("Объект", Объект); + ДополнительныеПараметры.Вставить("Форма", Форма); + ДополнительныеПараметры.Вставить("Объект", Объект); ДополнительныеПараметры.Вставить("ИмяРеквизита", ИмяРеквизита); Оповещение = Новый ОписаниеОповещения("ПослеВводаСтрокНаРазныхЯзыках", МультиязычностьКлиент, ДополнительныеПараметры); @@ -56,6 +56,17 @@ #КонецОбласти +#Область СлужебныйПрограммныйИнтерфейс + +Процедура ОткрытьФормуРегиональныхНастроек(ОписаниеОповещения = Неопределено, Параметры = Неопределено) Экспорт + + ОткрытьФорму("ОбщаяФорма.РегиональныеНастройки", Параметры, , , , , ОписаниеОповещения); + +КонецПроцедуры + +#КонецОбласти + + #Область СлужебныеПроцедурыИФункции Процедура ПослеВводаСтрокНаРазныхЯзыках(Результат, ДополнительныеПараметры) Экспорт @@ -64,7 +75,9 @@ Возврат; КонецЕсли; - ДополнительныеПараметры.Форма.Модифицированность = Истина; + Если Результат.Модифицированность Тогда + ДополнительныеПараметры.Форма.Модифицированность = Истина; + КонецЕсли; Объект = ДополнительныеПараметры.Объект; Если Результат.ХранениеВТабличнойЧасти Тогда diff --git a/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl b/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl index e0c31f0da..985fdff2f 100644 --- a/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьКлиентСервер/Module.bsl @@ -36,15 +36,15 @@ ИначеЕсли Данные.Свойство("Ссылка") Или Данные.Ссылка <> Неопределено Тогда ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 - | Представления.%2 КАК Наименование + | &ИмяРеквизита КАК Наименование |ИЗ - | %1.Представления КАК Представления + | &Представления КАК Представления |ГДЕ | Представления.КодЯзыка = &Язык | И Представления.Ссылка = &Ссылка"; - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗапроса, - Данные.Ссылка.Метаданные().ПолноеИмя(), ИмяРеквизита); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизита", "Представления." + ИмяРеквизита); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Представления", Данные.Ссылка.Метаданные().ПолноеИмя() + ".Представления"); Запрос = Новый Запрос(ТекстЗапроса); diff --git a/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl b/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl index a9a63c572..dcf69fa2a 100644 --- a/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьПовтИсп/Module.bsl @@ -25,7 +25,7 @@ КонецЕсли; Если МультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() - Или МультиязычностьСервер.ИспользуетсяПервыйДополнительныйЯзык() Тогда + Или МультиязычностьСервер.ИспользуетсяВторойДополнительныйЯзык() Тогда Возврат Ложь; КонецЕсли; diff --git a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl index eb0051e4d..5a976ad0b 100644 --- a/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl +++ b/SSL/src/CommonModules/МультиязычностьСервер/Module.bsl @@ -46,13 +46,8 @@ // Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено, ИмяОбъекта = Неопределено) Экспорт - Если Объект <> Неопределено И МультиязычностьПовтИсп.КонфигурацияИспользуетТолькоОдинЯзык(Объект.Свойство("Представления")) Тогда - Возврат; - КонецЕсли; - - ТипФормы = МультиязычностьПовтИсп.ОпределитьТипФормы(Форма.ИмяФормы); - Если Объект = Неопределено Тогда + ТипФормы = МультиязычностьПовтИсп.ОпределитьТипФормы(Форма.ИмяФормы); Если ТипФормы = "ОсновнаяФормаСписка" Или ТипФормы = "ОсновнаяФормаВыбора" Тогда Если ТипЗнч(ИмяОбъекта) <> Тип("Строка") Тогда ИмяОбъекта = "Список"; @@ -63,6 +58,18 @@ Возврат; КонецЕсли; + ИспользуютсяДополнительныеЯзыки = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ИспользуютсяДополнительныеЯзыки = МодульУправлениеПечатьюМультиязычность.ИспользуютсяДополнительныеЯзыкиПечатныхФорм(); + КонецЕсли; + + Если Объект <> Неопределено + И МультиязычностьПовтИсп.КонфигурацияИспользуетТолькоОдинЯзык(Объект.Свойство("Представления")) + И Не ИспользуютсяДополнительныеЯзыки Тогда + Возврат; + КонецЕсли; + СписокРеквизитовФормы = Форма.ПолучитьРеквизиты(); СоздатьПараметрыМультиязычныхРеквизитов = Истина; Для Каждого Реквизит Из СписокРеквизитовФормы Цикл @@ -154,11 +161,7 @@ ОбъектМетаданных = ОбъектМетаданных(ТекущийОбъект); Если МультиязычныеСтрокиВРеквизитах(ОбъектМетаданных) Тогда - Если ТекущийЯзык().КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка() Тогда - - Если ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) Или Не ТекущийОбъект.ЭтоНовый() Тогда - Возврат; - КонецЕсли; + Если Не ОбщегоНазначения.ЭтоРегистр(ОбъектМетаданных) И ТекущийОбъект.ЭтоНовый() Тогда ИменаЛокализуемыхРеквизитов = НаименованияЛокализуемыхРеквизитовОбъекта(ОбъектМетаданных); @@ -179,6 +182,9 @@ КонецЦикла; + КонецЕсли; + + Если ТекущийЯзык().КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка() Тогда Возврат; КонецЕсли; @@ -210,14 +216,15 @@ Реквизиты.Добавить(Реквизит.Имя); КонецЦикла; + Представления = ТекущийОбъект.Представления; // ТабличнаяЧасть Отбор = Новый Структура(); Отбор.Вставить("КодЯзыка", ТекущийЯзык().КодЯзыка); - НайденныеСтроки = ТекущийОбъект.Представления.НайтиСтроки(Отбор); + НайденныеСтроки = Представления.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() > 0 Тогда Представление = НайденныеСтроки[0]; Иначе - Представление = ТекущийОбъект.Представления.Добавить(); + Представление = Представления.Добавить(); Представление.КодЯзыка = ТекущийЯзык().КодЯзыка; КонецЕсли; @@ -226,15 +233,15 @@ КонецЦикла; Отбор.КодЯзыка = Метаданные.ОсновнойЯзык.КодЯзыка; - НайденныеСтроки = ТекущийОбъект.Представления.НайтиСтроки(Отбор); + НайденныеСтроки = Представления.НайтиСтроки(Отбор); Если НайденныеСтроки.Количество() > 0 Тогда Для каждого ИмяРеквизита Из Реквизиты Цикл ТекущийОбъект[ИмяРеквизита] = НайденныеСтроки[0][ИмяРеквизита]; КонецЦикла; - ТекущийОбъект.Представления.Удалить(НайденныеСтроки[0]); + Представления.Удалить(НайденныеСтроки[0]); КонецЕсли; - ТекущийОбъект.Представления.Свернуть("КодЯзыка", СтрСоединить(Реквизиты, ",")); + Представления.Свернуть("КодЯзыка", СтрСоединить(Реквизиты, ",")); КонецПроцедуры @@ -393,19 +400,50 @@ #Область СлужебныйПрограммныйИнтерфейс -Функция СведенияОбЯзыках() Экспорт - Возврат МультиязычностьПовтИсп.СведенияОбЯзыках(); +Функция ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Экспорт + + Если (ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()) + Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда + Возврат Ложь; + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + + Если ЗначениеЗаполнено(Константы.ОсновнойЯзык.Получить()) Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбновлениеИнформационнойБазыСлужебный.РежимОбновленияДанных() = "НачальноеЗаполнение" + И Метаданные.Языки.Количество() > 1 Тогда + Возврат Истина; + КонецЕсли; + + Константы.ОсновнойЯзык.Установить(Метаданные.ОсновнойЯзык.КодЯзыка); + + Возврат Ложь; + КонецФункции -Функция ЯзыкиКонфигурации() Экспорт +Функция КодОсновногоЯзыка() Экспорт - Языки = Новый Массив; - Для каждого Язык Из Метаданные.Языки Цикл - Языки.Добавить(Язык.КодЯзыка); - КонецЦикла; + УстановитьПривилегированныйРежим(Истина); + Возврат ПараметрыСеанса.ОсновнойЯзык; - Возврат Языки; +КонецФункции + +Функция ПредставлениеЯзыка(КодЯзыка) Экспорт + Представление = ПредставлениеКодаЛокализации(КодЯзыка); + ЧастиСтроки = СтрРазделить(Представление, " ", Истина); + ЧастиСтроки[0] = ТРег(ЧастиСтроки[0]); + Представление = СтрСоединить(ЧастиСтроки, " "); + + Возврат Представление; + +КонецФункции + +Функция СведенияОбЯзыках() Экспорт + Возврат МультиязычностьПовтИсп.СведенияОбЯзыках(); КонецФункции Функция ИмяРеквизитаБезСуффиксаЯзык(Знач ИмяРеквизита) Экспорт @@ -601,23 +639,6 @@ КонецФункции -// Возвращает метаданные по коду языка конфигурации. -// -// Параметры: -// КодЯзыка - Строка - код языка, например "en" (как задано в свойстве КодЯзыка метаданных ОбъектМетаданных: Язык). -// -// Возвращаемое значение: -// ОбъектМетаданныхЯзык - если найден по переданному коду языка, иначе Неопределено. -// -Функция ЯзыкПоКоду(Знач КодЯзыка) Экспорт - Для каждого Язык Из Метаданные.Языки Цикл - Если Язык.КодЯзыка = КодЯзыка Тогда - Возврат Язык; - КонецЕсли; - КонецЦикла; - Возврат Неопределено; -КонецФункции - Функция ИспользуетсяПервыйДополнительныйЯзык() Экспорт Возврат Константы.ИспользоватьДополнительныйЯзык1.Получить() = Истина; @@ -916,33 +937,206 @@ КонецПроцедуры -#Область УстаревшиеПроцедурыИФункции - -Процедура ЗарегистрироватьПредопределенныеЭлементыДляОбновления(Параметры, ОбъектМетаданных = Неопределено) Экспорт +Процедура ПриПолученииПараметровЗаполненияПредопределенныхДанных(ПараметрыЗаполнения) Экспорт - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("РежимОбновления", "МультиязычныеСтроки"); - ДополнительныеПараметры.Вставить("ПропускатьПустые", Истина); - ДополнительныеПараметры.Вставить("СравниватьТабличныеЧасти",Ложь); - - ОбновлениеИнформационнойБазы.ЗарегистрироватьПредопределенныеЭлементыДляОбновления(Параметры, ОбъектМетаданных, ДополнительныеПараметры); + ПараметрыЗаполнения.Вставить("Языки", СтандартныеПодсистемыСервер.ЯзыкиКонфигурации()); + ПараметрыЗаполнения.Вставить("СведенияОбЯзыках", СведенияОбЯзыках()); КонецПроцедуры -Процедура ЗаполнитьЭлементыНачальнымиДанными(ОбновитьМультиязычныеСтроки = Ложь) Экспорт +Процедура ПриПолученииПараметровЗаполненияОбъекта(ОбъектМетаданных, ПараметрыЗаполнения) Экспорт - ОбновлениеИнформационнойБазыСлужебный.НачальноеЗаполнениеПредопределенныхДанных(ОбновитьМультиязычныеСтроки); + ПараметрыЗаполнения.Вставить("МультиязычныеСтрокиВРеквизитах", МультиязычныеСтрокиВРеквизитах(ОбъектМетаданных)); + ПараметрыЗаполнения.Вставить("ЛокализуемыеРеквизитыОбъекта", МультиязычныеРеквизитыОбъекта(ОбъектМетаданных)); КонецПроцедуры -#КонецОбласти +Процедура НачальноеЗаполнениеПредопределенныхДанныхЛокализуемыеРеквизиты(ЗаполняемыйЭлемент, ПоддерживаетсяИерархия, СтрокаТаблицы, ПараметрыЗаполнения) Экспорт + + Языки = ПараметрыЗаполнения.Языки; + СведенияОбЯзыках = ПараметрыЗаполнения.СведенияОбЯзыках; + ЛокализуемыеРеквизитыОбъекта = ПараметрыЗаполнения.ЛокализуемыеРеквизитыОбъекта; + МультиязычныеСтрокиВРеквизитах = ПараметрыЗаполнения.МультиязычныеСтрокиВРеквизитах; + + Если ЛокализуемыеРеквизитыОбъекта.Количество() > 0 Тогда + Если МультиязычныеСтрокиВРеквизитах Тогда + + Если ЗначениеЗаполнено(СведенияОбЯзыках.ОсновнойЯзык) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.ОсновнойЯзык]; + КонецЦикла; + КонецЕсли; + + Если ЗначениеЗаполнено(СведенияОбЯзыках.Язык1) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык1"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.Язык1]; + КонецЦикла; + КонецЕсли; + + Если ЗначениеЗаполнено(СведенияОбЯзыках.Язык2) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык2"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.Язык2]; + КонецЦикла; + КонецЕсли; + + ИначеЕсли НЕ (ПоддерживаетсяИерархия И ЗаполняемыйЭлемент.ЭтоГруппа) Тогда + + Для каждого КодЯзыка Из Языки Цикл + ПредставленияОбъекта = ЗаполняемыйЭлемент.Представления; // ТаблицаЗначений + НовоеПредставление = ПредставленияОбъекта.Добавить(); + НовоеПредставление.КодЯзыка = КодЯзыка; + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + Значение = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; + НовоеПредставление[ИмяЛокализуемогоРеквизита.Ключ] = ?(ЗначениеЗаполнено(Значение), Значение, СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ]); + КонецЦикла; + КонецЦикла; + + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьЭлементыМультиязычнымиНачальнымиДанными(Знач ЗаполняемыйЭлемент, Знач ЛокализуемыеРеквизитыОбъекта, Знач МультиязычныеСтрокиВРеквизитах, Знач ПоддерживаетсяИерархия, Знач СтрокаТаблицы) Экспорт + + Если ЛокализуемыеРеквизитыОбъекта.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Языки = СтандартныеПодсистемыСервер.ЯзыкиКонфигурации(); + СведенияОбЯзыках = СведенияОбЯзыках(); + + Если МультиязычныеСтрокиВРеквизитах Тогда + + КодЯзыка =СведенияОбЯзыках.ОсновнойЯзык;; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; + КонецЦикла; + КонецЕсли; + + КодЯзыка = СведенияОбЯзыках.Язык1; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык1"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; + КонецЦикла; + КонецЕсли; + + КодЯзыка = СведенияОбЯзыках.Язык2; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык2"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; + КонецЦикла; + КонецЕсли; + + ИначеЕсли Не (ПоддерживаетсяИерархия И ЗаполняемыйЭлемент.ЭтоГруппа) Тогда + + Для каждого КодЯзыка Из Языки Цикл + ТаблицаПредставлений = ЗаполняемыйЭлемент.Представления; // ТаблицаЗначений + НовоеПредставление = ТаблицаПредставлений.Добавить(); + НовоеПредставление.КодЯзыка = КодЯзыка; + Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл + Значение = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; + НовоеПредставление[ИмяЛокализуемогоРеквизита.Ключ] = ?(ЗначениеЗаполнено(Значение), Значение, СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ]); + КонецЦикла; + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.Версия = "3.1.3.270"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("68d400bb-e5bb-49da-a567-ebf7458b29f8"); + Обработчик.ПроцедураЗаполненияДанныхОбновления = "МультиязычностьСервер.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.Комментарий = НСтр("ru = 'Заполнение пустых значений мультиязычных реквизитов значением основного языка.'"); + + ОбъектыСНачальнымЗаполнениемСтрокой = ОбновлениеИнформационнойБазыСлужебный.ОбъектыСНачальнымЗаполнениемСтрокой(); + Обработчик.ЧитаемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; + Обработчик.ИзменяемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; + Обработчик.БлокируемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; + +КонецПроцедуры + +// Добавляет или изменяет значения реквизитов в объекте. +// +// Параметры: +// Объект - СправочникОбъект +// - ДокументОбъект +// - ПланВидовХарактеристикОбъект +// - РегистрСведенийЗапись - заполняемый объект. +// Значения - Структура - где ключ это имя реквизита, а значение содержит строку помещаемую в реквизит. +// КодЯзыка - Строка - код языка реквизита. Например, "ru". +// +Процедура УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка = Неопределено) Экспорт + + Если КодЯзыка = Неопределено Тогда + КодЯзыка = КодОсновногоЯзыка(); + КонецЕсли; + + Для каждого ЗначениеРеквизита Из Значения Цикл + СтрокаБезПробелов = СтрЗаменить(ЗначениеРеквизита.Значение, " ", ""); + + Если ОбщегоНазначения.СтрокаВВидеНСтр(СтрокаБезПробелов) Тогда + + Для каждого Язык Из Метаданные.Языки Цикл + + СуффиксЯзыка = ""; + Если КодОсновногоЯзыка() <> Язык.КодЯзыка Тогда + СуффиксЯзыка = СуффиксЯзыка(Язык.КодЯзыка); + Если ПустаяСтрока(СуффиксЯзыка) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + Если СтрНайти(СтрокаБезПробелов, Язык.КодЯзыка +"=") > 0 Тогда + Объект[ЗначениеРеквизита.Ключ + СуффиксЯзыка] = НСтр(ЗначениеРеквизита.Значение, Язык.КодЯзыка); + КонецЕсли; + + КонецЦикла; + + Иначе + СуффиксЯзыка = ""; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Если КодОсновногоЯзыка() <> КодЯзыка Тогда + СуффиксЯзыка = СуффиксЯзыка(КодЯзыка); + Если ПустаяСтрока(СуффиксЯзыка) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЕсли; + Объект[ЗначениеРеквизита.Ключ + СуффиксЯзыка] = ЗначениеРеквизита.Значение; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +// +// Параметры: +// ИменаПараметровСеанса - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса +// УстановленныеПараметры - Массив из Строка - имена параметров, которые уже установлены. +// +Процедура УстановкаПараметровСеанса(Знач ИменаПараметровСеанса, УстановленныеПараметры) Экспорт + + Если ИменаПараметровСеанса = Неопределено + Или ИменаПараметровСеанса.Найти("ОсновнойЯзык") <> Неопределено Тогда + + ПараметрыСеанса.ОсновнойЯзык = КодЯзыкаИнформационнойБазы(); + УстановленныеПараметры.Добавить("ОсновнойЯзык"); + КонецЕсли; + +КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции -// Функция - Объект метаданных -// // Параметры: // Объект - СправочникОбъект // - ДокументОбъект @@ -950,9 +1144,11 @@ // * Ссылка - СправочникСсылка // - ДокументСсылка // - ПланВидовХарактеристикСсылка -// * ИсходныйКлючЗаписи -РегистрСведенийЗапись +// * ИсходныйКлючЗаписи - РегистрСведенийЗапись // // Возвращаемое значение: +// ОбъектМетаданныхСправочник +// ОбъектМетаданныхДокумент // ОбъектМетаданных // Функция ОбъектМетаданных(Объект) Экспорт @@ -986,8 +1182,13 @@ // Функция КодЯзыкаИнформационнойБазы() - Если ЗначениеЗаполнено(Константы.ОсновнойЯзык.Получить()) Тогда - Возврат Константы.ОсновнойЯзык.Получить(); + КодОсновногоЯзыка = Константы.ОсновнойЯзык.Получить(); + Если ЗначениеЗаполнено(КодОсновногоЯзыка) Тогда + Для каждого ЯзыкиКонфигурации Из Метаданные.Языки Цикл + Если СтрСравнить(ЯзыкиКонфигурации.КодЯзыка, КодОсновногоЯзыка) = 0 Тогда + Возврат КодОсновногоЯзыка; + КонецЕсли; + КонецЦикла; КонецЕсли; Возврат Метаданные.ОсновнойЯзык.КодЯзыка; @@ -1014,23 +1215,6 @@ КонецФункции -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. -// -// Параметры: -// ИменаПараметровСеанса - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса -// УстановленныеПараметры - Массив из Строка - имена параметров, которые уже установлены. -// -Процедура УстановкаПараметровСеанса(Знач ИменаПараметровСеанса, УстановленныеПараметры) Экспорт - - Если ИменаПараметровСеанса = Неопределено - Или ИменаПараметровСеанса.Найти("ОсновнойЯзык") <> Неопределено Тогда - - ПараметрыСеанса.ОсновнойЯзык = КодЯзыкаИнформационнойБазы(); - УстановленныеПараметры.Добавить("ОсновнойЯзык"); - КонецЕсли; - -КонецПроцедуры - Функция КодПервогоДополнительногоЯзыкаИнформационнойБазы() Экспорт Если Не ИспользуетсяПервыйДополнительныйЯзык() Тогда @@ -1119,13 +1303,13 @@ ДлинаСуффиксаЯзыка = ДлинаСуффиксаЯзыка(); - ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 0 + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 0 | * |ИЗ - | &ПолноеИмя КАК ДанныеИсточника"; - - Запрос = Новый Запрос; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ПолноеИмя", ОбъектМетаданных.ПолноеИмя()); + | &ИмяТаблицы КАК ДанныеИсточника"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяТаблицы", ОбъектМетаданных.ПолноеИмя()); РезультатЗапроса = Запрос.Выполнить(); @@ -1207,8 +1391,6 @@ КонецФункции -// Обновление данных - Процедура ЗаполнитьПустыеМультиязычныеРеквизитыЗначениемОсновногоЯзыка(Выборка, ОбъектМетаданных, ИтогоОбработано) ОбъектовОбработано = 0; @@ -1290,9 +1472,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Начальное заполнение элементов данными. - // Параметры: // Реквизит - ОбъектМетаданныхРеквизит // - ОписаниеСтандартногоРеквизита @@ -1301,21 +1480,4 @@ Возврат СтрЗаканчиваетсяНа(ИмяРеквизита, "Язык1") Или СтрЗаканчиваетсяНа(ИмяРеквизита, "Язык2"); КонецФункции -Функция СтрокаВВидеНСтр(ПроверяемаяСтрока) Экспорт - - ВариантыСовпадений = Новый Массив; - Для каждого Язык Из Метаданные.Языки Цикл - ВариантыСовпадений.Добавить(Язык.КодЯзыка + "="); - КонецЦикла; - - Для каждого ВариантСовпадения Из ВариантыСовпадений Цикл - Если СтрНайти(ПроверяемаяСтрока, ВариантСовпадения) > 0 Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - - Возврат Ложь; - -КонецФункции - #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl index d5ac919db..6598fc93b 100644 --- a/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователя/Module.bsl @@ -27,7 +27,7 @@ // Возвращает список напоминаний текущего пользователя. // // Параметры: -// Предмет - Ссылка +// Предмет - ЛюбаяСсылка // - Массив - предмет или предметы напоминания. // Идентификатор - Строка - уточняет предмет напоминания, например, "ДеньРождения". // diff --git a/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяПереопределяемый/Module.bsl index 51602978d..db6b0a26d 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 a0289575a..d62ce5f92 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементов/Module.bsl @@ -117,8 +117,8 @@ // // Параметры: // Ссылка - СправочникСсылка -// - ПланВидовХарактеристикСсылка - перемещаемый элемент, -// ПараметрыВыполнения - см. ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды +// - ПланВидовХарактеристикСсылка - перемещаемый элемент +// ПараметрыВыполнения - см. ПодключаемыеКомандыКлиентСервер.ПараметрыВыполненияКоманды // Процедура Подключаемый_ПереместитьЭлемент(Ссылка, ПараметрыВыполнения) Экспорт Направление = ПараметрыВыполнения.ОписаниеКоманды.Идентификатор; @@ -142,10 +142,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl index 132c698d1..70d7eec26 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl @@ -12,8 +12,8 @@ // // Параметры: // Информация - Структура - информация о метаданных объекта; -// Родитель - Ссылка - ссылка на родителя объекта; -// Владелец - Ссылка - ссылка на владельца объекта. +// Родитель - ЛюбаяСсылка - ссылка на родителя объекта; +// Владелец - ЛюбаяСсылка - ссылка на владельца объекта. // // Возвращаемое значение: // Число - значение реквизита доп. упорядочивания. @@ -205,7 +205,7 @@ ПроверитьУпорядочиваниеЭлементов(ТекущийЭлементСсылка.Метаданные()); - НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); + НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных(); // НастройкиКомпоновкиДанных ТекстОшибки = ПроверитьСортировкуВСписке(НастройкиКомпоновкиДанных); Если Не ПустаяСтрока(ТекстОшибки) Тогда Возврат ТекстОшибки; @@ -332,7 +332,7 @@ Функция ПроверитьСортировкуВСписке(НастройкиКомпоновкиДанных) - ЭлементыПорядка = НастройкиКомпоновкиДанных.Порядок.Элементы; + ЭлементыПорядка = НастройкиКомпоновкиДанных.Порядок.Элементы; // КоллекцияЭлементовПорядкаКомпоновкиДанных ДополнительныеПоляПорядка = Новый Массив; ДополнительныеПоляПорядка.Добавить(Новый ПолеКомпоновкиДанных("ДополнительноеПолеПорядка1")); diff --git a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl index 4c827863b..6c8e02505 100644 --- a/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/НастройкаРазрешенийНаИспользованиеВнешнихРесурсовВызовСервера/Module.bsl @@ -13,7 +13,8 @@ // в кластере серверов были внесены, но не была завершена операция, в рамках которой требовалось // изменить настройки разрешений на использование внешних ресурсов. // -// Возвращаемое значение - Структура: +// Возвращаемое значение: +// Структура: // РезультатПроверки - Булево - если Ложь - то операция не была завершена и требуется предложить // пользователю выполнить отмену изменений в настройках профилей // безопасности в кластере серверов, @@ -37,7 +38,7 @@ // Удаляет запросы на использование внешних ресурсов, если пользователь отказался от их применения. // // Параметры: -// ИдентификаторыЗапросов - Массив Из УникальныйИдентификатор - массив идентификаторов запросов на +// ИдентификаторыЗапросов - Массив из УникальныйИдентификатор - массив идентификаторов запросов на // использование внешних ресурсов. // Процедура ОтменаПримененияЗапросовНаИспользованиеВнешнихРесурсов(Знач ИдентификаторыЗапросов) Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl index aa4ba94fa..a214567ca 100644 --- a/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиXDTOСервер/Module.bsl @@ -9,6 +9,7 @@ #Область ПрограммныйИнтерфейс #Область ИнициализацияОбмена + // Добавляет строку в таблицу правил конвертации и инициализирует значение в колонке "Свойства". // Используется в модуле менеджера обмена при заполнении таблицы правил конвертации объектов. // @@ -1490,7 +1491,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ИмяФайлаОбмена - строка - имя файла обмена. +// ИмяФайлаОбмена - Строка - имя файла обмена. // Процедура ОткрытьФайлВыгрузки(КомпонентыОбмена, ИмяФайлаОбмена = "") Экспорт @@ -2049,7 +2050,7 @@ // // Параметры: // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. -// ИмяФайлаОбмена - строка - имя файла обмена. +// ИмяФайлаОбмена - Строка - имя файла обмена. // Процедура ОткрытьФайлЗагрузки(КомпонентыОбмена, ИмяФайлаОбмена) Экспорт @@ -2318,9 +2319,15 @@ КонецЦикла; - Если Приемник.Свойство("КлючевыеСвойства") - И Приемник.КлючевыеСвойства.Свойство("Ссылка") Тогда - Приемник.Вставить("Ссылка", Приемник.КлючевыеСвойства.Ссылка); + КлючевыеСвойстваКопия = Неопределено; + СсылкаКопия = Неопределено; + Если Приемник.Свойство("КлючевыеСвойства", КлючевыеСвойстваКопия) + И ТипЗнч(КлючевыеСвойстваКопия) = Тип("Структура") + И КлючевыеСвойстваКопия.Свойство("Ссылка", СсылкаКопия) + Тогда + + Приемник.Вставить("Ссылка", СсылкаКопия); + КонецЕсли; Возврат Приемник; @@ -2374,7 +2381,7 @@ // Тип - Строка - тип объекта строкой. // ЗаписатьОбъект - Булево - переменная принимает значение Ложь если запись объекта не была выполнена. // ОтправкаНазад - Булево - служебный флаг для установки соответствующего параметра обмена данными объекта. -// УникальныйИдентификаторСтрокой - строка - уникальный идентификатор объекта в виде строки. +// УникальныйИдентификаторСтрокой - Строка - уникальный идентификатор объекта в виде строки. // Процедура ЗаписатьОбъектВИБ(КомпонентыОбмена, Объект, Тип, ЗаписатьОбъект = Ложь, Знач ОтправкаНазад = Ложь, УникальныйИдентификаторСтрокой = "") Экспорт @@ -2767,6 +2774,7 @@ #Область СлужебныйПрограммныйИнтерфейс #Область ИнициализацияОбмена + // Создает таблицу значений для хранения заголовка пакета с данными. // // Возвращаемое значение: @@ -2812,7 +2820,7 @@ Функция ПравилаРегистрацииОбъектов(УзелПланаОбмена) Экспорт ПравилаРегистрацииОбъектов = ОбменДаннымиСобытия.ПравилаРегистрацииОбъектовПланаОбмена( - ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); + ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(УзелПланаОбмена)); ТаблицаПравилаРегистрацииОбъектов = ПравилаРегистрацииОбъектов.Скопировать(, "ОбъектМетаданныхИмя, ИмяРеквизитаФлага"); ТаблицаПравилаРегистрацииОбъектов.Индексы.Добавить("ОбъектМетаданныхИмя"); @@ -3127,25 +3135,27 @@ // Функция МассивУзловДляРегистрацииВыгружатьПриНеобходимости(Ссылка, ИмяПланаОбмена, ИмяРеквизитаФлага) Экспорт - ТекстЗапроса = " - |ВЫБРАТЬ РАЗЛИЧНЫЕ + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяПланаОбмена); + + ШаблонТекстаПоле = "ШапкаПланаОбмена.%1"; + ИмяРеквизитаФлагаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаПоле, ИмяРеквизитаФлага); + + ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ШапкаПланаОбмена.Ссылка КАК Узел |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ШапкаПланаОбмена - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах - |ПО - | ШапкаПланаОбмена.Ссылка = ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы - | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект + | &ИмяПланаОбмена КАК ШапкаПланаОбмена + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах + | ПО ШапкаПланаОбмена.Ссылка = ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы + | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект |ГДЕ - | НЕ ШапкаПланаОбмена.ЭтотУзел - | И ШапкаПланаОбмена.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости) + | НЕ ШапкаПланаОбмена.ЭтотУзел + | И &ИмяРеквизитаФлага = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости) | И НЕ ШапкаПланаОбмена.ПометкаУдаления - | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект - |"; + | И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаФлага]", ИмяРеквизитаФлага); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); //@Query-part-1 + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаФлага", ИмяРеквизитаФлагаСтрокой); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -3237,14 +3247,6 @@ КонецПроцедуры -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - -#Область ИнициализацияОбмена - // Возвращаемое значение: // ТаблицаЗначений - таблица правил обработки (ПОД): // * Имя - Строка @@ -3257,7 +3259,7 @@ // * ПриОбработке - Строка // * ИспользуемыеПКО - Массив из Строка // -Функция ТаблицаПравилОбработкиДанных(КомпонентыОбмена) +Функция ТаблицаПравилОбработкиДанных(КомпонентыОбмена) Экспорт XMLСхема = КомпонентыОбмена.XMLСхема; ВерсияФорматаМенеджераОбмена = КомпонентыОбмена.ВерсияФорматаМенеджераОбмена; @@ -3320,6 +3322,14 @@ Возврат ПравилаОбработкиДанных; КонецФункции +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +#Область ИнициализацияОбмена + // Параметры: // * ВерсияФорматаМенеджераОбмена - Строка // @@ -3482,7 +3492,7 @@ Если КомпонентыОбмена.НаправлениеОбмена = "Получение" Тогда - МетаданныеОбъекта = ПравилоКонвертации.ОбъектДанных; + МетаданныеОбъекта = ПравилоКонвертации.ОбъектДанных; // ОбъектМетаданныхСправочник, и др. ПравилоКонвертации.ИмяТаблицыПолученныхДанных = МетаданныеОбъекта.ПолноеИмя(); ПравилоКонвертации.ПредставлениеТипаПолученныхДанных = МетаданныеОбъекта.Представление(); @@ -3783,7 +3793,7 @@ Если ЭтоТаблицаОбъекта(Свойство) Тогда ИмяСвойстваСтроки = Свойство.Тип.Свойства[0].Имя; Для ИндексСтроки = 0 По Значение[ИмяСвойстваСтроки].Количество() - 1 Цикл - СтрокаXDTO = ОбъектXDTO[Свойство.Имя][ИмяСвойстваСтроки].Получить(ИндексСтроки); + СтрокаXDTO = ОбъектXDTO[Свойство.Имя][ИмяСвойстваСтроки].Получить(ИндексСтроки); // ОбъектXDTO РасширениеСтрокиXDTO = Значение[ИмяСвойстваСтроки].Получить(ИндексСтроки); Для Каждого СвойствоСтроки Из РасширениеСтрокиXDTO.Свойства() Цикл @@ -4016,7 +4026,7 @@ КонецПроцедуры // Параметры: -// КомпонентыОбмена - структура - содержит все ключевые данные для обмена (ПКО, ПКПД, ПОД и т.д.). +// КомпонентыОбмена - Структура - содержит все ключевые данные для обмена (ПКО, ПКПД, ПОД и т.д.). // Ссылка - удаленный объект. // ПравилоКонвертации - строка таблицы правил конвертации объектов, в соответствии с которой выполняется преобразование. // @@ -5288,9 +5298,9 @@ "ВЫБРАТЬ | Таблица.Ссылка КАК Ссылка |ИЗ - | [ПолноеИмя] КАК Таблица + | &ПолноеИмя КАК Таблица |ГДЕ - | [УсловиеОтбора]"; + | &УсловиеОтбора"; Отбор = Новый Массив; @@ -5324,8 +5334,8 @@ Запрос.УстановитьПараметр("УзелОбмена", УзелОбмена); КонецЕсли; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеОтбора]", УсловиеОтбора); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмя]", ПравилоКонвертации.ПолноеИмя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбора", УсловиеОтбора); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмя", ПравилоКонвертации.ПолноеИмя); Запрос.Текст = ТекстЗапроса; РезультатЗапроса = Запрос.Выполнить(); @@ -6762,7 +6772,8 @@ // КомпонентыОбмена - Структура - содержит все правила и параметры обмена. // ПравилоОбработки - СтрокаТаблицыЗначений - строка правил обработки данных, соответствующая обрабатываемому ПОД. // -// Возвращаемое значение - то что вернет обработчик ВыборкаДанных (например, выборка результата запроса). +// Возвращаемое значение: +// Произвольный - то, что вернет обработчик ВыборкаДанных, например, выборка результата запроса. // Функция ВыборкаДанных(КомпонентыОбмена, ПравилоОбработки) @@ -6789,14 +6800,18 @@ КонецПопытки; Иначе - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Ссылка - |ИЗ - | " + ПравилоОбработки.ИмяТаблицыДляВыборки; + ТекстЗапроса = + "ВЫБРАТЬ + | ПсевдонимТаблицыМетаданных.Ссылка + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", ПравилоОбработки.ИмяТаблицыДляВыборки); + + Запрос = Новый Запрос(ТекстЗапроса); ВыборкаДанных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + КонецЕсли; Возврат ВыборкаДанных; @@ -6969,7 +6984,7 @@ // СтрокаОшибки - Строка - содержит строку модуля где возникла ошибка. // // Возвращаемое значение: -// структура - объект типа структура +// Структура - объект типа структура // Функция ЗаписьПротоколаОбмена(КСообщенияОбОшибках = "", Знач СтрокаОшибки = "") @@ -7020,7 +7035,7 @@ // Функция формирует представление объекта, для записи в протокол обмена. // // Параметры: -// Объект - Ссылка - ссылка на любой ОМД; +// Объект - ЛюбаяСсылка - ссылка на любой ОМД; // - Объект - ОМД; // - ОбъектXDTO - объект XDTO; // - Структура. @@ -7494,7 +7509,7 @@ // Может быть использован как значение параметра встроенной функции Тип(). // // Параметры: -// ОбъектМетаданных - объект метаданных, по которому необходимо определить имя типа; +// ОбъектМетаданных - ОбъектМетаданных - по которому необходимо определить имя типа; // // Возвращаемое значение: // Строка - например, "СправочникСсылка.Номенклатура". @@ -7556,35 +7571,48 @@ КонецПроцедуры Процедура ДобавитьВыгруженныеОбъектыВРегистрПубличныеИдентификаторы(КомпонентыОбмена) + УзелДляОбмена = КомпонентыОбмена.УзелКорреспондента; СоставПланаОбмена = УзелДляОбмена.Метаданные().Состав; - ТекстЗапроса = "ВЫБРАТЬ + + ШаблонТекстаЗапроса = + "ВЫБРАТЬ | ТаблицаИзменений.Ссылка |ИЗ - | #ПолноеИмя#.Изменения КАК ТаблицаИзменений + | &ИмяТаблицыМетаданных КАК ТаблицаИзменений |ЛЕВОЕ СОЕДИНЕНИЕ | РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК ПубличныеИдентификаторы |ПО ПубличныеИдентификаторы.УзелИнформационнойБазы = &Узел И ПубличныеИдентификаторы.Ссылка = ТаблицаИзменений.Ссылка |ГДЕ ТаблицаИзменений.Узел = &Узел И ТаблицаИзменений.НомерСообщения <= &НомерСообщения | И ПубличныеИдентификаторы.Идентификатор ЕСТЬ NULL"; + Для Каждого ЭлементСостава Из СоставПланаОбмена Цикл + Если НЕ ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ЭлементСостава.Метаданные) Тогда + Продолжить; + КонецЕсли; - ПолноеИмяОбъекта = ЭлементСостава.Метаданные.ПолноеИмя(); - Запрос = Новый Запрос; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "#ПолноеИмя#", ПолноеИмяОбъекта); + + ИмяТаблицыМетаданных = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.Изменения", ЭлементСостава.Метаданные.ПолноеИмя()); + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", ИмяТаблицыМетаданных); + + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Узел", УзелДляОбмена); Запрос.УстановитьПараметр("НомерСообщения", КомпонентыОбмена.НомерСообщенияПолученногоКорреспондентом); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл + СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("Ссылка", Выборка.Ссылка); СтруктураЗаписи.Вставить("УзелИнформационнойБазы", КомпонентыОбмена.УзелКорреспондента); СтруктураЗаписи.Вставить("Идентификатор", Выборка.Ссылка.УникальныйИдентификатор()); РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ДобавитьЗапись(СтруктураЗаписи, Истина); + КонецЦикла; + КонецЦикла; + КонецПроцедуры Функция XMLБазоваяСхема() diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl index c2a7ac9b1..4b5fbc940 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl @@ -72,9 +72,9 @@ // Заполняет соответствие имен методов их псевдонимам для вызова из очереди заданий. // // Параметры: -// СоответствиеИменПсевдонимам - Соответствие - имена методов и соответствующие им псевдонимы: +// СоответствиеИменПсевдонимам - Соответствие из КлючИЗначение - имена методов и соответствующие им псевдонимы: // Ключ - псевдоним метода, например ОчиститьОбластьДанных -// Значение - Имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных +// Значение - имя метода для вызова, например РаботаВМоделиСервиса.ОчиститьОбластьДанных // В качестве значения можно указать Неопределено, в этом случае считается что имя // совпадает с псевдонимом. // @@ -189,6 +189,8 @@ Типы.Добавить(Метаданные.Константы.НастройкиПодчиненногоУзлаРИБ); Типы.Добавить(Метаданные.Константы.ПрефиксПоследнегоАвтономногоРабочегоМеста); + Типы.Добавить(Метаданные.Справочники.СценарииОбменовДанными); + Типы.Добавить(Метаданные.РегистрыСведений.ДанныеОбъектовДляРегистрацииВОбменах); Типы.Добавить(Метаданные.РегистрыСведений.ИзмененияОбщихДанныхУзлов); Типы.Добавить(Метаданные.РегистрыСведений.НастройкиОбменаДаннымиXDTO); @@ -307,8 +309,8 @@ // Если файл найден, то возвращается его имя, при этом удаляется информация об этом файле из хранилища. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. -// ИмяФайла - Строка - имя файла, из хранилища. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. +// ИмяФайла - Строка - имя файла, из хранилища. // Процедура ПриПолученииФайлаИзХранилища(Знач ИдентификаторФайла, ИмяФайла) Экспорт @@ -502,11 +504,7 @@ // Обработчики обновления ИБ -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если Не ОбщегоНазначения.РазделениеВключено() Тогда @@ -937,6 +935,18 @@ КонецПроцедуры +Процедура АдаптироватьТекстЗапросаОРезультатахОбменаВСервисе(ТекстЗапроса) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РегистрСведений.СостоянияОбменовДанными", + "РегистрСведений.СостоянияОбменовДаннымиОбластейДанных"); + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1339,7 +1349,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Descriptor. -// Загружать - булево - возвращаемое. +// Загружать - Булево - возвращаемое. // Процедура ДоступныНовыеДанные(Знач Дескриптор, Загружать) Экспорт @@ -1376,7 +1386,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Дескриптор. -// ПутьКФайлу - Строка или Неопределено - полное имя извлеченного файла. Файл будет автоматически удален +// ПутьКФайлу - Строка, Неопределено - полное имя извлеченного файла. Файл будет автоматически удален // после завершения процедуры. Если в менеджере сервиса не был // указан файл - значение аргумента равно Неопределено. // @@ -1443,6 +1453,9 @@ КонецПроцедуры +// Возвращаемое значение: +// ПланОбменаСсылка +// Функция МенеджерПланаОбменаКонечныхТочек() Экспорт МетаданныеОбменСообщениями = Метаданные.НайтиПоТипу(Метаданные.ОпределяемыеТипы.КонечнаяТочкаОбменаСообщениями.Тип.Типы()[0]).ПолноеИмя(); @@ -1504,7 +1517,7 @@ // Отправляет сообщение // // Параметры: -// Сообщение - ОбъектXDTO - сообщение. +// Сообщение - ОбъектXDTO - сообщение. // Функция ОтправитьСообщение(Знач Сообщение) Экспорт @@ -2104,6 +2117,7 @@ КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции монитора обмена данными @@ -2172,7 +2186,7 @@ | ПланыОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, | ПланыОбмена.ОбластьДанныхОсновныеДанные КАК ОбластьДанных, | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | ЕСТЬNULL(СостоянияОбменовДаннымиВыгрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейВыгрузкиДанных, | ЕСТЬNULL(СостоянияОбменовДаннымиЗагрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейЗагрузкиДанных, @@ -2191,7 +2205,7 @@ | ЛЕВОЕ СОЕДИНЕНИЕ СостоянияУспешныхОбменовДаннымиВыгрузка КАК СостоянияУспешныхОбменовДаннымиВыгрузка | ПО ПланыОбмена.УзелИнформационнойБазы = СостоянияУспешныхОбменовДаннымиВыгрузка.УзелИнформационнойБазы | - |[Отбор] + |ГДЕ &Отбор | |УПОРЯДОЧИТЬ ПО | ПланыОбмена.ИмяПланаОбмена, @@ -2203,7 +2217,7 @@ ПодготовитьДанныеУзловПлановОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбменаМетода, ДополнительныеСвойстваПланаОбмена); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ДополнительныеСвойстваПланаОбмена]", + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительныеСвойстваПланаОбмена,", ПолучитьДополнительныеСвойстваПланаОбменаСтрокой(ДополнительныеСвойстваПланаОбмена)); Если ТолькоНеуспешные Тогда @@ -2215,7 +2229,7 @@ Отбор = ""; КонецЕсли; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Отбор]", Отбор); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ГДЕ &Отбор", Отбор); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -2272,17 +2286,19 @@ | |ОБЪЕДИНИТЬ ВСЕ | - |//////////////////////////////////////////////////////// {[ИмяПланаОбмена]} + |//////////////////////////////////////////////////////// {ИмяПланаОбменаСиноним}" + + + " |ВЫБРАТЬ | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | Ссылка КАК УзелИнформационнойБазы, | ОбластьДанныхОсновныеДанные КАК ОбластьДанныхОсновныеДанные, | Наименование КАК Наименование, - | ""[ИмяПланаОбменаСиноним]"" КАК ИмяПланаОбмена + | ""ИмяПланаОбменаСиноним"" КАК ИмяПланаОбмена |ИЗ - | ПланОбмена.[ИмяПланаОбмена] + | &ИмяПланаОбмена |ГДЕ | РегистрироватьИзменения | И НЕ ПометкаУдаления @@ -2292,11 +2308,15 @@ Если ПланыОбменаМетода.Количество() > 0 Тогда + ШаблонТекста = "ПланОбмена.%1"; + Для Каждого ИмяПланаОбмена Из ПланыОбменаМетода Цикл - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ШаблонЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "[ИмяПланаОбменаСиноним]", Метаданные.ПланыОбмена[ИмяПланаОбмена].Синоним); - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой); + ИмяПланаОбменаСтрокой = СтрШаблон(ШаблонТекста, ИмяПланаОбмена); + + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ШаблонЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "ИмяПланаОбменаСиноним", Метаданные.ПланыОбмена[ИмяПланаОбмена].Синоним); + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "&ДополнительныеСвойстваПланаОбмена,", ДополнительныеСвойстваПланаОбменаСтрокой); // удаляем литерал объединения для первой таблицы Если ПустаяСтрока(ТекстЗапроса) Тогда @@ -2332,7 +2352,7 @@ ТекстЗапроса = " |ВЫБРАТЬ | - | [ДополнительныеСвойстваБезИсточникаДанныхСтрокой] + | &ДополнительныеСвойстваБезИсточникаДанныхСтрокой, | | Неопределено КАК УзелИнформационнойБазы, | 0 КАК ОбластьДанныхОсновныеДанные, @@ -2340,7 +2360,7 @@ | Неопределено КАК ИмяПланаОбмена |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ДополнительныеСвойстваБезИсточникаДанныхСтрокой]", ДополнительныеСвойстваБезИсточникаДанныхСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительныеСвойстваБезИсточникаДанныхСтрокой,", ДополнительныеСвойстваБезИсточникаДанныхСтрокой); КонецЕсли; @@ -2348,7 +2368,7 @@ |//////////////////////////////////////////////////////// {ПланыОбменаКонфигурации} |ВЫБРАТЬ | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | УзелИнформационнойБазы, | ОбластьДанныхОсновныеДанные, @@ -2356,14 +2376,14 @@ | ИмяПланаОбмена |ПОМЕСТИТЬ ПланыОбменаКонфигурации |ИЗ - | ( - | [ТекстЗапроса] - | ) КАК ВложенныйЗапрос + | &ТекстЗапроса + | КАК ВложенныйЗапрос |; |"; - ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ТекстЗапроса]", ТекстЗапроса); - ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой); + ТекстВставкиЗапроса = СтрШаблон("(%1)", ТекстЗапроса); + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "&ТекстЗапроса", ТекстВставкиЗапроса); + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "&ДополнительныеСвойстваПланаОбмена,", ДополнительныеСвойстваПланаОбменаСтрокой); Запрос.Текст = ТекстЗапросаРезультат; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; @@ -2448,7 +2468,7 @@ // пользователей. // // Возвращаемое значение: -// Структура - параметры. +// Структура - параметры. // Функция ПараметрыАвтономнойРаботыПриЗавершенииРаботы() diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl index 0b93f9018..fe3721e76 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl @@ -16,7 +16,7 @@ // Используется в помощнике создания автономного рабочего места. // // Параметры: -// Версия - Строка - версия требуемого приложения 1С:Предприятия в формате +// Версия - Строка - версия требуемого приложения 1С:Предприятия в формате // "<основная версия>.<младшая версия>.<релиз>.<дополнительный номер релиза>". // Например, "8.3.3.715". // diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl index 8b6131e36..5e482b5cd 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Устанавливает значение константы ДатаОбновленияПовторноИспользуемыхЗначенийМРО. @@ -207,7 +202,7 @@ // УзелИнформационнойБазы - ПланОбменаСсылка - ссылка на анализируемый узел плана обмена. // // Возвращаемое значение: -// Массив - , содержащий полные имена объектов метаданных. +// Массив - содержащий полные имена объектов метаданных. // Функция ИменаМетаданныхНеВыгружаемыхОбъектовУзла(Знач УзелИнформационнойБазы) Экспорт Результат = Новый Массив; diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl index 16e44418d..ac8cedcb7 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Обмен данными" -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Процедура-обработчик закрытия формы настройки узлов плана обмена. @@ -113,12 +108,12 @@ // внешнее соединение. // // Параметры: -// ИмяРеквизита - Строка - имя реквизита формы. -// ИмяТаблицы - Строка - полное имя объекта метаданных. -// Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента. -// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. -// ПараметрыВнешнегоСоединения - Структура -// ПараметрыВыбора - Структура - структура параметров выбора. +// ИмяРеквизита - Строка - имя реквизита формы. +// ИмяТаблицы - Строка - полное имя объекта метаданных. +// Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента. +// СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. +// ПараметрыВнешнегоСоединения - Структура +// ПараметрыВыбора - Структура - структура параметров выбора. // Процедура ОбработчикВыбораЭлементовБазыКорреспондентаНачалоВыбора(Знач ИмяРеквизита, Знач ИмяТаблицы, Знач Владелец, Знач СтандартнаяОбработка, Знач ПараметрыВнешнегоСоединения, Знач ПараметрыВыбора=Неопределено) Экспорт @@ -163,11 +158,11 @@ // соединение. // // Параметры: -// ИмяРеквизита - Строка - имя реквизита формы. -// ИмяТаблицы - Строка - полное имя объекта метаданных. -// Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента. -// ПараметрыВнешнегоСоединения - Структура -// ПараметрыВыбора - Структура - структура параметров выбора. +// ИмяРеквизита - Строка - имя реквизита формы. +// ИмяТаблицы - Строка - полное имя объекта метаданных. +// Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента. +// ПараметрыВнешнегоСоединения - Структура +// ПараметрыВыбора - Структура - структура параметров выбора. // Процедура ОбработчикВыбораЭлементовБазыКорреспондентаПодбор(Знач ИмяРеквизита, Знач ИмяТаблицы, Знач Владелец, Знач ПараметрыВнешнегоСоединения, Знач ПараметрыВыбора=Неопределено) Экспорт @@ -203,10 +198,10 @@ // внешнее соединение. // // Параметры: -// Элемент - ФормаКлиентскогоПриложения -// - ТаблицаФормы - элемент для обработки выбора. -// ВыбранноеЗначение - Произвольный - см. описание параметра ВыбранноеЗначение события ОбработкаВыбора. -// ДанныеФормыКоллекция - ДанныеФормыКоллекция - для режима подбора из списка. +// Элемент - ФормаКлиентскогоПриложения +// - ТаблицаФормы - элемент для обработки выбора. +// ВыбранноеЗначение - Произвольный - см. описание параметра ВыбранноеЗначение события ОбработкаВыбора. +// ДанныеФормыКоллекция - ДанныеФормыКоллекция - для режима подбора из списка. // Процедура ОбработчикВыбораЭлементовБазыКорреспондентаОбработкаВыбора(Знач Элемент, Знач ВыбранноеЗначение, Знач ДанныеФормыКоллекция=Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl index 899364c11..d404d0d5c 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПереопределяемый/Module.bsl @@ -11,7 +11,7 @@ // Определяет префикс кодов и номеров объектов информационной базы по умолчанию. // // Параметры: -// Префикс - Строка, 2 - префикс кодов и номеров объектов информационной базы по умолчанию. +// Префикс - Строка, 2 - префикс кодов и номеров объектов информационной базы по умолчанию. // Процедура ПриОпределенииПрефиксаИнформационнойБазыПоУмолчанию(Префикс) Экспорт @@ -238,7 +238,7 @@ // Получает доступные для использования расширения универсального формата EnterpriseData. // // Параметры: -// РасширенияФормата - Соответствие: +// РасширенияФормата - Соответствие из КлючИЗначение: // * Ключ - Строка - URI пространства имен схемы расширения формата. // * Значение - Строка - номер расширяемой версии формата. // diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl index 5413d3851..ed4cdbea8 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl @@ -21,15 +21,19 @@ // Устарела. Следует использовать новую (см. ОбменДаннымиСервер.УзелПланаОбменаПоКоду). // Функция НайтиУзелПланаОбменаПоКоду(ИмяПланаОбмена, КодУзла) Экспорт + + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяПланаОбмена); + ТекстЗапроса = "ВЫБРАТЬ | ПланОбмена.Ссылка КАК Ссылка |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена + | &ИмяПланаОбмена КАК ПланОбмена |ГДЕ | ПланОбмена.Код = &Код"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Код", КодУзла); @@ -91,21 +95,26 @@ Функция ОбменДаннымиВключен(Знач ИмяПланаОбмена, Знач Отправитель = Неопределено) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда + Возврат Ложь; + КонецЕсли; - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 1 + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА |ИЗ - | ПланОбмена." + ИмяПланаОбмена + " КАК ПланОбмена + | &ИмяТаблицыМетаданных КАК ПланОбмена |ГДЕ | НЕ ПланОбмена.ПометкаУдаления | И НЕ ПланОбмена.ЭтотУзел | И ПланОбмена.Ссылка <> &Отправитель"; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("Отправитель", Отправитель); + СтрокаЗамены = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПланОбмена.%1", ИмяПланаОбмена); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаЗамены); + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Отправитель", Отправитель); Возврат Не Запрос.Выполнить().Пустой(); КонецФункции @@ -220,7 +229,9 @@ // Заполняет перечень кодов возможных ошибок. // // Возвращаемое значение: -// Соответствие - Ключ - код ошибки (число), значение - описание ошибки (строка). +// Соответствие из КлючИЗначение: +// * Ключ - Число - код ошибки +// * Значение - Строка - описание ошибки // Функция СообщенияОбОшибках() Экспорт @@ -480,7 +491,7 @@ // Определяет используется ли версионирование. // // Параметры: -// Отправитель - ПланОбменаСсылка - если параметр передается, то определяет необходимо +// Отправитель - ПланОбменаСсылка - если параметр передается, то определяет необходимо // ли использовать создание версий объектов для переданного узла. // Функция ИспользуетсяВерсионирование(Отправитель = Неопределено, ПроверятьПраваДоступа = Ложь) Экспорт @@ -617,7 +628,7 @@ // для которого требуется получить пользовательский состав плана обмена. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - полное имя объекта метаданных входящего в состав плана обмена; // * Значение - ПеречислениеСсылка.РежимыВыгрузкиОбъектовОбмена - режим выгрузки объекта. // @@ -722,8 +733,8 @@ // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. // // Возвращаемое значение: -// ТаблицаРеквизитовРегистрации - таблица значений - таблица реквизитов регистрации, -// упорядоченная по полю "Порядок", для заданного объекта метаданного. +// ТаблицаЗначений - таблица реквизитов регистрации ("ТаблицаРеквизитовРегистрации") +// упорядоченная по полю "Порядок", для заданного объекта метаданного. // Функция РеквизитыОбъектаДляРегистрации(ИмяОбъекта, ИмяПланаОбмена) Экспорт @@ -878,7 +889,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. // // Возвращаемое значение: -// СписокПравил - список значений - список макетов типовых правил обмена. +// СписокПравил - СписокЗначений - список макетов типовых правил обмена. // Функция ПравилаКонвертацииДляПланаОбменаИзКонфигурации(ИмяПланаОбмена) Экспорт @@ -893,7 +904,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. // // Возвращаемое значение: -// СписокПравил - список значений - список макетов типовых правил регистрации. +// СписокПравил - СписокЗначений - список макетов типовых правил регистрации. // Функция ПравилаРегистрацииДляПланаОбменаИзКонфигурации(ИмяПланаОбмена) Экспорт @@ -908,7 +919,7 @@ // Нет. // // Возвращаемое значение: -// СписокПлановОбмена - список значений - список планов обмена конфигурации. +// СписокПлановОбмена - СписокЗначений - список планов обмена конфигурации. // Функция СписокПлановОбменаБСП() Экспорт @@ -1151,9 +1162,9 @@ // Устанавливает внешнее соединение с информационной базой и возвращает указатель на это соединение. // // Параметры: -// УзелИнформационнойБазы (обязательный) - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить // внешнее соединение. -// СтрокаСообщенияОбОшибке (необязательный) - Строка - если в процессе установки внешнего соединения возникает ошибка, +// СтрокаСообщенияОбОшибке - Строка - если в процессе установки внешнего соединения возникает ошибка, // то подробное описание ошибки помещается в этот параметр. // // Возвращаемое значение: @@ -1171,7 +1182,7 @@ // Устанавливает внешнее соединение с информационной базой и возвращает указатель на это соединение. // // Параметры: -// УзелИнформационнойБазы (обязательный) - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить +// УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо получить // внешнее соединение. // СтрокаСообщенияОбОшибке (необязательный) - Строка - если в процессе установки внешнего соединения возникает ошибка, // то подробное описание ошибки помещается в этот параметр. @@ -1349,7 +1360,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена как оно задано в конфигураторе. // // Возвращаемое значение: -// СписокПравил - список значений - список макетов типовых правил для обмена данными. +// СписокПравил - СписокЗначений - список макетов типовых правил для обмена данными. // Функция ПравилаДляПланаОбменаИзКонфигурации(ИмяПланаОбмена, ЛитералИмениМакета) @@ -1483,7 +1494,7 @@ // Функция возвращает имя каталога временных файлов. // // Возвращаемое значение: -// Строка - путь к каталогу временных файлов. +// Строка - путь к каталогу временных файлов. // Функция КаталогВременногоХранилищаФайлов(БезопасныйРежим = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl index 86d4cf83f..665e96eed 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -63,7 +63,7 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана процедура: -// * Объект - ДанныеФормыСтруктура - основной реквизит формы: +// * Объект - ДанныеФормыСтруктура: // ** Ссылка - ПланОбменаСсылка - узел плана обмена. // Отказ - Булево - признак отказа от создания формы. Если установить в Истина, то форма создана не будет. // @@ -416,9 +416,9 @@ // Узлы - Массив из ПланОбменаСсылка - узлы обмена. // // Возвращаемое значение: -// Структура: -// * Заголовок - Строка - заголовок гиперссылки. -// * Картинка - Картинка - картинка для гиперссылки. +// Структура: +// * Заголовок - Строка - заголовок гиперссылки. +// * Картинка - Картинка - картинка для гиперссылки. // Функция СтруктураЗаголовкаГиперссылкиМонитораПроблем(Узлы = Неопределено) Экспорт @@ -675,8 +675,8 @@ // * WSИмяПользователя - Строка - имя пользователя для входа на сервер. // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. -// СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// СтрокаСообщенияОбОшибке - Строка - содержит подробное описание ошибки в случае неуспешного подключения; +// СообщениеПользователю - Строка - содержит краткое описание ошибки в случае неуспешного подключения. // // Возвращаемое значение: // WSПрокси - объект WSПрокси веб-сервиса Exchange. @@ -702,8 +702,8 @@ // * WSИмяПользователя - Строка - имя пользователя для входа на сервер. // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. -// СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. +// СтрокаСообщенияОбОшибке - Строка - содержит подробное описание ошибки в случае неуспешного подключения; +// СообщениеПользователю - Строка - содержит краткое описание ошибки в случае неуспешного подключения. // // Возвращаемое значение: // WSПрокси - объект WSПрокси веб-сервиса Exchange_2_0_1_6. @@ -729,9 +729,9 @@ // * WSИмяПользователя - Строка - имя пользователя для входа на сервер. // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. -// СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. -// Таймаут - число - таймаут. +// СтрокаСообщенияОбОшибке - Строка - содержит подробное описание ошибки в случае неуспешного подключения; +// СообщениеПользователю - Строка - содержит краткое описание ошибки в случае неуспешного подключения. +// Таймаут - Число - таймаут. // // Возвращаемое значение: // WSПрокси - объект WSПрокси веб-сервиса Exchange_2_0_1_7. @@ -757,9 +757,9 @@ // * WSИмяПользователя - Строка - имя пользователя для входа на сервер. // * WSПароль - Строка - пароль пользователя. // * WSТаймаут - Число - таймаут на операции выполняемые через полученное прокси. -// СтрокаСообщенияОбОшибке - строка - содержит подробное описание ошибки в случае неуспешного подключения; -// СообщениеПользователю - строка - содержит краткое описание ошибки в случае неуспешного подключения. -// Таймаут - число - таймаут. +// СтрокаСообщенияОбОшибке - Строка - содержит подробное описание ошибки в случае неуспешного подключения; +// СообщениеПользователю - Строка - содержит краткое описание ошибки в случае неуспешного подключения. +// Таймаут - Число - таймаут. // // Возвращаемое значение: // WSПрокси - объект WSПрокси веб-сервиса Exchange_3_0_1_1. @@ -821,7 +821,7 @@ // Определяет, используются ли типовых правила конвертации для плана обмена. // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. +// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. // // Возвращаемое значение: // Булево - если Истина, то используются; Ложь - нет. @@ -839,15 +839,15 @@ // Свойства см. в функции // ОбщегоНазначенияКлиентСервер.СтруктураПараметровДляУстановкиВнешнегоСоединения: // -// * ВариантРаботыИнформационнойБазы - Число - вариант работы информационной базы: 0 - файловый; 1 - +// * ВариантРаботыИнформационнойБазы - Число - вариант работы информационной базы: 0 - файловый; 1 - // клиент-серверный; -// * КаталогИнформационнойБазы - Строка - каталог информационной базы для файлового режима работы; -// * ИмяСервера1СПредприятия - Строка - имя сервера1С:Предприятия; -// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - имя информационной базы на сервере1С:Предприятия; -// * АутентификацияОперационнойСистемы - Булево - признак аутентификации операционной системы при создании +// * КаталогИнформационнойБазы - Строка - каталог информационной базы для файлового режима работы; +// * ИмяСервера1СПредприятия - Строка - имя сервера1С:Предприятия; +// * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - имя информационной базы на сервере1С:Предприятия; +// * АутентификацияОперационнойСистемы - Булево - признак аутентификации операционной системы при создании // внешнего подключения к информационной базе; -// * ИмяПользователя - Строка - имя пользователя информационной базы; -// * ПарольПользователя - Строка - пароль пользователя информационной базы. +// * ИмяПользователя - Строка - имя пользователя информационной базы; +// * ПарольПользователя - Строка - пароль пользователя информационной базы. // // Возвращаемое значение: // Структура: @@ -921,7 +921,7 @@ // - Неопределено - идентификатор варианта настройки, // как он указан в модуле менеджера плана обмена. // ПараметрыПодключения - Структура - структура параметров подключения: -// * ИдентификаторКорреспондента - Строка(36) +// * ИдентификаторКорреспондента - Строка - строка длиной 36 символов // - Неопределено - уникальный идентификатор корреспондента. // * НаименованиеКорреспондента - Строка // - Неопределено - название корреспондента, как он будет отображаться @@ -1179,7 +1179,7 @@ // Контекст - Структура - контекст выполнения операции: // * Корреспондент - ПланОбменаСсылка - узел обмена, соответствующий корреспонденту. // ПараметрыПодключения - Структура - структура параметров подключения: -// * ИдентификаторКорреспондента - Строка(36) - уникальный идентификатор корреспондента. +// * ИдентификаторКорреспондента - Строка - строка длиной 36 символов, уникальный идентификатор корреспондента. // * НаименованиеКорреспондента - Строка - название корреспондента, как он отображается // в списке настроенных синхронизаций. // * НастройкиТранспорта - Произвольный - сохраненные настройки транспорта сообщений обмена внешней системы. @@ -1501,7 +1501,7 @@ // Удаляет поставляемые правила для плана обмена (очищает данные в регистре). // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, для которого удаляются правила. +// ИмяПланаОбмена - Строка - имя плана обмена, для которого удаляются правила. // Процедура УдалитьПоставляемыеПравила(ИмяПланаОбмена) Экспорт @@ -1512,8 +1512,8 @@ // Загружает поставляемые правила для плана обмена. // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. -// ИмяФайлаПравил - Строка - полное имя файла правил обмена (*.zip). +// ИмяПланаОбмена - Строка - имя плана обмена, для которого загружаются правила. +// ИмяФайлаПравил - Строка - полное имя файла правил обмена (*.zip). // Процедура ЗагрузитьПоставляемыеПравила(ИмяПланаОбмена, ИмяФайлаПравил) Экспорт @@ -2228,7 +2228,7 @@ // что распределенная информационная база создана на базе плана обмена, обслуживаемым подсистемой обмена данными БСП. // // Возвращаемое значение: -// ПланОбменаСсылка.<Имя плана обмена>; Неопределено - если текущая информационная база не является +// ПланОбменаСсылка.<ИмяПланаОбмена>, Неопределено - если текущая информационная база не является // узлом распределенной информационной базы // или главный узел для нее не определен (она сама является корневым узлом) // или распределенная информационная база создана на базе плана обмена, который не обслуживается подсистемой обмена @@ -2263,8 +2263,8 @@ // либо пользователь с правами поставляемого профиля "Синхронизация данных с другими программами". // // Параметры: -// Пользователь (необязательный) - ПользовательИнформационнойБазы -// - Неопределено. +// Пользователь - ПользовательИнформационнойБазы +// - Неопределено. // Пользователь, для которого необходимо вычислить признак разрешения использования синхронизации данных. // Если параметр не задан, то функция вычисляется для текущего пользователя информационной базы. // @@ -2458,18 +2458,18 @@ ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1000 - | Таблица.Ссылка КАК Ссылка, - | Таблица.Представление КАК Представление + | ИмяТаблицыПланаОбмена.Ссылка КАК Ссылка, + | ИмяТаблицыПланаОбмена.Представление КАК Представление |ИЗ - | [ИмяТаблицы] КАК Таблица + | &ИмяТаблицыПланаОбмена КАК ИмяТаблицыПланаОбмена | |ГДЕ - | НЕ Таблица.ПометкаУдаления + | НЕ ИмяТаблицыПланаОбмена.ПометкаУдаления | |УПОРЯДОЧИТЬ ПО - | Таблица.Представление"; + | ИмяТаблицыПланаОбмена.Представление"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ИмяТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыПланаОбмена", ИмяТаблицы); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -2826,7 +2826,7 @@ // * ФорматОбмена - Строка - пространство имен XDTO пакета, в котором содержится // универсальный формат, без указания версии формата. // Используется только для обменов через универсальный формат. -// * РасширенияФорматаОбмена - Соответствие: +// * РасширенияФорматаОбмена - Соответствие из КлючИЗначение: // ** Ключ - Строка - URI пространства имен схемы расширения формата. // ** Значение - Строка - номер расширяемой версии формата. // * ПланОбменаИспользуетсяВМоделиСервиса - Булево - признак использования плана обмена для организации @@ -3001,7 +3001,7 @@ // Получение файла по его идентификатору. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. // // Возвращаемое значение: // ИмяФайла - Строка - имя файла. @@ -3246,8 +3246,8 @@ // Увеличение счетчика выгруженных объектов и расчет процента выгрузки. Только для РИБ. // // Параметры: -// Получатель - план обмена объект. -// СозданиеНачальногоОбраза - булево. +// Получатель - ПланОбменаОбъект +// СозданиеНачальногоОбраза - Булево // Процедура РассчитатьПроцентВыгрузкиРИБ(Получатель, СозданиеНачальногоОбраза) Экспорт @@ -3297,7 +3297,7 @@ // Увеличение счетчика загруженных объектов и расчет процента загрузки. Только для РИБ. // // Параметры: -// Отправитель - план обмена объект. +// Отправитель - ПланОбменаОбъект // Процедура РассчитатьПроцентЗагрузкиРИБ(Отправитель) Экспорт @@ -3658,10 +3658,10 @@ // Определяет является ли план обмена БСП разделенным. // // Параметры: -// ИмяПланаОбмена - Строка - имя проверяемого плана обмена. +// ИмяПланаОбмена - Строка - имя проверяемого плана обмена. // // Возвращаемое значение: -// Тип - булево +// Тип - булево // Функция ЭтоРазделенныйПланОбменаБСП(Знач ИмяПланаОбмена) Экспорт @@ -3712,7 +3712,7 @@ |ВЫБРАТЬ | ПланыОбмена.УзелИнформационнойБазы КАК УзелИнформационнойБазы, | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | ЕСТЬNULL(СостоянияОбменовДаннымиВыгрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейВыгрузкиДанных, | ЕСТЬNULL(СостоянияОбменовДаннымиЗагрузка.РезультатВыполненияОбмена, 0) КАК РезультатПоследнейЗагрузкиДанных, @@ -3758,7 +3758,7 @@ |УПОРЯДОЧИТЬ ПО | ПланыОбмена.Наименование"); - Запрос.Текст = СтрЗаменить(Запрос.Текст, "[ДополнительныеСвойстваПланаОбмена]", + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДополнительныеСвойстваПланаОбмена,", ДополнительныеСвойстваПланаОбменаСтрокой(ДополнительныеСвойстваПланаОбмена)); МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; @@ -4082,7 +4082,7 @@ // Устанавливает значение параметра "Загрузка" для свойства объекта "ОбменДанными". // // Параметры: -// Объект - Любой объект - объект, для которого устанавливается свойство. +// Объект - Произвольный - объект, для которого устанавливается свойство. // Значение - Булево - значение устанавливаемого свойства "Загрузка". // ОтправкаНазад - Булево - признак необходимости регистрации данных к обратной отправке. // УзелОбмена - ПланОбменаСсылка - признак необходимости регистрации данных к обратной отправке. @@ -4205,10 +4205,6 @@ #Область ОбработчикиСобытийПодсистемКонфигурации // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -4434,7 +4430,9 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") Тогда @@ -4475,13 +4473,9 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// Исключения - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Исключения) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Исключения.Добавить(Метаданные.РегистрыСведений.РезультатыОбменаДанными.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.РезультатыОбменаДанными.ПолноеИмя()); КонецПроцедуры @@ -5217,14 +5211,14 @@ | Справочник.СценарииОбменовДанными.НастройкиОбмена КАК НастройкиВыполненияОбменаНастройкиОбмена |ГДЕ | НастройкиВыполненияОбменаНастройкиОбмена.Ссылка = &НастройкаВыполненияОбмена - | [УсловиеПоНомеруСтроки] + | И &УсловиеПоНомеруСтроки |УПОРЯДОЧИТЬ ПО | НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки |"; УсловиеПоНомеруСтроки = ?(НомерСтроки = Неопределено, "", "И НастройкиВыполненияОбменаНастройкиОбмена.НомерСтроки = &НомерСтроки"); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[УсловиеПоНомеруСтроки]", УсловиеПоНомеруСтроки); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &УсловиеПоНомеруСтроки", УсловиеПоНомеруСтроки); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -8565,8 +8559,8 @@ // Если файл найден, то возвращается его имя, при этом удаляется информация об этом файле из хранилища. // // Параметры: -// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. -// ИмяФайла - Строка - имя файла, из хранилища. +// ИдентификаторФайла - УникальныйИдентификатор - идентификатор получаемого файла. +// ИмяФайла - Строка - имя файла, из хранилища. // Процедура ПриПолученииФайлаИзХранилища(Знач ИдентификаторФайла, ИмяФайла) @@ -8848,12 +8842,12 @@ "ВЫБРАТЬ | Таблица.Ссылка КАК Ссылка |ИЗ - | [ПолноеИмяОбъекта] КАК Таблица + | &ПолноеИмяОбъекта КАК Таблица |ГДЕ | Таблица.Организация В(&Организации) | И Таблица.Дата >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8869,11 +8863,11 @@ "ВЫБРАТЬ | Таблица.Ссылка КАК Ссылка |ИЗ - | [ПолноеИмяОбъекта] КАК Таблица + | &ПолноеИмяОбъекта КАК Таблица |ГДЕ | Таблица.Дата >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8888,12 +8882,12 @@ "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаРегистра.Регистратор КАК Регистратор |ИЗ - | [ПолноеИмяОбъекта] КАК ТаблицаРегистра + | &ПолноеИмяОбъекта КАК ТаблицаРегистра |ГДЕ | ТаблицаРегистра.Организация В(&Организации) | И ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8909,11 +8903,11 @@ "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаРегистра.Регистратор КАК Регистратор |ИЗ - | [ПолноеИмяОбъекта] КАК ТаблицаРегистра + | &ПолноеИмяОбъекта КАК ТаблицаРегистра |ГДЕ | ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8929,15 +8923,15 @@ ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | [Измерения] + | &Измерения |ИЗ - | [ПолноеИмяОбъекта] КАК ТаблицаРегистра + | &ПолноеИмяОбъекта КАК ТаблицаРегистра |ГДЕ | ТаблицаРегистра.Организация В(&Организации) | И ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтрСоединить(ОсновнойОтбор, ",")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Измерения", СтрСоединить(ОсновнойОтбор, ",")); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8951,14 +8945,14 @@ ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | [Измерения] + | &Измерения |ИЗ - | [ПолноеИмяОбъекта] КАК ТаблицаРегистра + | &ПолноеИмяОбъекта КАК ТаблицаРегистра |ГДЕ | ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтрСоединить(ОсновнойОтбор, ",")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Измерения", СтрСоединить(ОсновнойОтбор, ",")); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -8971,14 +8965,14 @@ ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | [Измерения] + | &Измерения |ИЗ - | [ПолноеИмяОбъекта] КАК ТаблицаРегистра + | &ПолноеИмяОбъекта КАК ТаблицаРегистра |ГДЕ | ТаблицаРегистра.Организация В(&Организации)"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтрСоединить(ОсновнойОтбор, ",")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъекта", ПолноеИмяОбъекта); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Измерения", СтрСоединить(ОсновнойОтбор, ",")); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организации", Организации); @@ -9045,7 +9039,7 @@ // ИмяПланаОбмена - Строка - имя плана обмена. // ВерсияКорреспондента - Строка - версия конфигурации-корреспондента. // ИмяКорреспондента - Строка - имя конфигурации корреспондента. -// КорреспондентВМоделиСервиса - Булево или Неопределено - признак того, что корреспондент находится в модели сервиса. +// КорреспондентВМоделиСервиса - Булево, Неопределено - признак того, что корреспондент находится в модели сервиса. // Возвращаемое значение: // см. НастройкиПланаОбменаПоУмолчанию. // @@ -9230,7 +9224,7 @@ | | КОНЕЦ КАК РезультатВыполненияОбмена |ИЗ - | РегистрСведений.[СостоянияОбменовДанными] КАК СостоянияОбменовДанными + | РегистрСведений.СостоянияОбменовДанными КАК СостоянияОбменовДанными |ГДЕ | СостоянияОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы | И СостоянияОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ЗагрузкаДанных) @@ -9255,18 +9249,18 @@ | КОНЕЦ КАК РезультатВыполненияОбмена | |ИЗ - | РегистрСведений.[СостоянияОбменовДанными] КАК СостоянияОбменовДанными + | РегистрСведений.СостоянияОбменовДанными КАК СостоянияОбменовДанными |ГДЕ | СостоянияОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы | И СостоянияОбменовДанными.ДействиеПриОбмене = ЗНАЧЕНИЕ(Перечисление.ДействияПриОбмене.ВыгрузкаДанных) |; |"; - Если ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДаннымиОбластейДанных"); - Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДанными"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса.АдаптироватьТекстЗапросаОРезультатахОбменаВСервисе(ТекстЗапроса); + КонецЕсли; Запрос = Новый Запрос; @@ -9315,17 +9309,17 @@ | ДатаНачала, | ДатаОкончания |ИЗ - | РегистрСведений.[СостоянияОбменовДанными] КАК СостоянияОбменовДанными + | РегистрСведений.СостоянияОбменовДанными КАК СостоянияОбменовДанными |ГДЕ | СостоянияОбменовДанными.УзелИнформационнойБазы = &УзелИнформационнойБазы | И СостоянияОбменовДанными.ДействиеПриОбмене = &ДействиеПриОбмене |"; - Если ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДаннымиОбластейДанных"); - Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СостоянияОбменовДанными]", "СостоянияОбменовДанными"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса.АдаптироватьТекстЗапросаОРезультатахОбменаВСервисе(ТекстЗапроса); + КонецЕсли; Запрос = Новый Запрос; @@ -10629,14 +10623,14 @@ // Регистрирует ошибки при отложенном проведении документа в мониторе проблем обмена. // // Параметры: -// Объект - ДокументОбъект - документ при отложенном проведении которого возникли ошибки. -// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен документ. -// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. +// Объект - ДокументОбъект - документ при отложенном проведении которого возникли ошибки. +// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен документ. +// СообщениеОбОшибке - Строка - текст сообщения для журнала регистрации. // Рекомендуется передавать в качестве этого параметра КраткоеПредставлениеОшибки(ИнформацияОбОшибке()). // Текст сообщения для отображения в мониторе формируется из системных сообщений пользователю, которые // были сформированы, но еще не были выведены пользователю. Поэтому рекомендуется, чтобы к моменту вызова // данного метода в буфере сообщений системы не содержалось сообщений. -// РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. +// РегистрироватьПроблемыВРезультатахОбмена - Булево - необходимо регистрировать проблемы. // // Пример: // Процедура ПровестиДокументПриЗагрузке(Документ, УзелОбмена) @@ -10773,7 +10767,8 @@ // Параметры: // Получатель - ПланОбменаОбъект - узел плана обмена, соответствующий получателю. // -// Возвращаемое значение - число. +// Возвращаемое значение: +// Число // Функция РассчитатьКоличествоОбъектовВБазе(Получатель) @@ -10792,22 +10787,35 @@ СтруктураСсылочныхОбъектов.Вставить("Задача", Метаданные.Задачи); СтруктураСсылочныхОбъектов.Вставить("ПланСчетов", Метаданные.ПланыСчетов); - ТекстЗапроса = "ВЫБРАТЬ - |Количество(Ссылка) КАК КоличествоОбъектов - |ИЗ "; + ШаблонТекстаЗапросаСсылки = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(ПсевдонимТаблицыМетаданных.Ссылка) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + Для Каждого СсылочныйОбъект Из СтруктураСсылочныхОбъектов Цикл + Для Каждого ОбъектМетаданных Из СсылочныйОбъект.Значение Цикл + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + Продолжить; + КонецЕсли; - ПолноеИмяОбъекта = СсылочныйОбъект.Ключ +"."+ОбъектМетаданных.Имя; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса + ПолноеИмяОбъекта; + + ПолноеИмяОбъекта = СсылочныйОбъект.Ключ + "." + ОбъектМетаданных.Имя; + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСсылки, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + КонецЕсли; + КонецЦикла; + КонецЦикла; // 2. Константы. @@ -10819,28 +10827,45 @@ КонецЦикла; // 3. Регистры сведений. - ТекстЗапроса = "ВЫБРАТЬ - |Количество(*) КАК КоличествоОбъектов - |ИЗ "; - ТекстЗапросаСРегистратором = "ВЫБРАТЬ - |Количество(РАЗЛИЧНЫЕ Регистратор) КАК КоличествоОбъектов - |ИЗ "; + ШаблонТекстаЗапросаБезРегистратора = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + ШаблонТекстаЗапросаСРегистратором = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПсевдонимТаблицыМетаданных.Регистратор) КАК КоличествоОбъектов + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + Продолжить; - КонецЕсли; - ПолноеИмяОбъекта = "РегистрСведений."+ОбъектМетаданных.Имя; - Запрос = Новый Запрос; - Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда - Запрос.Текст = ТекстЗапросаСРегистратором + ПолноеИмяОбъекта; - Иначе - Запрос.Текст = ТекстЗапроса + ПолноеИмяОбъекта; + КонецЕсли; + ПолноеИмяОбъекта = "РегистрСведений."+ОбъектМетаданных.Имя; + Если ОбъектМетаданных.ПериодичностьРегистраСведений = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.ПозицияРегистратора Тогда + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Иначе + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаБезРегистратора, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + КонецЕсли; + + Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + КонецЕсли; + КонецЦикла; // 4. Регистры (подчиненные регистратору) и последовательности. @@ -10850,20 +10875,29 @@ СтруктураРегистров.Вставить("РегистрБухгалтерии", Метаданные.РегистрыБухгалтерии); СтруктураРегистров.Вставить("Последовательность", Метаданные.Последовательности); - ТекстЗапроса = ТекстЗапросаСРегистратором; Для Каждого Регистр Из СтруктураРегистров Цикл + Для Каждого ОбъектМетаданных Из Регистр.Значение Цикл + Если СоставПланаОбмена.Найти(ОбъектМетаданных) = Неопределено Тогда + Продолжить; + КонецЕсли; + ПолноеИмяОбъекта = Регистр.Ключ +"."+ОбъектМетаданных.Имя; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса + ПолноеИмяОбъекта; + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапросаСРегистратором, "&ИмяТаблицыМетаданных", ПолноеИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда + СчетчикОбъектов = СчетчикОбъектов + Выборка.КоличествоОбъектов; + КонецЕсли; + КонецЦикла; + КонецЦикла; Возврат СчетчикОбъектов; @@ -10873,9 +10907,10 @@ // Подсчет количества объектов, зарегистрированных в плане обмена. // // Параметры: -// Получатель - план обмена объект. +// Получатель - ПланОбменаОбъект // -// Возвращаемое значение - число. +// Возвращаемое значение: +// Число // Функция РассчитатьКоличествоЗарегистрированныхОбъектов(Получатель) Экспорт @@ -11086,20 +11121,22 @@ ДополнительныеСвойстваПланаОбменаСтрокой = ?(ПустаяСтрока(ДополнительныеСвойстваПланаОбмена), "", ДополнительныеСвойстваПланаОбмена + ", "); - ШаблонЗапроса = " + СекцияОбъединения = " | |ОБЪЕДИНИТЬ ВСЕ - | - |//////////////////////////////////////////////////////// {[ИмяПланаОбмена]} + |"; + + ШаблонЗапроса = СекцияОбъединения + + "//////////////////////////////////////////////////////// {&ИмяТаблицыПланаОбмена} |ВЫБРАТЬ | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | Ссылка КАК УзелИнформационнойБазы, | Наименование КАК Наименование, - | ""[ИмяПланаОбменаСиноним]"" КАК ИмяПланаОбмена + | ""&ИмяПланаОбменаСиноним"" КАК ИмяПланаОбмена |ИЗ - | ПланОбмена.[ИмяПланаОбмена] + | &ИмяТаблицыПланаОбмена |ГДЕ | НЕ ЭтотУзел | И НЕ ПометкаУдаления @@ -11109,11 +11146,15 @@ Если ПланыОбменаМетода.Количество() > 0 Тогда + ШаблонИмениТаблицыПланаОбмена = "ПланОбмена.%1"; + Для Каждого ИмяПланаОбмена Из ПланыОбменаМетода Цикл - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ШаблонЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "[ИмяПланаОбменаСиноним]", Метаданные.ПланыОбмена[ИмяПланаОбмена].Синоним); - ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой); + ИмяТаблицыПланаОбмена = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениТаблицыПланаОбмена, ИмяПланаОбмена); + + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ШаблонЗапроса, "&ИмяТаблицыПланаОбмена", ИмяТаблицыПланаОбмена); + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "&ИмяПланаОбменаСиноним", Метаданные.ПланыОбмена[ИмяПланаОбмена].Синоним); + ТекстЗапросаДляПланаОбмена = СтрЗаменить(ТекстЗапросаДляПланаОбмена, "&ДополнительныеСвойстваПланаОбмена,", ДополнительныеСвойстваПланаОбменаСтрокой); // Удаляем литерал объединения для первой таблицы. Если ПустаяСтрока(ТекстЗапроса) Тогда @@ -11149,14 +11190,14 @@ ТекстЗапроса = " |ВЫБРАТЬ | - | [ДополнительныеСвойстваБезИсточникаДанныхСтрокой] + | &ДополнительныеСвойстваБезИсточникаДанныхСтрокой, | | Неопределено КАК УзелИнформационнойБазы, | Неопределено КАК Наименование, | Неопределено КАК ИмяПланаОбмена |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ДополнительныеСвойстваБезИсточникаДанныхСтрокой]", ДополнительныеСвойстваБезИсточникаДанныхСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДополнительныеСвойстваБезИсточникаДанныхСтрокой,", ДополнительныеСвойстваБезИсточникаДанныхСтрокой); КонецЕсли; @@ -11164,24 +11205,24 @@ |//////////////////////////////////////////////////////// {ПланыОбменаКонфигурации} |ВЫБРАТЬ | - | [ДополнительныеСвойстваПланаОбмена] + | &ДополнительныеСвойстваПланаОбмена, | | УзелИнформационнойБазы, | Наименование, | ИмяПланаОбмена - | [ПомещениеВоВременнуюТаблицу] + |// ПомещениеВоВременнуюТаблицу |ИЗ - | ( - | [ТекстЗапроса] - | ) КАК ВложенныйЗапрос + | &ТекстЗапроса КАК ВложенныйЗапрос |; |"; + ИмяВрТаблицы = ?(РезультатВоВременнуюТаблицу, "ПОМЕСТИТЬ ПланыОбменаКонфигурации", ""); + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "// ПомещениеВоВременнуюТаблицу", ИмяВрТаблицы); - ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ПомещениеВоВременнуюТаблицу]", - ?(РезультатВоВременнуюТаблицу, "ПОМЕСТИТЬ ПланыОбменаКонфигурации", "")); - ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ТекстЗапроса]", ТекстЗапроса); - ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "[ДополнительныеСвойстваПланаОбмена]", ДополнительныеСвойстваПланаОбменаСтрокой); + ОбернутыйТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("(%1)", ТекстЗапроса); + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "&ТекстЗапроса", ОбернутыйТекстЗапроса); + + ТекстЗапросаРезультат = СтрЗаменить(ТекстЗапросаРезультат, "&ДополнительныеСвойстваПланаОбмена,", ДополнительныеСвойстваПланаОбменаСтрокой); Возврат ТекстЗапросаРезультат; @@ -12196,62 +12237,82 @@ Функция ЭлементыИерархическогоСправочникаИерархияГруппИЭлементов(Знач ПолноеИмяТаблицы) - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 2000 - | Ссылка, - | Представление, + ШаблонТекстаЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 2000 + | ПсевдонимТаблицыМетаданных.Ссылка, + | ПсевдонимТаблицыМетаданных.Представление, | ВЫБОР - | КОГДА ЭтоГруппа И НЕ ПометкаУдаления ТОГДА 0 - | КОГДА ЭтоГруппа И ПометкаУдаления ТОГДА 1 - | КОГДА НЕ ЭтоГруппа И НЕ ПометкаУдаления ТОГДА 2 - | КОГДА НЕ ЭтоГруппа И ПометкаУдаления ТОГДА 3 + | КОГДА ПсевдонимТаблицыМетаданных.ЭтоГруппа + | И НЕ ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 0 + | КОГДА ПсевдонимТаблицыМетаданных.ЭтоГруппа + | И ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 1 + | КОГДА НЕ ПсевдонимТаблицыМетаданных.ЭтоГруппа + | И НЕ ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 2 + | КОГДА НЕ ПсевдонимТаблицыМетаданных.ЭтоГруппа + | И ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 3 | КОНЕЦ КАК ИндексКартинки |ИЗ - | " + ПолноеИмяТаблицы + " + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных |УПОРЯДОЧИТЬ ПО - | ЭтоГруппа ИЕРАРХИЯ, - | Наименование - |"); - + | ПсевдонимТаблицыМетаданных.ЭтоГруппа ИЕРАРХИЯ, + | ПсевдонимТаблицыМетаданных.Наименование"; + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", ПолноеИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапроса); Возврат РезультатЗапросаВXMLДерево(Запрос); + КонецФункции Функция ЭлементыИерархическогоСправочникаИерархияЭлементов(Знач ПолноеИмяТаблицы) - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 2000 - | Ссылка, - | Представление, - | ВЫБОР - | КОГДА ПометкаУдаления ТОГДА 3 - | ИНАЧЕ 2 - | КОНЕЦ КАК ИндексКартинки - |ИЗ - | " + ПолноеИмяТаблицы + " - |УПОРЯДОЧИТЬ ПО - | Наименование ИЕРАРХИЯ - |"); - + ШаблонТекстаЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 2000 + | ПсевдонимТаблицыМетаданных.Ссылка, + | ПсевдонимТаблицыМетаданных.Представление, + | ВЫБОР + | КОГДА ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 3 + | ИНАЧЕ 2 + | КОНЕЦ КАК ИндексКартинки + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных + |УПОРЯДОЧИТЬ ПО + | ПсевдонимТаблицыМетаданных.Наименование ИЕРАРХИЯ"; + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", ПолноеИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапроса); Возврат РезультатЗапросаВXMLДерево(Запрос); + КонецФункции Функция ЭлементыНеиерархическогоСправочника(Знач ПолноеИмяТаблицы) - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 2000 - | Ссылка, - | Представление, - | ВЫБОР - | КОГДА ПометкаУдаления ТОГДА 3 - | ИНАЧЕ 2 - | КОНЕЦ КАК ИндексКартинки - |ИЗ - | " + ПолноеИмяТаблицы + " - |УПОРЯДОЧИТЬ ПО - | Наименование - |"); - + ШаблонТекстаЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 2000 + | ПсевдонимТаблицыМетаданных.Ссылка КАК Ссылка, + | ПсевдонимТаблицыМетаданных.Представление КАК Представление, + | ВЫБОР + | КОГДА ПсевдонимТаблицыМетаданных.ПометкаУдаления + | ТОГДА 3 + | ИНАЧЕ 2 + | КОНЕЦ КАК ИндексКартинки + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных + | + |УПОРЯДОЧИТЬ ПО + | ПсевдонимТаблицыМетаданных.Наименование"; + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", ПолноеИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапроса); Возврат РезультатЗапросаВXMLДерево(Запрос); + КонецФункции // Параметры: @@ -12963,8 +13024,8 @@ // Выводит сообщение об ошибке и выставляет параметр Отказ в "Истина". // // Параметры: -// ТекстСообщения - строка - текст сообщения. -// Отказ - булево - признак отказа (необязательный). +// ТекстСообщения - Строка - текст сообщения. +// Отказ - Булево - признак отказа // Процедура СообщитьОбОшибке(ТекстСообщения, Отказ = Ложь) Экспорт @@ -12980,7 +13041,7 @@ // Нет. // // Возвращаемое значение: -// Таблица значений - таблица реквизитов регистрации для всех объектов метаданных. +// ТаблицаЗначений - таблица реквизитов регистрации для всех объектов метаданных. // Функция ПолучитьПравилаВыборочнойРегистрацииОбъектовПС() Экспорт @@ -13027,24 +13088,35 @@ Процедура ВыполнитьОбновлениеВерсииТиповыхПравилДляОбменаДанными(ПравилаОбменаЗагруженныеИзФайла, ПравилаРегистрацииЗагруженныеИзФайла) Отказ = Ложь; - ТекстЗапроса = ""; + ШаблонТекстаЗапроса = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(ПсевдонимТаблицыМетаданных.Ссылка) КАК Количество, + | ""&ИмяПланаОбмена"" КАК ИмяПланаОбмена + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных"; + + ТекстЗапроса = ""; Для Каждого ИмяПланаОбмена Из ОбменДаннымиПовтИсп.ПланыОбменаБСП() Цикл Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; + КонецЕсли; - ТекстЗапроса = ТекстЗапроса + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ - | КОЛИЧЕСТВО (%1.Ссылка) КАК Количество, - | ""%1"" КАК ИмяПланаОбмена - |ИЗ - | ПланОбмена.%1 КАК %1", ИмяПланаОбмена); - + ТекстПодзапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ПланОбмена.%1", ИмяПланаОбмена)); + ТекстПодзапроса = СтрЗаменить(ТекстПодзапроса, "&ИмяПланаОбмена", ИмяПланаОбмена); + ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса; + КонецЦикла; + Если ПустаяСтрока(ТекстЗапроса) Тогда + Возврат; + КонецЕсли; + Запрос = Новый Запрос(ТекстЗапроса); Результат = Запрос.Выполнить().Выгрузить(); @@ -13953,7 +14025,9 @@ // Возвращаемое значение: // ТаблицаЗначений - коллекция регистров с движениями по заданному регистратору: // * ИмяТаблицыРегистра - Строка - полное имя таблицы регистра. -// * НаборЗаписей - РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, и т.п. - набор записей. +// * НаборЗаписей - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - и т.п. - набор записей. // * БезусловноеУдаление - Булево - признак безусловного удаления записей. // Функция ОпределитьНаличиеДвиженийПоДокументу(ДокументСсылка) @@ -13972,25 +14046,38 @@ // Для исключения падения для документов, проводящимся более чем по 256 таблицам. СчетчикТаблиц = 0; + ШаблонТекстаЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ВЫРАЗИТЬ(""&ИмяТаблицыМетаданных"" КАК СТРОКА(200)) КАК ИмяТаблицыРегистра + |ИЗ + | &ИмяТаблицыМетаданных КАК ПсевдонимТаблицыМетаданных + |ГДЕ + | ПсевдонимТаблицыМетаданных.Регистратор = &Регистратор"; + Для Каждого Движение Из МетаданныеДокумента.Движения Цикл // В запросе получаем имена регистров, по которым есть хотя бы одно движение. // Например, // ВЫБРАТЬ Первые 1 "РегистрНакопления.ТоварыНаСкладах" // ИЗ РегистрНакопления.ТоварыНаСкладах // ГДЕ Регистратор = &Регистратор. + // Имя регистра приводим к Строка(200) - // Имя регистра приводим к Строка(200), см. ниже. - ТекстЗапроса = ТекстЗапроса + " - |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + " - |ВЫБРАТЬ ПЕРВЫЕ 1 ВЫРАЗИТЬ(""" + Движение.ПолноеИмя() - + """ КАК Строка(200)) КАК ИмяТаблицыРегистра ИЗ " + Движение.ПолноеИмя() - + " ГДЕ Регистратор = &Регистратор"; + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда + + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; + + КонецЕсли; + + ТекстПодзапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", Движение.ПолноеИмя()); + ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса; // Если в запрос попадает более 256 таблиц - разбиваем его на две части // (вариант документа с проведением по 512 регистрам считаем нежизненным). СчетчикТаблиц = СчетчикТаблиц + 1; Если СчетчикТаблиц = 256 Тогда + Прервать; + КонецЕсли; КонецЦикла; @@ -14006,7 +14093,9 @@ // Если количество таблиц не превысило 256 - возвращаем таблицу. Если СчетчикТаблиц = МетаданныеДокумента.Движения.Количество() Тогда + Возврат ТаблицаЗапроса; + КонецЕсли; // Таблиц больше чем 256, делаем доп. запрос и дополняем строки таблицы. @@ -14014,22 +14103,30 @@ Для Каждого Движение Из МетаданныеДокумента.Движения Цикл Если СчетчикТаблиц > 0 Тогда + СчетчикТаблиц = СчетчикТаблиц - 1; Продолжить; + КонецЕсли; - ТекстЗапроса = ТекстЗапроса + " - |" + ?(ТекстЗапроса = "", "", "ОБЪЕДИНИТЬ ВСЕ ") + " - |ВЫБРАТЬ ПЕРВЫЕ 1 """ + Движение.ПолноеИмя() + """ КАК ИмяТаблицыРегистра ИЗ " - + Движение.ПолноеИмя() + " ГДЕ Регистратор = &Регистратор"; + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда + + ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; + + КонецЕсли; + + ТекстПодзапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&ИмяТаблицыМетаданных", Движение.ПолноеИмя()); + ТекстЗапроса = ТекстЗапроса + ТекстПодзапроса; КонецЦикла; - Запрос.Текст = ТекстЗапроса; + Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл + СтрокаТаблицы = ТаблицаЗапроса.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка); + КонецЦикла; Возврат ТаблицаЗапроса; @@ -14041,8 +14138,8 @@ // Параметры: // Отбор - Структура - содержит значения элементов отбора. // Если параметр задан, то будет получено дерево метаданных в соответствии с заданным отбором: -// Ключ - Строка - имя свойства элемента метаданных; -// Значение - Массив - множество значений для отбора. +// Ключ - Строка - имя свойства элемента метаданных; +// Значение - Массив - множество значений для отбора. // // Пример инициализации переменной "Отбор": // @@ -14193,7 +14290,8 @@ // Зачитывает из информационной базы информацию о сообщении обмена данными. // -// Возвращаемое значение - Структура - информация о расположении файла сообщения обмена (текущий формат). +// Возвращаемое значение: +// Структура - информация о расположении файла сообщения обмена (текущий формат). // - ДвоичныеДанные - сообщение обмена в информационной базе (устаревший формат). // Функция СообщениеОбменаДаннымиИзГлавногоУзла() @@ -14206,8 +14304,8 @@ // Сохраняет путь к записанному сообщению в константу СообщениеОбменаДаннымиИзГлавногоУзла. // // Параметры: -// СообщениеОбмена - ДвоичныеДанные - зачитанное сообщение обмена. -// ГлавныйУзел - ПланОбменаСсылка - узел из которого получено сообщение. +// СообщениеОбмена - ДвоичныеДанные - зачитанное сообщение обмена. +// ГлавныйУзел - ПланОбменаСсылка - узел из которого получено сообщение. // Процедура УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СообщениеОбмена, ГлавныйУзел) Экспорт @@ -14294,7 +14392,8 @@ // Параметры: // ВнешнийМодуль - ЛюбаяСсылка - ссылка на внешний модуль. // -// Возвращаемое значение - Строка - шаблон имя профиля безопасности, содержащий символы +// Возвращаемое значение: +// Строка - шаблон имя профиля безопасности, содержащий символы // "%1", вместо которых в дальнейшем будет подставлен уникальный идентификатор. // Функция ШаблонИмениПрофиляБезопасности(Знач ВнешнийМодуль) Экспорт @@ -14308,7 +14407,8 @@ // // ВнешнийМодуль - ЛюбаяСсылка, ссылка на внешний модуль, // -// Возвращаемое значение - Картинка. +// Возвращаемое значение: +// Картинка. // Функция ПиктограммаВнешнегоМодуля(Знач ВнешнийМодуль) Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl index b180660b3..58888b615 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСлужебный/Module.bsl @@ -159,7 +159,7 @@ // Возвращает список приоритетных данных обмена. // // Возвращаемое значение: -// Массив - коллекция ссылок на выгруженные приоритетные данные обмена. +// Массив - коллекция ссылок на выгруженные приоритетные данные обмена. // Функция ПриоритетныеДанныеОбмена() Экспорт @@ -216,10 +216,10 @@ // то считается, что он используется. // // Параметры: -// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. +// ИмяПланаОбмена - Строка - имя плана обмена, как оно задано в конфигураторе. // // Возвращаемое значение: -// Булево - Истина, если план обмена используется, Ложь - нет. +// Булево - Истина, если план обмена используется, Ложь - нет. // Функция ОбменДаннымиВключен(Знач ИмяПланаОбмена, Знач Отправитель) Экспорт @@ -231,7 +231,7 @@ // Возвращает значение параметра сеанса ПравилаРегистрацииОбъектов, полученное в привилегированном режиме. // // Возвращаемое значение: -// ХранилищеЗначения - значение параметра сеанса ПравилаРегистрацииОбъектов. +// ХранилищеЗначения - значение параметра сеанса ПравилаРегистрацииОбъектов. // Функция ПараметрыСеансаПравилаРегистрацииОбъектов() Экспорт @@ -243,12 +243,15 @@ // Возвращает признак того, что для получателя зарегистрированы изменения данных. // +// Возвращаемое значение: +// Булево - Истина, если есть зарегистрированные данные, Ложь - нет. +// Функция ИзмененияЗарегистрированы(Знач Получатель) Экспорт ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1 1 |ИЗ - | [Таблица].Изменения КАК ТаблицаИзменений + | &ИмяТаблицыИзменения КАК ТаблицаИзменений |ГДЕ | ТаблицаИзменений.Узел = &Узел"; @@ -257,12 +260,14 @@ УстановитьПривилегированныйРежим(Истина); - СоставПланаОбмена = Метаданные.ПланыОбмена[ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Получатель)].Состав; + СтрокаШаблона = "%1.Изменения"; + СоставПланаОбмена = Метаданные.ПланыОбмена[ОбменДаннымиПовтИсп.ПолучитьИмяПланаОбмена(Получатель)].Состав; Для Каждого ЭлементСостава Из СоставПланаОбмена Цикл - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "[Таблица]", ЭлементСостава.Метаданные.ПолноеИмя()); + ИмяТаблицыИзменения = СтрШаблон(СтрокаШаблона, ЭлементСостава.Метаданные.ПолноеИмя()); + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыИзменения", ИмяТаблицыИзменения); РезультатЗапроса = Запрос.Выполнить(); Если Не РезультатЗапроса.Пустой() Тогда @@ -963,7 +968,8 @@ Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл - ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя].Выгрузить(), ТаблицаПредопределенных); + ТабличнаяЧастьПланаСчетов = ТабличнаяЧасть; // ОбъектМетаданныхПланСчетов + ПроверитьОтметитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧастьПланаСчетов.Имя].Выгрузить(), ТаблицаПредопределенных); КонецЦикла; КонецЕсли; @@ -1016,7 +1022,8 @@ Если ОбщегоНазначения.ЭтоПланСчетов(МетаданныеОбъекта) Или ОбщегоНазначения.ЭтоПланВидовРасчета(МетаданныеОбъекта) Тогда Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.СтандартныеТабличныеЧасти Цикл - ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧасть.Имя], ТаблицаПредопределенных); + ТабличнаяЧастьПланаСчетов = ТабличнаяЧасть; // ОбъектМетаданныхПланСчетов + ПроверитьЗаменитьСсылкуПредопределенныхВТаблицеДанных(Данные[ТабличнаяЧастьПланаСчетов.Имя], ТаблицаПредопределенных); КонецЦикла; КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl index aea4edf5e..63ec30fe5 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -195,8 +195,8 @@ // Вычитает один массив элементов из другого массива. Возвращает результат вычитания. // // Параметры: -// Массив - Массив из Произвольный - исходный массив. -// МассивВычитания - Массив из Произвольный - массив, вычитаемый из исходного массива. +// Массив - Массив из Произвольный - исходный массив. +// МассивВычитания - Массив из Произвольный - массив, вычитаемый из исходного массива. // // Возвращаемое значение: // Массив из Произвольный - результат вычитания. @@ -315,7 +315,11 @@ // Вызывается из обработчиков планов обмена: ПриОтправкеДанныхГлавному(), ПриОтправкеДанныхПодчиненному(). // // Параметры: -// ЭлементДанных - КонстантаМенеджерЗначения, СправочникОбъект, ДокументОбъект, РегистрСведенийНаборЗаписей, и т.п. - +// ЭлементДанных - КонстантаМенеджерЗначения +// - СправочникОбъект +// - ДокументОбъект +// - РегистрСведенийНаборЗаписей +// - и т.п. - // элемент данных. // ОтправкаЭлемента - ОтправкаЭлементаДанных - см. описание параметра "ОтправкаЭлемента" в синтаксис помощнике // для методов ПриОтправкеДанныхГлавному() и ПриОтправкеДанныхПодчиненному(). @@ -454,7 +458,7 @@ // - УдалениеОбъекта - объект, представляющий данные, // хранимые в базе данных, такой как документ, элемент справочника, счет бухгалтерского учета, менеджер // записи константы, набор записей регистра и т. п. -// ПроверятьРазрешениеВыгрузки - Булево - необязательный флаг. Если установить в Ложь, то дополнительная проверка +// ПроверятьРазрешениеВыгрузки - Булево - флаг. Если установить в Ложь, то дополнительная проверка // на соответствие общим настройкам узла при регистрации производится не // будет. // @@ -529,7 +533,7 @@ // Объект - записываемый объект ИБ. // СсылкаСуществует - Булево - признак наличия объекта по ссылке в информационной базе. // СведенияОВерсииОбъекта - Структура: -// * АвторВерсии - Пользователь или Узел плана обмена - источник версии. +// * АвторВерсии - Пользователь, УзелПланаОбмена - источник версии. // Необязательный, значение по умолчанию Неопределено. // * ТипВерсииОбъекта - Строка - тип создаваемой версии. // Необязательный, значение по умолчанию "ИзмененоПользователем". @@ -1260,17 +1264,20 @@ Процедура ЗарегистрироватьИзмененияНаВсехУзлахРазделенныхПлановОбмена(ИмяПланаОбмена, Объект) + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяПланаОбмена); + ТекстЗапроса = - "ВЫБРАТЬ - | ПланОбмена.Ссылка КАК Получатель - |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена - |ГДЕ - | ПланОбмена.РегистрироватьИзменения - | И НЕ ПланОбмена.ПометкаУдаления"; + "ВЫБРАТЬ + | ПланОбмена.Ссылка КАК Получатель + |ИЗ + | &ИмяПланаОбмена КАК ПланОбмена + |ГДЕ + | ПланОбмена.РегистрироватьИзменения + | И НЕ ПланОбмена.ПометкаУдаления"; Запрос = Новый Запрос; - Запрос.Текст = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель"); Для Каждого Получатель Из Получатели Цикл @@ -1380,35 +1387,40 @@ Функция РеквизитыРегистрацииШапкиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - ТекстЗапроса = " - |ВЫБРАТЬ " + СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации - + " ИЗ " + СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта + " КАК ТекущийОбъект + ШаблонТекстаЗапроса = + "ВЫБРАТЬ + | &РеквизитыРегистрации + |ИЗ + | &ИмяТаблицыМетаданных КАК ТекущийОбъект |ГДЕ - | ТекущийОбъект.Ссылка = &Ссылка - |"; + | ТекущийОбъект.Ссылка = &Ссылка"; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта); + + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - Возврат Запрос.Выполнить().Выгрузить(); КонецФункции Функция РеквизитыРегистрацииТабличнойЧастиДоИзменения(Объект, СтрокаТаблицыРеквизитовРегистрации) - ТекстЗапроса = " - |ВЫБРАТЬ "+ СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации - + " ИЗ " + СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта - + "." + СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти + " КАК ТекущийОбъектИмяТабличнойЧасти + ШаблонТекстаЗапроса = + "ВЫБРАТЬ + | &РеквизитыРегистрации + |ИЗ + | &ИмяТаблицыМетаданных КАК ТекущийОбъектИмяТабличнойЧасти |ГДЕ - | ТекущийОбъектИмяТабличнойЧасти.Ссылка = &Ссылка - |"; + | ТекущийОбъектИмяТабличнойЧасти.Ссылка = &Ссылка"; - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; + СтрокаЗамены = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1.%2", СтрокаТаблицыРеквизитовРегистрации.ИмяОбъекта, СтрокаТаблицыРеквизитовРегистрации.ИмяТабличнойЧасти); + + ТекстЗапроса = СтрЗаменить(ШаблонТекстаЗапроса, "&РеквизитыРегистрации", СтрокаТаблицыРеквизитовРегистрации.РеквизитыРегистрации); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", СтрокаЗамены); + + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - Возврат Запрос.Выполнить().Выгрузить(); КонецФункции @@ -1665,19 +1677,23 @@ // Функция УзлыДляРегистрацииПоУсловиюВыгружатьВсегда(Знач ИмяПланаОбмена, Знач ИмяРеквизитаФлага) - ТекстЗапроса = " - |ВЫБРАТЬ + ШаблонТекста = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяПланаОбмена); + + ШаблонТекстаПоле = "ШапкаПланаОбмена.%1"; + ИмяРеквизитаФлагаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаПоле, ИмяРеквизитаФлага); + + ТекстЗапроса = "ВЫБРАТЬ | ШапкаПланаОбмена.Ссылка КАК Узел |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ШапкаПланаОбмена + | &ИмяПланаОбмена КАК ШапкаПланаОбмена |ГДЕ - | НЕ ШапкаПланаОбмена.ЭтотУзел - | И ШапкаПланаОбмена.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВсегда) - | И НЕ ШапкаПланаОбмена.ПометкаУдаления - |"; + | НЕ ШапкаПланаОбмена.ЭтотУзел + | И &ИмяРеквизитаФлага = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьВсегда) + | И НЕ ШапкаПланаОбмена.ПометкаУдаления"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаФлага]", ИмяРеквизитаФлага); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаФлага", ИмяРеквизитаФлагаСтрокой); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -1704,25 +1720,27 @@ Ссылка, ИмяПланаОбмена, ИмяРеквизитаФлага); Иначе - ТекстЗапроса = " - |ВЫБРАТЬ РАЗЛИЧНЫЕ + ШаблонТекстаТаблица = "ПланОбмена.%1"; + ИмяПланаОбменаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаТаблица, ИмяПланаОбмена); + + ШаблонТекстаПоле = "ШапкаПланаОбмена.%1"; + ИмяРеквизитаФлагаСтрокой = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаПоле, ИмяРеквизитаФлага); + + ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ШапкаПланаОбмена.Ссылка КАК Узел |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ШапкаПланаОбмена - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз - |ПО - | ШапкаПланаОбмена.Ссылка = СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы - | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &Объект + | &ИмяПланаОбмена КАК ШапкаПланаОбмена + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз + | ПО ШапкаПланаОбмена.Ссылка = СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы + | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &Объект |ГДЕ - | НЕ ШапкаПланаОбмена.ЭтотУзел - | И ШапкаПланаОбмена.[ИмяРеквизитаФлага] = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости) + | НЕ ШапкаПланаОбмена.ЭтотУзел + | И &ИмяРеквизитаФлага = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости) | И НЕ ШапкаПланаОбмена.ПометкаУдаления - | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &Объект - |"; + | И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &Объект"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаФлага]", ИмяРеквизитаФлага); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяПланаОбмена", ИмяПланаОбменаСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРеквизитаФлага", ИмяРеквизитаФлагаСтрокой); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -2016,17 +2034,16 @@ КонецЕсли; - ТекстЗапроса = " - |ВЫБРАТЬ - | [СвойстваОбъектаСтрокой] + ТекстЗапроса = + "ВЫБРАТЬ + | &СвойстваОбъектаСтрокой |ИЗ - | [ОбъектМетаданныхИмя] КАК Таблица + | &ОбъектМетаданныхИмя КАК Таблица |ГДЕ - | Таблица.Ссылка = &Ссылка - |"; + | Таблица.Ссылка = &Ссылка"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[СвойстваОбъектаСтрокой]", СвойстваОбъектаСтрокой); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ОбъектМетаданныхИмя]", ОбъектМетаданныхИмя); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СвойстваОбъектаСтрокой", СвойстваОбъектаСтрокой); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОбъектМетаданныхИмя", ОбъектМетаданныхИмя); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -2220,6 +2237,9 @@ КонецФункции +// Возвращаемое значение: +// ТаблицаЗначений - таблица правил регистрации для текущего плана обмена. +// Функция ПравилаРегистрацииОбъектовПланаОбмена(Знач ИмяПланаОбмена) Экспорт Возврат ОбменДаннымиПовтИсп.ПравилаРегистрацииОбъектовПланаОбмена(ИмяПланаОбмена); @@ -2281,11 +2301,11 @@ // Создает набор записей для регистра. // // Параметры: -// ОбъектМетаданных регистра - для получения набора записей. +// ОбъектМетаданных регистра - для получения набора записей. // // Возвращаемое значение: -// НаборЗаписей. В случае если для объекта метаданных не предусмотрено набора записей -// вызывается исключение. +// НаборЗаписей - в случае если для объекта метаданных не предусмотрено набора записей +// вызывается исключение. // Функция НаборЗаписейПоТипу(ОбъектМетаданных) @@ -2873,7 +2893,7 @@ // Источник - объект информационной базы (СправочникОбъект, ДокументОбъект, ПланВидовХарактеристикОбъект и пр.) // который является источником данных для заполнения. // -// Приемник (обязательный) - объект информационной базы (СправочникОбъект, ДокументОбъект, +// Приемник - объект информационной базы (СправочникОбъект, ДокументОбъект, // ПланВидовХарактеристикОбъект и пр.) который будет заполнен данными источника. // // СписокСвойств - Строка - список свойств объекта и табличных частей, разделенных запятыми. @@ -3142,11 +3162,11 @@ // Получает строку, содержащую ключи структуры, разделенные символом разделителя. // // Параметры: -// Структура - Структура - структура, ключи которой преобразуются в строку. -// Разделитель - Строка - разделитель, который вставляется в строку между ключами структуры. +// Структура - Структура - структура, ключи которой преобразуются в строку. +// Разделитель - Строка - разделитель, который вставляется в строку между ключами структуры. // // Возвращаемое значение: -// Строка - строка, содержащая ключи структуры разделенные разделителем. +// Строка - строка, содержащая ключи структуры разделенные разделителем. // Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт @@ -3425,10 +3445,10 @@ // Получает текущее значение набора записей в информационной базе. // // Параметры: -// Данные - набор записей регистров. +// Данные - набор записей регистров. // // Возвращаемое значение: -// НаборЗаписей - , содержащий текущее значение в информационной базе. +// НаборЗаписей - содержащий текущее значение в информационной базе. // Функция НаборЗаписей(Знач Данные) @@ -3641,9 +3661,9 @@ // общего модуля ДатыЗапретаИзменения.ПроверитьДатыЗапретаЗагрузкиДанных. // // Параметры: -// Объект - объект ссылочного типа для которого выполняется регистрация запрета. -// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен объект. -// СообщениеОбОшибке - Строка - подробное описание причины отказа от загрузки. +// Объект - объект ссылочного типа для которого выполняется регистрация запрета. +// УзелОбмена - ПланОбменаСсылка - узел информационной базы из которой получен объект. +// СообщениеОбОшибке - Строка - подробное описание причины отказа от загрузки. // Процедура ЗарегистрироватьЗапретЗагрузкиДанныхПоДате(ЭлементДанных, Отправитель, СообщениеОбОшибке) diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl index 96519008a..b09dd2fb6 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -352,7 +352,7 @@ // Отмечает, что переданные данные обновлены. // // Параметры: -// Данные - Ссылка +// Данные - ЛюбаяСсылка // - Массив // - НаборДанных - данные, по которым нужно зарегистрировать изменения. // - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: @@ -563,13 +563,13 @@ // - РегистрРасчетаНаборЗаписей // - ЛюбаяСсылка // - ДанныеФормыСтруктура - данные, которые нужно проанализировать. -// * МетаданныеОбъекта - ОбъектМетаданных - объект метаданных, соответствующий параметру Данные. -// * ПолноеИмя - Строка - полное имя объекта метаданных (см. метод ОбъектМетаданных.ПолноеИмя). -// * Отбор - ЛюбаяСсылка - если Данные - это ссылочный объект, то значение ссылки, +// * МетаданныеОбъекта - ОбъектМетаданных - объект метаданных, соответствующий параметру Данные. +// * ПолноеИмя - Строка - полное имя объекта метаданных (см. метод ОбъектМетаданных.ПолноеИмя). +// * Отбор - ЛюбаяСсылка - если Данные - это ссылочный объект, то значение ссылки, // если регистр подчиненный регистратору, - значение отбора по регистратору. // - Структура - если Данные - это независимый регистр сведений, то структура, соответствующая // установленным отборам по измерениям. -// * ЭтоНовый - Булево - если Данные - это ссылочный объект, то признак нового объекта. +// * ЭтоНовый - Булево - если Данные - это ссылочный объект, то признак нового объекта. // Для других типов - всегда Ложь. // Функция МетаданныеИОтборПоДанным(Данные, ДополнительныеПараметры = Неопределено) Экспорт @@ -679,7 +679,7 @@ // // Параметры: // ОсновныеПараметры - см. ОбновлениеИнформационнойБазы.ОсновныеПараметрыОтметкиКОбработке. -// Данные - Ссылка +// Данные - ЛюбаяСсылка // - Массив // - НаборЗаписей - данные, по которым нужно зарегистрировать изменения. // - ТаблицаЗначений - значения измерений независимого регистра сведений. Требования: @@ -865,9 +865,9 @@ // * ИмяВременнойТаблицы - Строка - параметр актуален для методов, создающих временные таблицы. Если имя не задано // (поведение по умолчанию), то временная таблица будет создана с именем, указанным // в описании каждого метода. -// * ДополнительныеИсточникиДанных - Соответствие - параметр актуален для методов, выбирающих регистраторы и ссылки -// для обработки. В ключах соответствия может быть только один из следующих -// видов данных: +// * ДополнительныеИсточникиДанных - Соответствие из КлючИЗначение - параметр актуален для методов, выбирающих +// регистраторы и ссылки для обработки. В ключах соответствия может быть только один +// из следующих видов данных: // 1. Пути к реквизитам шапки документа или реквизитам табличных частей, которые // участвуют в соединениях с другими таблицами (в т.ч. неявных соединениях при // обращении "через точку"). @@ -1219,14 +1219,14 @@ // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // // Возвращаемое значение: -// * ВыборкаИзРезультатаЗапроса - выборка регистраторов, которые нужно обработать, поля выборки: +// ВыборкаИзРезультатаЗапроса - выборка регистраторов, которые нужно обработать, поля выборки: // ** Регистратор - ДокументСсылка. // ** Период - Дата - дата документа, если передано полное имя документа, максимальный период по регистратору, // если полное имя документа не передано. // ** Проведен - Булево // - Неопределено - значение реквизита Проведен документа, если передано полное имя документа, // Неопределено - если имя документа не передано. -// * ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. +// ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. // Функция ВыбратьРегистраторыРегистраДляОбработки(Очередь, ПолноеИмяДокумента, ПолноеИмяРегистра, ДополнительныеПараметры = Неопределено) Экспорт @@ -1351,9 +1351,9 @@ // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // // Возвращаемое значение: -// * ВыборкаИзРезультатаЗапроса - выборка ссылок, которые нужно обработать, поля выборки: +// ВыборкаИзРезультатаЗапроса - выборка ссылок, которые нужно обработать, поля выборки: // ** Ссылка - ЛюбаяСсылка. -// * ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. +// ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. // Функция ВыбратьСсылкиДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено) Экспорт Если ДополнительныеПараметры = Неопределено Тогда @@ -1542,10 +1542,10 @@ // ДополнительныеПараметры - см. ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // // Возвращаемое значение: -// * ВыборкаИзРезультатаЗапроса - выборка значений измерений, которые нужно обработать, имена полей соответствует именам +// ВыборкаИзРезультатаЗапроса - выборка значений измерений, которые нужно обработать, имена полей соответствует именам // измерений регистра. Если по измерению не регистрировалась необходимость обработки, // то в выборке по этому измерению будет пустое значение. -// * ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. +// ТаблицаЗначений - данные, которые нужно обработать, имена колонок соответствуют именам измерений регистра. // Функция ВыбратьИзмеренияНезависимогоРегистраСведенийДляОбработки(Очередь, ПолноеИмяОбъекта, ДополнительныеПараметры = Неопределено) Экспорт Если ДополнительныеПараметры = Неопределено Тогда @@ -1755,9 +1755,9 @@ // - Неопределено - проверяется, завершена ли обработка в целом; // - Массив - проверяется, есть данные для обработки в списке очередей. // ПолноеИмяМетаданныеОбъекта - Строка -// - ОбъектМетаданных - полное имя обрабатываемого объекта или +// - ОбъектМетаданных - полное имя обрабатываемого объекта или // его метаданные. Например, "Документ.ПриходныйОрдерНаТовары" -// - Массив - массив полных имен объектов или объектов метаданных, +// - Массив - массив полных имен объектов или объектов метаданных, // в массиве не должно быть независимых регистров сведений. // Отбор - ЛюбаяСсылка // - Структура @@ -1823,9 +1823,9 @@ | ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА | ИЗ - | #ТаблицаОбъекта КАК #ИмяОбъекта + | #ТаблицаОбъекта КАК Таблица | ГДЕ - | #ИмяОбъекта.Ссылка = ТаблицаИзменений.Ссылка)"; + | Таблица.Ссылка = ТаблицаИзменений.Ссылка)"; Запрос.УстановитьПараметр("Ссылка", Отбор); @@ -1954,9 +1954,9 @@ // - Неопределено - проверяется, завершена ли обработка в целом; // - Массив - проверяется, есть ли данные для обработки в списке очередей. // ПолноеИмяМетаданныеОбъекта - Строка -// - ОбъектМетаданных - полное имя обрабатываемого объекта или +// - ОбъектМетаданных - полное имя обрабатываемого объекта или // его метаданные. Например, "Документ.ПриходныйОрдерНаТовары" -// - Массив - массив полных имен объектов или объектов метаданных, +// - Массив - массив полных имен объектов или объектов метаданных, // в массиве не должно быть независимых регистров сведений. // Отбор - ЛюбаяСсылка // - Структура @@ -2073,7 +2073,7 @@ Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); + МетаданныеОбъекта = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъекта); // ОбъектМетаданныхСправочник, ОбъектМетаданныхДокумент ИмяИзмеренияДляОтбора = ДополнительныеПараметры.ИмяИзмеренияДляОтбора; Если ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеОбъекта) Тогда @@ -2355,17 +2355,17 @@ ТекстЗапроса = СтрСоединить(МассивТекстовЗапросов, Соединитель); - Если ЕстьРегистры - И МассивТекстовЗапросов.Количество() > 1 Тогда - ТекстЗапроса = + Если ЕстьРегистры И МассивТекстовЗапросов.Количество() > 1 Тогда + ШаблонЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ВложенныйЗапрос.Ссылка КАК Ссылка |ПОМЕСТИТЬ #ИмяВременнойТаблицы |ИЗ - | (" + ТекстЗапроса + ") КАК ВложенныйЗапрос + | #ТекстЗапроса КАК ВложенныйЗапрос | |ИНДЕКСИРОВАТЬ ПО | Ссылка"; + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "#ТекстЗапроса", "(" + ТекстЗапроса + ")"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "//ПервыйЗапрос", ""); Иначе ТекстЗапроса = ТекстЗапроса + " @@ -3345,12 +3345,12 @@ // Возвращаемое значение: // ТаблицаЗначений: // * ИмяОбработчика - Строка -// * Статус - Перечисление.СтатусыОбработчиковОбновления +// * Статус - ПеречислениеСсылка.СтатусыОбработчиковОбновления // * ДлительностьОбработки - Число // * ИнформацияОбОшибке - Строка // * Версия - Строка // * ИмяБиблиотеки - Строка -// * РежимВыполнения - Перечисление.РежимыВыполненияОбработчиков +// * РежимВыполнения - ПеречислениеСсылка.РежимыВыполненияОбработчиков // * ОбластьДанных - Число // Функция ОбработчикиОбновления(Отбор = Неопределено) Экспорт @@ -3426,7 +3426,7 @@ // которые их обрабатывают на текущую версию. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - полное имя объекта. // * Значение - Массив из Строка - имена выполняемых обработчиков обновления. // @@ -3668,7 +3668,6 @@ Если ДополнительныеИсточникиРегистры.Количество() > 0 Тогда - ТекстЗапросаСоединениеСДопИсточникамиРегистрами = ""; УсловиеПоДопИсточникамРегистрам = "ИСТИНА"; ВременныеТаблицыЗаблокированныхДопИсточников = Новый Соответствие; @@ -3741,7 +3740,6 @@ Иначе МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРегистра); - ТекстЗапросаСоединениеСДопИсточниками = ""; УсловияПоДопИсточникамСсылкам = Новый Массив; ШаблонУсловияПоДопИсточникамСсылкам = " НЕ ИСТИНА В ( @@ -4095,8 +4093,8 @@ // ПараметрыПостроения - см. ПараметрыПостроенияВыборки // // Возвращаемое значение: -// * ВыборкаИзРезультатаЗапроса - в случае обычной выборки. -// * ТаблицаЗначений - в случае постраничной выборки. +// ВыборкаИзРезультатаЗапроса - в случае обычной выборки. +// ТаблицаЗначений - в случае постраничной выборки. // Функция ВыбратьДанныеДляОбработки(Запрос, ПараметрыПостроения) @@ -4564,9 +4562,6 @@ // Параметры - см. // ОбновлениеИнформационнойБазы.ДополнительныеПараметрыВыборкиДанныхДляОбработки. // -// Возвращаемое значение: -// Булево - Истина, если выборка многопоточная. -// Процедура ПроверитьПараметрыВыборки(Параметры) Если Не Параметры.ВыбиратьПорциями И ЭтоПостраничнаяВыборка(Параметры) Тогда @@ -4952,8 +4947,7 @@ // // Параметры: // Запросы - Массив - массив, в который добавляются тексты запросов. -// ВременныеТаблицы - Соответствие - где в ключе объект метаданных, а в значении имя соответствующей ему -// временной таблицы. +// ВременныеТаблицы - Соответствие // Процедура ДобавитьЗапросыУничтоженияВТ(Запросы, ВременныеТаблицы) @@ -4977,7 +4971,7 @@ // Тип - Строка - тип создаваемого значения. // // Возвращаемое значение: -// Соответствие, Произвольный - новое или найденное по ключу значение. +// Соответствие // Функция ЗначениеПоКлючу(Коллекция, Ключ, Тип = "Соответствие") @@ -5047,16 +5041,16 @@ // Текст запроса создания временной таблицы со ссылками, заблокированными по реквизитам табличных частей. // // Параметры: -// РеквизитыТЧ - Соответствие: +// РеквизитыТЧ - Соответствие из КлючИЗначение: // * Ключ - Строка - имя табличной части источника данных. -// * Значение - Соответствие: +// * Значение - Соответствие из КлючИЗначение: // ** Ключ - ОбъектМетаданных - объект метаданных, соответствующий типу источника данных. -// ** Значение - Соответствие: +// ** Значение - Соответствие из КлючИЗначение: // *** Ключ - Строка - имя реквизита табличной части источника данных. // *** Значение - Булево - Истина, как значение по умолчанию (не нужно, т.к. по сути - это множество). // ПолноеИмяОбъекта - Строка - полное имя обновляемого ссылочного объекта метаданных. // ПолноеИмяРегистра - Строка - полное имя обновляемого объекта метаданных регистра. -// ВременныеТаблицы - Соответствие: +// ВременныеТаблицы - Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - для которого создана временная таблица. // * Значение - Строка - имя временной таблицы. // @@ -5067,32 +5061,32 @@ ШаблонЗапроса = "ВЫБРАТЬ - | ТаблицаИзменений.%1 КАК Ссылка + | &Реквизит КАК Ссылка |ПОМЕСТИТЬ ЗаблокированныеПоТЧ |ИЗ - | %2.Изменения КАК ТаблицаИзменений + | &ТаблицаИзменений КАК ТаблицаИзменений |ГДЕ - | %3 + | &Условие |ИНДЕКСИРОВАТЬ ПО | Ссылка"; ШаблонУсловия = - "ИСТИНА В ( + "ИСТИНА В " + "( | ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА | ИЗ - | %1.%2 КАК ТЧДокумента%2 + | #Таблица КАК ТЧДокументаПолноеИмяОбъекта | ГДЕ - | ТаблицаИзменений.%3 = ТЧДокумента%2.Ссылка - | И (%4))"; + | &УсловиеПоПолюТаблицы + | И (&ТекстУсловийПоЗаблокированным))"; ШаблонУсловияПоЗаблокированным = - "ИСТИНА В ( + "ИСТИНА В " + "( | ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА | ИЗ - | %1 КАК %1 + | #Таблица КАК ВТЗаблокированоТаблица | ГДЕ - | %2)"; - ШаблонУсловияПоРеквизиту = "ТЧДокумента%1.%2 = %3.Ссылка"; + | &УсловиеПоЗаблокированным)"; + ШаблонУсловияПоРеквизиту = "ТЧДокумента%1.%2 = %3.Ссылка"; // @query-part РазделительУсловий = " | ИЛИ "; @@ -5134,26 +5128,25 @@ КонецЦикла; ТекстУсловийПоРеквизитам = СтрСоединить(УсловияПоРеквизитам, РазделительУсловийПоРеквизитам); - УсловиеПоЗаблокированным = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонУсловияПоЗаблокированным, - ТаблицаЗаблокированных, - ТекстУсловийПоРеквизитам); + УсловиеПоЗаблокированным = СтрЗаменить(ШаблонУсловияПоЗаблокированным, "#Таблица", ТаблицаЗаблокированных); + УсловиеПоЗаблокированным = СтрЗаменить(УсловиеПоЗаблокированным, "ВТЗаблокированоТаблица", ТаблицаЗаблокированных); + УсловиеПоЗаблокированным = СтрЗаменить(УсловиеПоЗаблокированным, "&УсловиеПоЗаблокированным", ТекстУсловийПоРеквизитам); УсловияПоЗаблокированным.Добавить(УсловиеПоЗаблокированным); КонецЦикла; ТекстУсловийПоЗаблокированным = СтрСоединить(УсловияПоЗаблокированным, РазделительУсловийПоЗаблокированным); - Условие = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонУсловия, - ПолноеИмяОбъекта, - ТабличнаяЧасть, - ПолеТаблицы, - ТекстУсловийПоЗаблокированным); + Условие = СтрЗаменить(ШаблонУсловия, "#Таблица", ПолноеИмяОбъекта + "." + ТабличнаяЧасть); + Условие = СтрЗаменить(Условие, "ТЧДокументаПолноеИмяОбъекта", "ТЧДокумента" + ТабличнаяЧасть); + Условие = СтрЗаменить(Условие, "&УсловиеПоПолюТаблицы", "ТаблицаИзменений." + ПолеТаблицы + " = ТЧДокумента"+ ТабличнаяЧасть + ".Ссылка"); + Условие = СтрЗаменить(Условие, "&ТекстУсловийПоЗаблокированным", ТекстУсловийПоЗаблокированным); Условия.Добавить(Условие); КонецЦикла; ТекстУсловий = СтрСоединить(Условия, РазделительУсловий); - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, - ПолеТаблицы, - Таблица, - ТекстУсловий); + + ТекстЗапроса = СтрЗаменить(ШаблонЗапроса, "&Реквизит", ПолеТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаИзменений", Таблица + ".Изменения"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Условие", ТекстУсловий); Возврат ТекстЗапроса; @@ -5163,7 +5156,7 @@ // // Параметры: // ПолноеИмяРегистра - Строка - полное имя обновляемого объекта метаданных регистра. -// ВременныеТаблицы - Соответствие: +// ВременныеТаблицы - Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - для которого создана временная таблица. // * Значение - Строка - имя временной таблицы. // @@ -5224,13 +5217,13 @@ // Текст условия запроса для исключения из обновления данных, заблокированных по реквизитам шапки объекта. // // Параметры: -// РеквизитыШапки - Соответствие: +// РеквизитыШапки - Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - объект метаданных, соответствующий типу источника данных. -// * Значение - Соответствие: +// * Значение - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя реквизита табличной части источника данных. // ** Значение - Булево - Истина, как значение по умолчанию (не нужно, т.к. по сути - это множество). // ПолноеИмяРегистра - Строка - полное имя обновляемого объекта метаданных регистра. -// ВременныеТаблицы - Соответствие: +// ВременныеТаблицы - Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - для которого создана временная таблица. // * Значение - Строка - имя временной таблицы. // diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl index 10005b66a..57f2013b9 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl @@ -41,7 +41,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "СтандартныеПодсистемы"; - Описание.Версия = "3.1.3.362"; + Описание.Версия = "3.1.4.96"; Описание.ИдентификаторИнтернетПоддержки = "SSL"; Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно"; Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0"; @@ -78,7 +78,7 @@ // См. ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновленияИнформационнойБазы. Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, - Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт + Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, Знач МонопольныйРежим) Экспорт ИнтеграцияПодсистемБСП.ПослеОбновленияИнформационнойБазы(ПредыдущаяВерсия, ТекущаяВерсия, ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим); diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl index bbc18a23f..328eb9f29 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -199,4 +199,49 @@ КонецПроцедуры +// Определяет настройки начального заполнения элементов +// +// Параметры: +// ПолноеИмяОбъекта - Строка - имя объекта, для которого вызывается заполнение. +// Настройки - Структура: +// * ПриНачальномЗаполненииЭлемента - Булево - если Истина, то для каждого элемента будет +// вызвана процедура индивидуального заполнения ПриНачальномЗаполненииЭлемента. +// * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. +// +Процедура ПриНастройкеНачальногоЗаполненияЭлементов(ПолноеИмяОбъекта, Настройки) Экспорт + +КонецПроцедуры + +// Вызывается при начальном заполнении объектов. +// +// Параметры: +// ПолноеИмяОбъекта - Строка - имя объекта, для которого вызывается заполнение. +// КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций. +// Элементы - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов объекта. +// ТабличныеЧасти - Структура - описание табличных частей объекта, где: +// * Ключ - Строка - имя табличной части; +// * Значение - ТаблицаЗначений - табличная часть в виде таблицы значений, структуру которой +// необходимо скопировать перед заполнением. Например: +// Элемент.Ключи = ТабличныеЧасти.Ключи.Скопировать(); +// ЭлементТЧ = Элемент.Ключи.Добавить(); +// ЭлементТЧ.ИмяКлюча = "Первичный"; +// +Процедура ПриНачальномЗаполненииЭлементов(ПолноеИмяОбъекта, КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт + +КонецПроцедуры + +// Вызывается при начальном заполнении создаваемого объекта. +// +// Параметры: +// ПолноеИмяОбъекта - Строка - имя объекта, для которого вызывается заполнение. +// Объект - заполняемый объект. +// Данные - СтрокаТаблицыЗначений - данные заполнения объекта. +// ДополнительныеПараметры - Структура: +// * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов. +// +Процедура ПриНачальномЗаполненииЭлемента(ПолноеИмяОбъекта, Объект, Данные, ДополнительныеПараметры) Экспорт + +КонецПроцедуры + + #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl index 321122856..811caa699 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебный/Module.bsl @@ -861,8 +861,6 @@ // Процедура ПеререгистрироватьДанныеДляОтложенногоОбновления() Экспорт - ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; - ОбрабатываемыеДанные = Новый Соответствие; ПараметрыИнициализированы = Ложь; Обработчики = ОбработчикиДляОтложеннойРегистрацииДанных(); @@ -1025,6 +1023,344 @@ КонецФункции +// Возвращает итерации обновления. +// +// Возвращаемое значение: +// Массив из см. ИтерацияОбновления +// +Функция ИтерацииОбновления() Экспорт + + ИмяОсновнойКонфигурации = Метаданные.Имя; + ИтерацияОбновлениеОсновнойПодсистемы = Неопределено; + + ИтерацииОбновления = Новый Массив; + ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); + Для каждого ИмяПодсистемы Из ОписанияПодсистем.Порядок Цикл + ОписаниеПодсистемы = ОписанияПодсистем.ПоИменам.Получить(ИмяПодсистемы); + Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда + Продолжить; + КонецЕсли; + Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); + + ИтерацияОбновления = ИтерацияОбновления(ОписаниеПодсистемы.Имя, ОписаниеПодсистемы.Версия, + ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(), ОписаниеПодсистемы.Имя = ИмяОсновнойКонфигурации); + ИтерацияОбновления.ИмяОсновногоСерверногоМодуля = ОписаниеПодсистемы.ОсновнойСерверныйМодуль; + ИтерацияОбновления.ОсновнойСерверныйМодуль = Модуль; + ИтерацияОбновления.ПредыдущаяВерсия = ВерсияИБ(ОписаниеПодсистемы.Имя); + ИтерацииОбновления.Добавить(ИтерацияОбновления); + + Модуль.ПриДобавленииОбработчиковОбновления(ИтерацияОбновления.Обработчики); + + Если ОписаниеПодсистемы.Имя = ИмяОсновнойКонфигурации Тогда + ИтерацияОбновлениеОсновнойПодсистемы = ИтерацияОбновления; + КонецЕсли; + + ПроверитьСвойстваОбработчиков(ИтерацияОбновления); + КонецЦикла; + + Если ИтерацияОбновлениеОсновнойПодсистемы = Неопределено И ИмяОсновнойКонфигурации = "БиблиотекаСтандартныхПодсистем" Тогда + ТекстСообщения = НСтр("ru = 'Файл поставки 1С:Библиотека стандартных подсистем не предназначен для создания + |информационных баз по шаблону. Перед использованием необходимо + |ознакомиться с документацией на ИТС (http://its.1c.ru/db/bspdoc)'"); + ВызватьИсключение ТекстСообщения; + КонецЕсли; + + Возврат ИтерацииОбновления; + +КонецФункции + +// Обновляет список выполняемых обработчиков обновления в регистрах сведений +// ОбработчикиОбновления и ОбработчикиОбновленияОбщихДанных. +// +Процедура ОбновитьСписокВыполняемыхОбработчиковОбновления(ИтерацииОбновления, ПервыйОбменВРИБ = Ложь) Экспорт + + СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + НезавершенныеОтложенныеОбработчики = НезавершенныеОтложенныеОбработчики(СведенияОбОбновлении); + НачатьТранзакцию(); + Попытка + + СброситьСведенияОбОбновлении(СведенияОбОбновлении); + + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + НаборРазделенныхОбработчиков = РегистрыСведений.ОбработчикиОбновления.СоздатьНаборЗаписей(); + НаборРазделенныхОбработчиков.Записать(); + КонецЕсли; + Если Не ОбщегоНазначения.РазделениеВключено() Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + НаборНеразделенныхОбработчиков = РегистрыСведений.ОбработчикиОбновленияОбщихДанных.СоздатьНаборЗаписей(); + НаборНеразделенныхОбработчиков.Записать(); + КонецЕсли; + + ПроверитьУникальностьИдентификаторовОтложенныхОбработчиков(ИтерацииОбновления); + + ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; + ГруппаОбновления = 1; + ТекстОшибок = ""; + ДобавленныеОбработчики = Новый Массив; + Для Каждого ИтерацияОбновления Из ИтерацииОбновления Цикл + + // Добавление монопольных и оперативных обработчиков обновления. + ИмяБиблиотеки = ИтерацияОбновления.Подсистема; + Если Не ПервыйОбменВРИБ Тогда + ПредыдущаяВерсия = ИтерацияОбновления.ПредыдущаяВерсия; + ВерсияМетаданных = ИтерацияОбновления.Версия; + Если ПустаяСтрока(ВерсияМетаданных) Тогда + ВерсияМетаданных = "0.0.0.0"; + КонецЕсли; + + ОбработчикиПоВерсиям = Неопределено; + Если ПредыдущаяВерсия <> "0.0.0.0" + И ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбработчикиПоВерсиям = ПолучитьПланОбновления(ИтерацияОбновления.Подсистема, ПредыдущаяВерсия, ВерсияМетаданных); + КонецЕсли; + + Если ОбработчикиПоВерсиям = Неопределено Тогда + ОбработчикиПоВерсиям = ОбработчикиОбновленияВИнтервале(ИтерацияОбновления.Обработчики, + ПредыдущаяВерсия, ИтерацияОбновления.Версия); + КонецЕсли; + + Если ОбработчикиПоВерсиям.Строки.Количество() <> 0 Тогда + ОбработчикиПоВерсиям.Колонки.Процедура.Имя = "ИмяОбработчика"; + ДобавитьОбработчики(ИмяБиблиотеки, ОбработчикиПоВерсиям.Строки, ДобавленныеОбработчики); + КонецЕсли; + КонецЕсли; + + // Добавление отложенных обработчиков обновления. + Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + // Обработка сценария получения первого сообщения обмена от подчиненного узла после обновления. + ПредыдущаяВерсия = ?(ПервыйОбменВРИБ, "1.0.0.0", ИтерацияОбновления.ПредыдущаяВерсия); + РежимВыполненияОтложенныхОбработчиков = ОписанияБиблиотек[ИмяБиблиотеки].РежимВыполненияОтложенныхОбработчиков; + ПараллельноСВерсии = ОписанияБиблиотек[ИмяБиблиотеки].ПараллельноеОтложенноеОбновлениеСВерсии; + Если ПервыйОбменВРИБ И РежимВыполненияОтложенныхОбработчиков = "Последовательно" Тогда + Продолжить; + КонецЕсли; + + ПараметрыОтбора = ПараметрыОтбораОбработчиков(); + ПараметрыОтбора.ПолучатьРазделенные = Истина; + ПараметрыОтбора.РежимОбновления = "Отложенно"; + ПараметрыОтбора.УчитыватьПервыйОбменВРИБ = (РежимВыполненияОтложенныхОбработчиков = "Параллельно"); + ПараметрыОтбора.ПервыйОбменВРИБ = ПервыйОбменВРИБ; + + ОбработчикиПоВерсиям = ОбработчикиОбновленияВИнтервале(ИтерацияОбновления.Обработчики, + ПредыдущаяВерсия, ИтерацияОбновления.Версия, ПараметрыОтбора); + ОбработчикиПоВерсиям.Колонки.Процедура.Имя = "ИмяОбработчика"; + ДобавитьНезавершенныеОтложенныеОбработчики( + ИтерацияОбновления, + ИмяБиблиотеки, + НезавершенныеОтложенныеОбработчики, + ОбработчикиПоВерсиям.Строки); + + Если ПервыйОбменВРИБ Тогда + УдаляемыеСтроки = Новый Массив; + Для Каждого СтрокаВерсия Из ОбработчикиПоВерсиям.Строки Цикл + Если СтрокаВерсия.Версия = "*" + Или (ЗначениеЗаполнено(ПараллельноСВерсии) + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СтрокаВерсия.Версия, ПараллельноСВерсии) < 0) Тогда + УдаляемыеСтроки.Добавить(СтрокаВерсия); + КонецЕсли; + КонецЦикла; + + Для Каждого УдаляемаяСтрока Из УдаляемыеСтроки Цикл + ОбработчикиПоВерсиям.Строки.Удалить(УдаляемаяСтрока); + КонецЦикла; + КонецЕсли; + + Если ОбработчикиПоВерсиям.Строки.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + УпорядочитьВерсииОбработчиков(ОбработчикиПоВерсиям); + + ДобавитьОтложенныеОбработчики(ИмяБиблиотеки, ОбработчикиПоВерсиям.Строки, ГруппаОбновления, ТекстОшибок); + КонецЕсли; + + КонецЦикла; + + Если ЗначениеЗаполнено(ТекстОшибок) Тогда + ВызватьИсключение ТекстОшибок; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Вызывается для включения и отключении отложенного обновления. +// +// Параметры: +// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. +// +Процедура ПриВключенииОтложенногоОбновления(Использование) Экспорт + + ОтборЗаданий = Новый Структура; + ОтборЗаданий.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); + Задания = РегламентныеЗаданияСервер.НайтиЗадания(ОтборЗаданий); + + Для Каждого Задание Из Задания Цикл + Если Задание.Использование = Использование Тогда + Продолжить; + КонецЕсли; + + ПараметрыЗадания = Новый Структура("Использование", Использование); + + ТребуетсяУстановитьЗапланированныйМоментЗапуска = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда + МодульТехнологияСервиса = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервиса"); + ВерсияБиблиотекиБТС = МодульТехнологияСервиса.ВерсияБиблиотеки(); + ТребуетсяУстановитьЗапланированныйМоментЗапуска = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБиблиотекиБТС, "2.0.1.0") > 0; + КонецЕсли; + + Если ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") + И Использование + И ТребуетсяУстановитьЗапланированныйМоментЗапуска Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + ЗапланированныйМоментЗапуска = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ЗапланированныйМоментЗапускаОбновленияОбласти(); + ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ЗапланированныйМоментЗапуска); + КонецЕсли; + + РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, ПараметрыЗадания); + КонецЦикла; + +КонецПроцедуры + +// Выполняет оперативные и монопольные обработчики обновления +// по переданной итерации обновления. +// +Функция ВыполнитьИтерациюОбновления(Знач ИтерацияОбновления, Знач Параметры) Экспорт + + ИдентификаторБиблиотеки = ИтерацияОбновления.Подсистема; + ВерсияМетаданныхИБ = ИтерацияОбновления.Версия; + ОбработчикиОбновления = ИтерацияОбновления.Обработчики; + + ТекущаяВерсияИБ = ИтерацияОбновления.ПредыдущаяВерсия; + + НоваяВерсияИБ = ТекущаяВерсияИБ; + ВерсияМетаданных = ВерсияМетаданныхИБ; + Если ПустаяСтрока(ВерсияМетаданных) Тогда + ВерсияМетаданных = "0.0.0.0"; + КонецЕсли; + + Если ТекущаяВерсияИБ <> "0.0.0.0" + И ОбщегоНазначения.РазделениеВключено() + И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда + + // Получение списка обработчиков сформированного на этапе выполнения неразделенных обработчиков. + ВыполняемыеОбработчики = ПолучитьПланОбновления(ИдентификаторБиблиотеки, ТекущаяВерсияИБ, ВерсияМетаданных); + Если ВыполняемыеОбработчики = Неопределено Тогда + Если ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда + ШаблонСообщения = НСтр("ru = 'Не существует план обновления конфигурации %1 с версии %2 на версию %3'"); + Иначе + ШаблонСообщения = НСтр("ru = 'Не существует план обновления библиотеки %1 с версии %2 на версию %3'"); + КонецЕсли; + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ИдентификаторБиблиотеки, ТекущаяВерсияИБ, ВерсияМетаданных); + ЗаписатьИнформацию(Сообщение); + + ВыполняемыеОбработчики = ОбработчикиОбновленияВИнтервале(ОбработчикиОбновления, ТекущаяВерсияИБ, ВерсияМетаданных); + КонецЕсли; + Иначе + ВыполняемыеОбработчики = ОбработчикиОбновленияВИнтервале(ОбработчикиОбновления, ТекущаяВерсияИБ, ВерсияМетаданных); + КонецЕсли; + + ОбязательныеРазделенныеОбработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + ИсходнаяВерсияИБ = ТекущаяВерсияИБ; + ЗаписыватьВЖурнал = Константы.ДетализироватьОбновлениеИБВЖурналеРегистрации.Получить(); + + Для Каждого Версия Из ВыполняемыеОбработчики.Строки Цикл + + Если Версия.Версия = "*" Тогда + Сообщение = НСтр("ru = 'Выполняются обязательные процедуры обновления информационной базы.'"); + Иначе + НоваяВерсияИБ = Версия.Версия; + Если ТекущаяВерсияИБ = "0.0.0.0" Тогда + Сообщение = НСтр("ru = 'Выполняется начальное заполнение данных.'"); + ИначеЕсли ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется обновление информационной базы с версии %1 на версию %2.'"), + ТекущаяВерсияИБ, НоваяВерсияИБ); + Иначе + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется обновление данных библиотеки %3 с версии %1 на версию %2.'"), + ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); + КонецЕсли; + КонецЕсли; + ЗаписатьИнформацию(Сообщение); + + Для Каждого Обработчик Из Версия.Строки Цикл + + ПараметрыОбработчика = Неопределено; + Если Обработчик.ВерсияРегистрации = "*" Тогда + + Если Обработчик.УправлениеОбработчиками Тогда + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("РазделенныеОбработчики", ОбязательныеРазделенныеОбработчики); + КонецЕсли; + + Если Обработчик.МонопольныйРежим = Истина Или Обработчик.РежимВыполнения = "Монопольно" Тогда + Если Параметры.ОперативноеОбновление Тогда + // Проверки выполняются в ВозможноОперативноеОбновление, а само обновление для таких + // обработчиков выполняется только при неоперативном обновлении. + Продолжить; + КонецЕсли; + + Если ПараметрыОбработчика = Неопределено Тогда + ПараметрыОбработчика = Новый Структура; + КонецЕсли; + ПараметрыОбработчика.Вставить("МонопольныйРежим", Истина); + КонецЕсли; + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ЗаписыватьВЖурнал", ЗаписыватьВЖурнал); + ДополнительныеПараметры.Вставить("ИдентификаторБиблиотеки", ИдентификаторБиблиотеки); + ДополнительныеПараметры.Вставить("ХодВыполненияОбработчиков", Параметры.ХодВыполненияОбработчиков); + ДополнительныеПараметры.Вставить("ВФоне", Параметры.ВФоне); + + ВыполнитьОбработчикОбновления(Обработчик, ПараметрыОбработчика, ДополнительныеПараметры); + КонецЦикла; + + Если Версия.Версия = "*" Тогда + Сообщение = НСтр("ru = 'Выполнены обязательные процедуры обновления информационной базы.'"); + Иначе + Если ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполнено обновление информационной базы с версии %1 на версию %2.'"), + ТекущаяВерсияИБ, НоваяВерсияИБ); + Иначе + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполнено обновление данных библиотеки %3 с версии %1 на версию %2.'"), + ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); + КонецЕсли; + КонецЕсли; + ЗаписатьИнформацию(Сообщение); + + Если Версия.Версия <> "*" Тогда + // Установка номера версии информационной базы. + УстановитьВерсиюИБ(ИдентификаторБиблиотеки, НоваяВерсияИБ, ИтерацияОбновления.ЭтоОсновнаяКонфигурация); + ТекущаяВерсияИБ = НоваяВерсияИБ; + КонецЕсли; + + КонецЦикла; + + // Установка номера версии информационной базы. + Если ВерсияИБ(ИдентификаторБиблиотеки) <> ВерсияМетаданныхИБ Тогда + УстановитьВерсиюИБ(ИдентификаторБиблиотеки, ВерсияМетаданныхИБ, ИтерацияОбновления.ЭтоОсновнаяКонфигурация); + КонецЕсли; + + Если ТекущаяВерсияИБ <> "0.0.0.0" Тогда + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.СформироватьПланОбновленияОбластиДанных(ИдентификаторБиблиотеки, ОбработчикиОбновления, + ОбязательныеРазделенныеОбработчики, ИсходнаяВерсияИБ, ВерсияМетаданныхИБ); + + КонецЕсли; + + КонецЕсли; + + Возврат ВыполняемыеОбработчики; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. @@ -1037,11 +1373,7 @@ КонецПроцедуры -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок -// -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ДанныеОбработанныеВЦентральномУзлеРИБ.ПолноеИмя()); @@ -1150,11 +1482,7 @@ КонецПроцедуры -// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда @@ -1172,21 +1500,15 @@ КонецПроцедуры -// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов -// -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ОтложенноеОбновлениеИБ"); КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1262,7 +1584,7 @@ КонецПроцедуры -// Вызывается при выполнении скрипта обновления из процедуры ОбновлениеКонфигурации.ЗавершитьОбновление(). +// Вызывается при выполнении скрипта обновления из процедуры ОбновлениеКонфигурации.ЗавершитьОбновление. Процедура ПослеЗавершенияОбновления() Экспорт ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); @@ -1337,7 +1659,11 @@ НастройкиЗаполненияЭлементов.Вставить("ДополнительныеПараметры", Новый Структура); НастройкиЗаполненияЭлементов.ДополнительныеПараметры.Вставить("ПредопределенныеДанные", ПредопределенныеДанные); + ПолноеИмяОбъекта = МенеджерОбъекта.ПустаяСсылка().Метаданные().ПолноеИмя(); + МенеджерОбъекта.ПриНастройкеНачальногоЗаполненияЭлементов(НастройкиЗаполненияЭлементов); + ОбновлениеИнформационнойБазыПереопределяемый.ПриНастройкеНачальногоЗаполненияЭлементов(ПолноеИмяОбъекта, + НастройкиЗаполненияЭлементов); Возврат НастройкиЗаполненияЭлементов; @@ -1345,7 +1671,7 @@ Функция ПредопределенныеДанныеОбъекта(Знач МетаданныеОбъекта, МенеджерОбъекта, ЛокализуемыеРеквизитыОбъекта) Экспорт - Языки = МультиязычностьСервер.ЯзыкиКонфигурации(); + Языки = СтандартныеПодсистемыСервер.ЯзыкиКонфигурации(); // Таблица с предопределенными данными ПредопределенныеДанные = Новый ТаблицаЗначений; @@ -1379,6 +1705,8 @@ КонецЕсли; МенеджерОбъекта.ПриНачальномЗаполненииЭлементов(Языки, ПредопределенныеДанные, ТабличныеЧасти); + ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлементов(МетаданныеОбъекта.ПолноеИмя(), Языки, ПредопределенныеДанные, ТабличныеЧасти); + Возврат ПредопределенныеДанные; КонецФункции @@ -1388,14 +1716,24 @@ Процедура НачальноеЗаполнениеПредопределенныхДанных(ОбновитьМультиязычныеСтроки = Ложь) Экспорт ОбъектыСНачальнымЗаполнением = ОбъектыСНачальнымЗаполнением(); - Языки = МультиязычностьСервер.ЯзыкиКонфигурации(); - СведенияОбЯзыках = МультиязычностьСервер.СведенияОбЯзыках(); + ПараметрыЗаполнения = Новый Структура; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриПолученииПараметровЗаполненияПредопределенныхДанных(ПараметрыЗаполнения); + КонецЕсли; Для Каждого МетаданныеОбъекта Из ОбъектыСНачальнымЗаполнением Цикл - ЛокализуемыеРеквизитыОбъекта = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(МетаданныеОбъекта); - МультиязычныеСтрокиВРеквизитах = МультиязычностьСервер.МультиязычныеСтрокиВРеквизитах(МетаданныеОбъекта); - + ЛокализуемыеРеквизитыОбъекта = Новый Соответствие; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ПриПолученииПараметровЗаполненияОбъекта(МетаданныеОбъекта, ПараметрыЗаполнения); + ЛокализуемыеРеквизитыОбъекта = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(МетаданныеОбъекта); + КонецЕсли; + + ПараметрыЗаполнения.Вставить("ЛокализуемыеРеквизитыОбъекта", ЛокализуемыеРеквизитыОбъекта); МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеОбъекта.ПолноеИмя()); ПредопределенныеДанные = ПредопределенныеДанныеОбъекта(МетаданныеОбъекта, МенеджерОбъекта, ЛокализуемыеРеквизитыОбъекта); НастройкиПредопределенныхЭлементов = НастройкиПредопределенныхЭлементов(МенеджерОбъекта, ПредопределенныеДанные); @@ -1464,44 +1802,19 @@ КонецЕсли; КонецЕсли; - - Если ЛокализуемыеРеквизитыОбъекта.Количество() > 0 Тогда - Если МультиязычныеСтрокиВРеквизитах Тогда - - Если ЗначениеЗаполнено(СведенияОбЯзыках.ОсновнойЯзык) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.ОсновнойЯзык]; - КонецЦикла; - КонецЕсли; - - Если ЗначениеЗаполнено(СведенияОбЯзыках.Язык1) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык1"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.Язык1]; - КонецЦикла; - КонецЕсли; - - Если ЗначениеЗаполнено(СведенияОбЯзыках.Язык2) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык2"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + СведенияОбЯзыках.Язык2]; - КонецЦикла; - КонецЕсли; - - ИначеЕсли НЕ (ПоддерживаетсяИерархия И ЗаполняемыйЭлемент.ЭтоГруппа) Тогда - - Для каждого КодЯзыка Из Языки Цикл - НовоеПредставление = ЗаполняемыйЭлемент.Представления.Добавить(); - НовоеПредставление.КодЯзыка = КодЯзыка; - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - Значение = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; - НовоеПредставление[ИмяЛокализуемогоРеквизита.Ключ] = ?(ЗначениеЗаполнено(Значение), Значение, СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ]); - КонецЦикла; - КонецЦикла; - - КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.НачальноеЗаполнениеПредопределенныхДанныхЛокализуемыеРеквизиты( + ЗаполняемыйЭлемент, ПоддерживаетсяИерархия, СтрокаТаблицы, ПараметрыЗаполнения); КонецЕсли; Если Не ОбновитьМультиязычныеСтроки И НастройкиПредопределенныхЭлементов.ПриНачальномЗаполненииЭлемента Тогда + МенеджерОбъекта.ПриНачальномЗаполненииЭлемента(ЗаполняемыйЭлемент, СтрокаТаблицы, НастройкиПредопределенныхЭлементов.ДополнительныеПараметры); + ОбновлениеИнформационнойБазыПереопределяемый.ПриНачальномЗаполненииЭлемента(МетаданныеОбъекта.ПолноеИмя(), + ЗаполняемыйЭлемент, СтрокаТаблицы, НастройкиПредопределенныхЭлементов.ДополнительныеПараметры); + КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ЗаполняемыйЭлемент); @@ -1644,7 +1957,7 @@ КонецФункции -Функция ВыполнитьДействияПриОбновленииИнформационнойБазы(ПараметрыОбновления, ДополнительныеПараметры) +Процедура ВыполнитьДействияПриОбновленииИнформационнойБазы(ПараметрыОбновления, ДополнительныеПараметры) Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда // Установка привилегированного режима для возможности обновления ИБ в модели сервиса, @@ -1725,7 +2038,7 @@ ВызватьИсключение; КонецПопытки; -КонецФункции +КонецПроцедуры Процедура ВыполнитьДействияПослеОбновленияИнформационнойБазы(ДополнительныеПараметры) @@ -1815,105 +2128,6 @@ КонецПроцедуры -Процедура ОбновитьСписокВыполняемыхОбработчиковОбновления(ИтерацииОбновления, ПервыйОбменВРИБ = Ложь) - - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - НезавершенныеОтложенныеОбработчики = НезавершенныеОтложенныеОбработчики(СведенияОбОбновлении); - НачатьТранзакцию(); - Попытка - - СброситьСведенияОбОбновлении(СведенияОбОбновлении); - - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - НаборРазделенныхОбработчиков = РегистрыСведений.ОбработчикиОбновления.СоздатьНаборЗаписей(); - НаборРазделенныхОбработчиков.Записать(); - КонецЕсли; - Если Не ОбщегоНазначения.РазделениеВключено() Или Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - НаборНеразделенныхОбработчиков = РегистрыСведений.ОбработчикиОбновленияОбщихДанных.СоздатьНаборЗаписей(); - НаборНеразделенныхОбработчиков.Записать(); - КонецЕсли; - - ПроверитьУникальностьИдентификаторовОтложенныхОбработчиков(ИтерацииОбновления); - - ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; - ГруппаОбновления = 1; - ТекстОшибок = ""; - ДобавленныеОбработчики = Новый Массив; - Для Каждого ИтерацияОбновления Из ИтерацииОбновления Цикл - - // Добавление монопольных и оперативных обработчиков обновления. - ИмяБиблиотеки = ИтерацияОбновления.Подсистема; - Если Не ПервыйОбменВРИБ Тогда - ПредыдущаяВерсия = ИтерацияОбновления.ПредыдущаяВерсия; - ВерсияМетаданных = ИтерацияОбновления.Версия; - Если ПустаяСтрока(ВерсияМетаданных) Тогда - ВерсияМетаданных = "0.0.0.0"; - КонецЕсли; - - ОбработчикиПоВерсиям = Неопределено; - Если ПредыдущаяВерсия <> "0.0.0.0" - И ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбработчикиПоВерсиям = ПолучитьПланОбновления(ИтерацияОбновления.Подсистема, ПредыдущаяВерсия, ВерсияМетаданных); - КонецЕсли; - - Если ОбработчикиПоВерсиям = Неопределено Тогда - ОбработчикиПоВерсиям = ОбработчикиОбновленияВИнтервале(ИтерацияОбновления.Обработчики, - ПредыдущаяВерсия, ИтерацияОбновления.Версия); - КонецЕсли; - - Если ОбработчикиПоВерсиям.Строки.Количество() <> 0 Тогда - ОбработчикиПоВерсиям.Колонки.Процедура.Имя = "ИмяОбработчика"; - ДобавитьОбработчики(ИмяБиблиотеки, ОбработчикиПоВерсиям.Строки, ДобавленныеОбработчики); - КонецЕсли; - КонецЕсли; - - // Добавление отложенных обработчиков обновления. - Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - // Обработка сценария получения первого сообщения обмена от подчиненного узла после обновления. - ПредыдущаяВерсия = ?(ПервыйОбменВРИБ, "1.0.0.0", ИтерацияОбновления.ПредыдущаяВерсия); - РежимВыполненияОтложенныхОбработчиков = ОписанияБиблиотек[ИмяБиблиотеки].РежимВыполненияОтложенныхОбработчиков; - ПараллельноСВерсии = ОписанияБиблиотек[ИмяБиблиотеки].ПараллельноеОтложенноеОбновлениеСВерсии; - Если ПервыйОбменВРИБ И РежимВыполненияОтложенныхОбработчиков = "Последовательно" Тогда - Продолжить; - КонецЕсли; - - ПараметрыОтбора = ПараметрыОтбораОбработчиков(); - ПараметрыОтбора.ПолучатьРазделенные = Истина; - ПараметрыОтбора.РежимОбновления = "Отложенно"; - ПараметрыОтбора.УчитыватьПервыйОбменВРИБ = (РежимВыполненияОтложенныхОбработчиков = "Параллельно"); - ПараметрыОтбора.ПервыйОбменВРИБ = ПервыйОбменВРИБ; - - ОбработчикиПоВерсиям = ОбработчикиОбновленияВИнтервале(ИтерацияОбновления.Обработчики, - ПредыдущаяВерсия, ИтерацияОбновления.Версия, ПараметрыОтбора); - ОбработчикиПоВерсиям.Колонки.Процедура.Имя = "ИмяОбработчика"; - ДобавитьНезавершенныеОтложенныеОбработчики( - ИтерацияОбновления, - ИмяБиблиотеки, - НезавершенныеОтложенныеОбработчики, - ОбработчикиПоВерсиям.Строки); - Если ОбработчикиПоВерсиям.Строки.Количество() = 0 Тогда - Продолжить; - КонецЕсли; - - УпорядочитьВерсииОбработчиков(ОбработчикиПоВерсиям); - - ДобавитьОтложенныеОбработчики(ИмяБиблиотеки, ОбработчикиПоВерсиям.Строки, ГруппаОбновления, ТекстОшибок); - КонецЕсли; - - КонецЦикла; - - Если ЗначениеЗаполнено(ТекстОшибок) Тогда - ВызватьИсключение ТекстОшибок; - КонецЕсли; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - // Возвращает признак разрешения использования многопоточного обновления. // Многопоточное обновление можно включить в ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек(). // @@ -2017,186 +2231,6 @@ КонецФункции -// Для внутреннего использования. -// -// Возвращаемое значение: -// Массив из см. ИтерацияОбновления -// -Функция ИтерацииОбновления() Экспорт - - ИмяОсновнойКонфигурации = Метаданные.Имя; - ИтерацияОбновлениеОсновнойПодсистемы = Неопределено; - - ИтерацииОбновления = Новый Массив; - ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем(); - Для каждого ИмяПодсистемы Из ОписанияПодсистем.Порядок Цикл - ОписаниеПодсистемы = ОписанияПодсистем.ПоИменам.Получить(ИмяПодсистемы); - Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда - Продолжить; - КонецЕсли; - Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); - - ИтерацияОбновления = ИтерацияОбновления(ОписаниеПодсистемы.Имя, ОписаниеПодсистемы.Версия, - ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(), ОписаниеПодсистемы.Имя = ИмяОсновнойКонфигурации); - ИтерацияОбновления.ИмяОсновногоСерверногоМодуля = ОписаниеПодсистемы.ОсновнойСерверныйМодуль; - ИтерацияОбновления.ОсновнойСерверныйМодуль = Модуль; - ИтерацияОбновления.ПредыдущаяВерсия = ВерсияИБ(ОписаниеПодсистемы.Имя); - ИтерацииОбновления.Добавить(ИтерацияОбновления); - - Модуль.ПриДобавленииОбработчиковОбновления(ИтерацияОбновления.Обработчики); - - Если ОписаниеПодсистемы.Имя = ИмяОсновнойКонфигурации Тогда - ИтерацияОбновлениеОсновнойПодсистемы = ИтерацияОбновления; - КонецЕсли; - - ПроверитьСвойстваОбработчиков(ИтерацияОбновления); - КонецЦикла; - - Если ИтерацияОбновлениеОсновнойПодсистемы = Неопределено И ИмяОсновнойКонфигурации = "БиблиотекаСтандартныхПодсистем" Тогда - ТекстСообщения = НСтр("ru = 'Файл поставки 1С:Библиотека стандартных подсистем не предназначен для создания - |информационных баз по шаблону. Перед использованием необходимо - |ознакомиться с документацией на ИТС (http://its.1c.ru/db/bspdoc)'"); - ВызватьИсключение ТекстСообщения; - КонецЕсли; - - Возврат ИтерацииОбновления; - -КонецФункции - -// Для внутреннего использования. -// -Функция ВыполнитьИтерациюОбновления(Знач ИтерацияОбновления, Знач Параметры) Экспорт - - ИдентификаторБиблиотеки = ИтерацияОбновления.Подсистема; - ВерсияМетаданныхИБ = ИтерацияОбновления.Версия; - ОбработчикиОбновления = ИтерацияОбновления.Обработчики; - - ТекущаяВерсияИБ = ИтерацияОбновления.ПредыдущаяВерсия; - - НоваяВерсияИБ = ТекущаяВерсияИБ; - ВерсияМетаданных = ВерсияМетаданныхИБ; - Если ПустаяСтрока(ВерсияМетаданных) Тогда - ВерсияМетаданных = "0.0.0.0"; - КонецЕсли; - - Если ТекущаяВерсияИБ <> "0.0.0.0" - И ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - - // Получение списка обработчиков сформированного на этапе выполнения неразделенных обработчиков. - ВыполняемыеОбработчики = ПолучитьПланОбновления(ИдентификаторБиблиотеки, ТекущаяВерсияИБ, ВерсияМетаданных); - Если ВыполняемыеОбработчики = Неопределено Тогда - Если ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда - ШаблонСообщения = НСтр("ru = 'Не существует план обновления конфигурации %1 с версии %2 на версию %3'"); - Иначе - ШаблонСообщения = НСтр("ru = 'Не существует план обновления библиотеки %1 с версии %2 на версию %3'"); - КонецЕсли; - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ИдентификаторБиблиотеки, ТекущаяВерсияИБ, ВерсияМетаданных); - ЗаписатьИнформацию(Сообщение); - - ВыполняемыеОбработчики = ОбработчикиОбновленияВИнтервале(ОбработчикиОбновления, ТекущаяВерсияИБ, ВерсияМетаданных); - КонецЕсли; - Иначе - ВыполняемыеОбработчики = ОбработчикиОбновленияВИнтервале(ОбработчикиОбновления, ТекущаяВерсияИБ, ВерсияМетаданных); - КонецЕсли; - - ОбязательныеРазделенныеОбработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); - ИсходнаяВерсияИБ = ТекущаяВерсияИБ; - ЗаписыватьВЖурнал = Константы.ДетализироватьОбновлениеИБВЖурналеРегистрации.Получить(); - - Для Каждого Версия Из ВыполняемыеОбработчики.Строки Цикл - - Если Версия.Версия = "*" Тогда - Сообщение = НСтр("ru = 'Выполняются обязательные процедуры обновления информационной базы.'"); - Иначе - НоваяВерсияИБ = Версия.Версия; - Если ТекущаяВерсияИБ = "0.0.0.0" Тогда - Сообщение = НСтр("ru = 'Выполняется начальное заполнение данных.'"); - ИначеЕсли ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется обновление информационной базы с версии %1 на версию %2.'"), - ТекущаяВерсияИБ, НоваяВерсияИБ); - Иначе - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполняется обновление данных библиотеки %3 с версии %1 на версию %2.'"), - ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); - КонецЕсли; - КонецЕсли; - ЗаписатьИнформацию(Сообщение); - - Для Каждого Обработчик Из Версия.Строки Цикл - - ПараметрыОбработчика = Неопределено; - Если Обработчик.ВерсияРегистрации = "*" Тогда - - Если Обработчик.УправлениеОбработчиками Тогда - ПараметрыОбработчика = Новый Структура; - ПараметрыОбработчика.Вставить("РазделенныеОбработчики", ОбязательныеРазделенныеОбработчики); - КонецЕсли; - - Если Обработчик.МонопольныйРежим = Истина Или Обработчик.РежимВыполнения = "Монопольно" Тогда - Если Параметры.ОперативноеОбновление Тогда - // Проверки выполняются в ВозможноОперативноеОбновление, а само обновление для таких - // обработчиков выполняется только при неоперативном обновлении. - Продолжить; - КонецЕсли; - - Если ПараметрыОбработчика = Неопределено Тогда - ПараметрыОбработчика = Новый Структура; - КонецЕсли; - ПараметрыОбработчика.Вставить("МонопольныйРежим", Истина); - КонецЕсли; - КонецЕсли; - - ДополнительныеПараметры = Новый Структура; - ДополнительныеПараметры.Вставить("ЗаписыватьВЖурнал", ЗаписыватьВЖурнал); - ДополнительныеПараметры.Вставить("ИдентификаторБиблиотеки", ИдентификаторБиблиотеки); - ДополнительныеПараметры.Вставить("ХодВыполненияОбработчиков", Параметры.ХодВыполненияОбработчиков); - ДополнительныеПараметры.Вставить("ВФоне", Параметры.ВФоне); - - ВыполнитьОбработчикОбновления(Обработчик, ПараметрыОбработчика, ДополнительныеПараметры); - КонецЦикла; - - Если Версия.Версия = "*" Тогда - Сообщение = НСтр("ru = 'Выполнены обязательные процедуры обновления информационной базы.'"); - Иначе - Если ИтерацияОбновления.ЭтоОсновнаяКонфигурация Тогда - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполнено обновление информационной базы с версии %1 на версию %2.'"), - ТекущаяВерсияИБ, НоваяВерсияИБ); - Иначе - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Выполнено обновление данных библиотеки %3 с версии %1 на версию %2.'"), - ТекущаяВерсияИБ, НоваяВерсияИБ, ИдентификаторБиблиотеки); - КонецЕсли; - КонецЕсли; - ЗаписатьИнформацию(Сообщение); - - Если Версия.Версия <> "*" Тогда - // Установка номера версии информационной базы. - УстановитьВерсиюИБ(ИдентификаторБиблиотеки, НоваяВерсияИБ, ИтерацияОбновления.ЭтоОсновнаяКонфигурация); - ТекущаяВерсияИБ = НоваяВерсияИБ; - КонецЕсли; - - КонецЦикла; - - // Установка номера версии информационной базы. - Если ВерсияИБ(ИдентификаторБиблиотеки) <> ВерсияМетаданныхИБ Тогда - УстановитьВерсиюИБ(ИдентификаторБиблиотеки, ВерсияМетаданныхИБ, ИтерацияОбновления.ЭтоОсновнаяКонфигурация); - КонецЕсли; - - Если ТекущаяВерсияИБ <> "0.0.0.0" Тогда - - Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.СформироватьПланОбновленияОбластиДанных(ИдентификаторБиблиотеки, ОбработчикиОбновления, - ОбязательныеРазделенныеОбработчики, ИсходнаяВерсияИБ, ВерсияМетаданныхИБ); - - КонецЕсли; - - КонецЕсли; - - Возврат ВыполняемыеОбработчики; - -КонецФункции - // Проверить права текущего пользователя на выполнение обновления информационной базы. Функция ЕстьПраваНаОбновлениеИнформационнойБазы(УчитыватьПривилегированныйРежим = Истина, РазделенныеДанные = Неопределено) Экспорт @@ -3001,48 +3035,6 @@ КонецПроцедуры -// Вызывается при включении и отключении отложенного обновления. -// -// Параметры: -// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. -// -Процедура ПриВключенииОтложенногоОбновления(Использование) Экспорт - - ОтборЗаданий = Новый Структура; - ОтборЗаданий.Вставить("Метаданные", Метаданные.РегламентныеЗадания.ОтложенноеОбновлениеИБ); - Задания = РегламентныеЗаданияСервер.НайтиЗадания(ОтборЗаданий); - - Для Каждого Задание Из Задания Цикл - Если Задание.Использование = Использование Тогда - Продолжить; - КонецЕсли; - - ПараметрыЗадания = Новый Структура("Использование", Использование); - - Если ОбщегоНазначения.РазделениеВключено() - И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") - И Использование Тогда - - МодульТехнологияСервиса = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервиса"); - ВерсияБиблиотекиБТС = МодульТехнологияСервиса.ВерсияБиблиотеки(); - ТребуетсяУстановитьЗапланированныйМоментЗапуска = ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБиблиотекиБТС, "2.0.1.0") > 0; - - Если ТребуетсяУстановитьЗапланированныйМоментЗапуска Тогда - - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - ЗапланированныйМоментЗапуска = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ЗапланированныйМоментЗапускаОбновленияОбласти(); - ПараметрыЗадания.Вставить("ЗапланированныйМоментЗапуска", ЗапланированныйМоментЗапуска); - - КонецЕсли; - - КонецЕсли; - - РегламентныеЗаданияСервер.ИзменитьЗадание(Задание.УникальныйИдентификатор, ПараметрыЗадания); - КонецЦикла; - -КонецПроцедуры - Функция ОбработчикиДляОтложеннойРегистрацииДанных(БезФильтра = Ложь) Экспорт Запрос = Новый Запрос; @@ -3860,8 +3852,8 @@ // СведенияОбОбновлении - см. СведенияОбОбновленииИнформационнойБазы // // Возвращаемое значение: -// * СтрокаТаблицыЗначений - см. НовоеОписаниеПотоков -// * Булево - Истина, если обработчик не нужно выполнять или Ложь, если выполнение обработчиков нужно завершить. +// СтрокаТаблицыЗначений - см. НовоеОписаниеПотоков +// Булево - Истина, если обработчик не нужно выполнять или Ложь, если выполнение обработчиков нужно завершить. // Функция ДобавитьПотокОбработчикаОтложенногоОбновления(СведенияОбОбновлении) @@ -4414,9 +4406,6 @@ // Поток - СтрокаТаблицыЗначений - описание потока (см. Потоки в НовоеОписаниеПотоков()). // ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы, если есть. // -// Возвращаемое значение: -// Булево - Истина - поток выполняется или выполнен, Ложь - поток не запущен или прерван. -// Процедура ВыполнитьПоток(Группы, Поток, ИдентификаторФормы = Неопределено) ОписаниеПотока = Группы[Поток.Группа]; @@ -4637,7 +4626,7 @@ // // Возвращаемое значение: // Структура: -// * Группы - Соответствие - описание групп потоков, где: +// * Группы - Соответствие из КлючИЗначение - описание групп потоков, где: // ** Ключ - Строка - имя группы. // ** Значение - см. НовоеОписаниеГруппыПотоков // * Потоки - ТаблицаЗначений - описание потоков со следующими колонками: @@ -4927,10 +4916,10 @@ // ПараметрыОбхода - см. ПараметрыОбходаДанныхДляОбновления // // Возвращаемое значение: -// * Структура - параметры обхода текущей итерации в виде структуры со следующими полями: +// Структура - параметры обхода текущей итерации в виде структуры со следующими полями: // ** СсылочныйОбъект - Строка - имя ссылочного объекта. // ** ТабличныйОбъект - Строка - имя табличного объекта. -// * Неопределено - если обход закончен. +// Неопределено - если обход закончен. // Функция ТекущиеПараметрыОбхода(ПараметрыОбхода) @@ -5167,7 +5156,7 @@ // Отметить, что найденную порцию данных нужно будет обрабатывать повторно. // // Параметры: -// Поток - СтрокаТаблицыЗначений - с колонками: +// Поток - СтрокаТаблицыЗначений: // * Наименование - Строка - произвольное наименование потока (используется в наименовании фонового задания). // * Группа - Строка - имя группы с описанием потока. // * ИдентификаторЗадания - УникальныйИдентификатор - уникальный идентификатор фонового задания. @@ -5266,7 +5255,7 @@ // КоличествоФрагментов - Число - количество фрагментов на которые нужно разбить данные. // // Возвращаемое значение: -// НаборПорций - см. НовыйНаборПорцийДляОбновления +// см. НовыйНаборПорцийДляОбновления // Функция РазбитьРезультатПоискаНаФрагменты(РезультатПоиска, Знач КоличествоФрагментов) @@ -5714,16 +5703,21 @@ ОбъектыКОбработке = Новый Массив; ШаблонаЗапроса = "ВЫБРАТЬ - | %1 + | &Поля |ИЗ - | %2 КАК Таблица + | #Таблица КАК Таблица |ГДЕ | Таблица.Предопределенный = ИСТИНА"; Для каждого ОбъектМетаданныхСЭлементами Из ОбъектыСПредопределеннымиЭлементами Цикл МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданныхСЭлементами.ПолноеИмя()); - ЛокализуемыеРеквизитыОбъекта = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданныхСЭлементами); + ЛокализуемыеРеквизитыОбъекта = Новый Соответствие; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + ЛокализуемыеРеквизитыОбъекта = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданныхСЭлементами); + КонецЕсли; + ПредопределенныеДанные = ПредопределенныеДанныеОбъекта(ОбъектМетаданныхСЭлементами, МенеджерОбъекта, ЛокализуемыеРеквизитыОбъекта); // Формируем запрос @@ -5739,7 +5733,10 @@ КонецЕсли; - МультиязычностьСервер.СформироватьИменаМультиязычныхРеквизитов(ИменаРеквизитовОбъекта, ЛокализуемыеРеквизитыОбъекта); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.СформироватьИменаМультиязычныхРеквизитов(ИменаРеквизитовОбъекта, ЛокализуемыеРеквизитыОбъекта); + КонецЕсли; Если ИменаРеквизитовОбъекта.Найти("ИмяПредопределенныхДанных") = Неопределено Тогда ИменаРеквизитовОбъекта.Добавить("ИмяПредопределенныхДанных"); @@ -5748,7 +5745,8 @@ ИменаРеквизитовОбъекта.Добавить("Ссылка"); КонецЕсли; - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонаЗапроса, СтрСоединить(ИменаРеквизитовОбъекта, ", " + Символы.ПС), ОбъектМетаданныхСЭлементами.ПолноеИмя()); + ТекстЗапроса = СтрЗаменить(ШаблонаЗапроса, "&Поля", СтрСоединить(ИменаРеквизитовОбъекта, ", " + Символы.ПС)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#Таблица", ОбъектМетаданныхСЭлементами.ПолноеИмя()); Запрос = Новый Запрос(ТекстЗапроса); РезультатЗапроса = Запрос.Выполнить(); @@ -5775,8 +5773,12 @@ ИначеЕсли ПараметрыРегистрации.РежимОбновления = "МультиязычныеСтроки" Тогда - Если МультиязычностьСервер.МультиязычныеСтрокиРеквизитовИзменены(ПоставляемыеСведения, ДанныеЗапроса, ЛокализуемыеРеквизитыОбъекта, ПараметрыРегистрации) Тогда - ОбъектыКОбработке.Добавить(ДанныеЗапроса.Ссылка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + Если МодульМультиязычностьСервер.МультиязычныеСтрокиРеквизитовИзменены( + ПоставляемыеСведения, ДанныеЗапроса, ЛокализуемыеРеквизитыОбъекта, ПараметрыРегистрации) Тогда + ОбъектыКОбработке.Добавить(ДанныеЗапроса.Ссылка); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -5797,7 +5799,10 @@ СсылкиНаОбъекты = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, ОбъектМетаданных.ПолноеИмя()); Если ОбновитьМультиязычныеСтроки Тогда - Результат = МультиязычностьСервер.ОбновитьМультиязычныеСтрокиПредопределенныхЭлементов(СсылкиНаОбъекты, ОбъектМетаданных); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + Результат = МодульМультиязычностьСервер.ОбновитьМультиязычныеСтрокиПредопределенныхЭлементов(СсылкиНаОбъекты, ОбъектМетаданных); + КонецЕсли; Иначе Результат = ОбновитьЭлементыПредопределенныхЭлементов(СсылкиНаОбъекты, ОбъектМетаданных) КонецЕсли; @@ -5838,7 +5843,12 @@ Продолжить; КонецЕсли; - ИмяРеквизитаБезСуффиксаЯзык= МультиязычностьСервер.ИмяРеквизитаБезСуффиксаЯзык(ИмяРеквизитаОбъекта); + ИмяРеквизитаБезСуффиксаЯзык= ИмяРеквизитаОбъекта; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + ИмяРеквизитаБезСуффиксаЯзык = МодульМультиязычностьСервер.ИмяРеквизитаБезСуффиксаЯзык(ИмяРеквизитаОбъекта); + КонецЕсли; + Если ЛокализуемыеРеквизитыОбъекта[ИмяРеквизитаБезСуффиксаЯзык] = Неопределено Тогда Если ТипЗнч(ПоставляемыеСведения[ИмяРеквизитаОбъекта]) = Тип("ТаблицаЗначений") @@ -5862,9 +5872,12 @@ Иначе - Если МультиязычностьСервер.МультиязычныеСтрокиРеквизитаИзменены(ПоставляемыеСведения, ДанныеЗапроса, - ИмяРеквизитаБезСуффиксаЯзык, ПараметрыРегистрации) Тогда - Возврат Истина; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + Если МодульМультиязычностьСервер.МультиязычныеСтрокиРеквизитаИзменены(ПоставляемыеСведения, ДанныеЗапроса, + ИмяРеквизитаБезСуффиксаЯзык, ПараметрыРегистрации) Тогда + Возврат Истина; + КонецЕсли; КонецЕсли; КонецЕсли; @@ -5881,8 +5894,13 @@ Результат.Вставить("ПроблемныхОбъектов", 0); Результат.Вставить("ОбъектовОбработано", 0); - ЛокализуемыеРеквизитыОбъекта = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(МетаданныеОбъекта); - МультиязычныеСтрокиВРеквизитах = МультиязычностьСервер.МультиязычныеСтрокиВРеквизитах(МетаданныеОбъекта); + ЛокализуемыеРеквизитыОбъекта = Новый Соответствие; + МультиязычныеСтрокиВРеквизитах = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + ЛокализуемыеРеквизитыОбъекта = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(МетаданныеОбъекта); + МультиязычныеСтрокиВРеквизитах = МодульМультиязычностьСервер.МультиязычныеСтрокиВРеквизитах(МетаданныеОбъекта); + КонецЕсли; МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеОбъекта.ПолноеИмя()); ПредопределенныеДанные = ПредопределенныеДанныеОбъекта(МетаданныеОбъекта, МенеджерОбъекта, ЛокализуемыеРеквизитыОбъекта); @@ -5952,8 +5970,10 @@ КонецЦикла; КонецЕсли; - Если ЛокализуемыеРеквизитыОбъекта.Количество() > 0 Тогда - ЗаполнитьЭлементыМультиязычнымиНачальнымиДанными(ЗаполняемыйЭлемент, ЛокализуемыеРеквизитыОбъекта, МультиязычныеСтрокиВРеквизитах, ПоддерживаетсяИерархия, СтрокаТаблицы); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.ЗаполнитьЭлементыМультиязычнымиНачальнымиДанными(ЗаполняемыйЭлемент, + ЛокализуемыеРеквизитыОбъекта, МультиязычныеСтрокиВРеквизитах, ПоддерживаетсяИерархия, СтрокаТаблицы); КонецЕсли; Если НастройкиПредопределенныхЭлементов.ПриНачальномЗаполненииЭлемента Тогда @@ -5984,49 +6004,7 @@ КонецФункции -Процедура ЗаполнитьЭлементыМультиязычнымиНачальнымиДанными(Знач ЗаполняемыйЭлемент, Знач ЛокализуемыеРеквизитыОбъекта, Знач МультиязычныеСтрокиВРеквизитах, Знач ПоддерживаетсяИерархия, Знач СтрокаТаблицы) - - Языки = МультиязычностьСервер.ЯзыкиКонфигурации(); - СведенияОбЯзыках = МультиязычностьСервер.СведенияОбЯзыках(); - - Если МультиязычныеСтрокиВРеквизитах Тогда - - КодЯзыка =СведенияОбЯзыках.ОсновнойЯзык;; - Если ЗначениеЗаполнено(КодЯзыка) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; - КонецЦикла; - КонецЕсли; - - КодЯзыка = СведенияОбЯзыках.Язык1; - Если ЗначениеЗаполнено(КодЯзыка) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык1"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; - КонецЦикла; - КонецЕсли; - - КодЯзыка = СведенияОбЯзыках.Язык2; - Если ЗначениеЗаполнено(КодЯзыка) Тогда - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - ЗаполняемыйЭлемент[ИмяЛокализуемогоРеквизита.Ключ + "Язык2"] = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; - КонецЦикла; - КонецЕсли; - - ИначеЕсли Не (ПоддерживаетсяИерархия И ЗаполняемыйЭлемент.ЭтоГруппа) Тогда - - Для каждого КодЯзыка Из Языки Цикл - ТаблицаПредставлений = ЗаполняемыйЭлемент.Представления; // ТаблицаЗначений - НовоеПредставление = ТаблицаПредставлений.Добавить(); - НовоеПредставление.КодЯзыка = КодЯзыка; - Для каждого ИмяЛокализуемогоРеквизита Из ЛокализуемыеРеквизитыОбъекта Цикл - Значение = СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ + "_" + КодЯзыка]; - НовоеПредставление[ИмяЛокализуемогоРеквизита.Ключ] = ?(ЗначениеЗаполнено(Значение), Значение, СтрокаТаблицы[ИмяЛокализуемогоРеквизита.Ключ]); - КонецЦикла; - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры +// Общие для начального заполнения // Общие для начального заполнения @@ -6037,8 +6015,14 @@ Возврат; КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + Иначе + Возврат; + КонецЕсли; + Для каждого Язык Из Языки Цикл - ПредопределенныеДанные.Колонки.Добавить(Реквизит.Имя + "_" + Язык, Реквизит.Тип, МультиязычностьСервер.ПризнакЛокализуемогоРеквизита()); + ПредопределенныеДанные.Колонки.Добавить(Реквизит.Имя + "_" + Язык, Реквизит.Тип, МодульМультиязычностьСервер.ПризнакЛокализуемогоРеквизита()); КонецЦикла; КонецПроцедуры @@ -6403,12 +6387,12 @@ // Параметры: // Обработчик - Неопределено // - СтрокаДереваЗначений -// - Структура: +// - Структура: // * РежимВыполнения - Строка // * ВерсияРегистрации - Строка // * Версия - Строка // Параметры - Неопределено -// - Структура: +// - Структура: // * Очередь - Произвольный // * ПрогрессВыполнения - Структура: // ** ОбработаноОбъектов - Число @@ -6983,8 +6967,9 @@ // Возвращает список разделов описания изменений системы. // // Возвращаемое значение: -// СписокЗначение - Значение - вес версии (число), -// Представление - строка версии. +// СписокЗначений: +// * Значение - Число - вес версии. +// * Представление - Строка - версии. // Функция РазделыОписанияИзменений() Экспорт @@ -7079,8 +7064,6 @@ Функция ВыполненыВсеОтложенныеОбработчики(СведенияОбОбновлении) - ВыполненоОбработчиков = 0; - ВсегоОбработчиков = 0; Запрос = Новый Запрос; Запрос.УстановитьПараметр("РежимВыполнения", Перечисления.РежимыВыполненияОбработчиков.Отложенно); Запрос.УстановитьПараметр("Статус", Перечисления.СтатусыОбработчиковОбновления.Выполнен); @@ -7721,8 +7704,6 @@ МодульОбменДаннымиСервер.СброситьЗначениеКонстантыСИзменениямиДляПодчиненногоУзлаРИБСФильтрами(); КонецЕсли; - ОбрабатываемыеДанные = Новый Соответствие; - ОписанияБиблиотек = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; ПараметрыИнициализированы = Ложь; Обработчики = ОбработчикиДляОтложеннойРегистрацииДанных(); @@ -7977,9 +7958,11 @@ ЗаписатьДетальнуюИнформациюОХодеОбновления(КонтекстОбработчика.ДетальноеОписаниеОбработчика); КонецЕсли; + // АПК:325-выкл откат незакрытых транзакций после выполнения обработчика. Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; + // АПК:325-вкл ДобавляемоеЧислоПопыток = ДобавляемоеЧислоПопыток(ОбработчикОбновления, КонтекстОбработчика, Истина); ЧислоПопыток = ОбработчикОбновления.ЧислоПопыток + ДобавляемоеЧислоПопыток; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl index 404dcf8e4..723095680 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl @@ -12,8 +12,8 @@ // // Параметры: // ИдентификаторБиблиотеки - Строка - имя конфигурации или идентификатор библиотеки, -// ВсеОбработчики - Соответствие - список всех обработчиков обновления, -// ОбязательныеРазделенныеОбработчики - Соответствие - список обязательных +// ВсеОбработчики - ТаблицаЗначений - список всех обработчиков обновления, +// ОбязательныеРазделенныеОбработчики - ТаблицаЗначений - список обязательных // обработчиков обновления с ОбщиеДанные = Ложь, // ИсходнаяВерсияИБ - Строка - исходная версия информационной базы, // ВерсияМетаданныхИБ - Строка - версия конфигурации (из метаданных). @@ -24,7 +24,7 @@ Если ОбщегоНазначения.РазделениеВключено() И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда - ОбработчикиОбновления = ВсеОбработчики.СкопироватьКолонки(); + ОбработчикиОбновления = ВсеОбработчики.СкопироватьКолонки(); // ТаблицаЗначений Для Каждого СтрокаОбработчика Из ВсеОбработчики Цикл // При формировании плана обновлении области, по умолчанию не добавляем обязательные (*) обработчики. Если СтрокаОбработчика.Версия = "*" Тогда diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl index dc9e5013d..2453111b7 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -191,7 +191,7 @@ ОписаниеИзменений = Заголовок + ":" + Символы.ПС + СтрСоединить(Изменения.УдаленныеИсправления, Символы.ПС); КонецЕсли; Если Изменения.НеактивныеИсправления.Количество() > 0 Тогда - Заголовок = НСтр("ru = 'Удалены неактивные патчи'"); + Заголовок = НСтр("ru = 'Удалены отключенные патчи'"); Если ЗначениеЗаполнено(ОписаниеИзменений) Тогда ОписаниеИзменений = ОписаниеИзменений + Символы.ПС + Символы.ПС; КонецЕсли; @@ -306,7 +306,7 @@ // Производит установку/удаление патчей. // // Параметры: -// Исправления - структура: +// Исправления - Структура: // * Установить - Массив - файлы исправлений во временном хранилище, которые требуется установить. // * Удалить - Массив - уникальные идентификаторы (Строка) исправлений, которые требуется удалить. // ВФоне - Булево - необходимо устанавливать в значение Истина, если вызов функции выполняется @@ -530,7 +530,7 @@ КонецЕсли; КонецПроцедуры -Функция ОписанияНовыхПатчей(АдресХранилища, ТекущиеИсправления) Экспорт +Процедура ОписанияНовыхПатчей(АдресХранилища, ТекущиеИсправления) Экспорт Описания = Новый Массив; Для Каждого Исправление Из ТекущиеИсправления Цикл Если Метаданные.ОбщиеМакеты.Найти(Исправление) = Неопределено Тогда @@ -549,12 +549,15 @@ КонецЦикла; ОписаниеСтрокой = СтрСоединить(Описания, Символы.ПС); ПоместитьВоВременноеХранилище(ОписаниеСтрокой, АдресХранилища); -КонецФункции +КонецПроцедуры // Вызывается при завершении обновления конфигурации через COM-соединение. // // Параметры: // РезультатОбновления - Булево - результат обновления. +// ЭлектроннаяПочта - Строка - адрес электронной почты, на который должен быть отправлен отчет о результатах. +// ИмяАдминистратораОбновления - Строка - имя пользователя, который выполнил обновление программы. +// КаталогСкрипта - Строка - полный путь папки с логом скрипта обновления. // Процедура ЗавершитьОбновление(Знач РезультатОбновления, Знач ЭлектроннаяПочта, Знач ИмяАдминистратораОбновления, Знач КаталогСкрипта = Неопределено) Экспорт @@ -621,6 +624,9 @@ // Возвращает полное имя основной формы обработки УстановкаОбновлений. // +// Возвращаемое значение: +// Строка +// Функция ИмяФормыУстановкиОбновления() Экспорт Возврат "Обработка.УстановкаОбновлений.Форма.Форма"; @@ -628,7 +634,12 @@ КонецФункции // Зачитывает свойства исправления из макета. Имя макет должно совпадать с именем исправления. -// Формат макеты XML. Соответствует XDTO пакету ErrorFix. +// Формат макеты XML. Соответствует XDTO пакету Patch. +// +// Возвращаемое значение: +// ОбъектXDTO +// Неопределено - исправление еще не применено. +// Строка - "ОшибкаЧтения", некорректный формат макета с описанием исправления. // Функция СвойстваИсправления(ИмяИсправления) Экспорт @@ -767,6 +778,15 @@ КонецФункции // Возвращает признак успешного обновления конфигурации на основе данных константы настроек. +// +// Параметры: +// КаталогСкрипта - Строка - полный путь папки с логом скрипта обновления. +// УстановленныеИсправления - Строка. +// +// Возвращаемое значение: +// Булево +// Неопределено +// Функция ОбновлениеКонфигурацииУспешно(КаталогСкрипта = "", УстановленныеИсправления = "") Экспорт Если Не ПравоДоступа("Чтение", Метаданные.Константы.СтатусОбновленияКонфигурации) Тогда @@ -1079,10 +1099,10 @@ КонецФункции -Функция УстановитьСтатусОбновленияКонфигурации(Знач Статус) +Процедура УстановитьСтатусОбновленияКонфигурации(Знач Статус) Константы.СтатусОбновленияКонфигурации.Установить(Новый ХранилищеЗначения(Статус)); -КонецФункции +КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl index 31a7865c0..e66cac4fb 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -169,7 +169,7 @@ // * ВосстанавливатьИнформационнуюБазу - Булево - признак необходимости восстановления базы. // * ЗавершениеРаботыСистемы - Булево - признак того, что установка обновления происходит при завершении работы. // * ФайлыОбновления - Массив - содержит значения типа Структура. -// * Исправления - структура: +// * Исправления - Структура: // ** Установить - Массив - пути к файлам исправлений во временном хранилище, // которые требуется установить. // ** Удалить - Массив - уникальные идентификаторы (Строка) исправлений, которые требуется удалить. diff --git a/SSL/src/CommonModules/Обсуждения/Module.bsl b/SSL/src/CommonModules/Обсуждения/Module.bsl index d7d944e36..877baff78 100644 --- a/SSL/src/CommonModules/Обсуждения/Module.bsl +++ b/SSL/src/CommonModules/Обсуждения/Module.bsl @@ -15,14 +15,14 @@ // Выбрасывает исключение, если не удалось отправить сообщение. // // Параметры: -// Автор - СправочникСсылка.Пользователи -// - ПользовательСистемыВзаимодействия -// Получатели - Массив Из СправочникСсылка.Пользователи -// - Массив Из ПользовательСистемыВзаимодействия -// Сообщение - см. ОписаниеСообщения. -// ОбсуждениеКонтекст - ЛюбаяСсылка - сообщение будет отправлено в контекстное обсуждение. -// - ИдентификаторОбсужденияСистемыВзаимодействия - сообщение будет отправлено в указанное обсуждение. -// - Неопределено - сообщение будет отправлено в негрупповое обсуждение между автором и получателем. +// Автор - СправочникСсылка.Пользователи +// - ПользовательСистемыВзаимодействия +// Получатели - Массив из СправочникСсылка.Пользователи +// - Массив из ПользовательСистемыВзаимодействия +// Сообщение - см. ОписаниеСообщения. +// ОбсуждениеКонтекст - ЛюбаяСсылка - сообщение будет отправлено в контекстное обсуждение. +// - ИдентификаторОбсужденияСистемыВзаимодействия - сообщение будет отправлено в указанное обсуждение. +// - Неопределено - сообщение будет отправлено в негрупповое обсуждение между автором и получателем. // // Пример: // Сообщение = Обсуждения.ОписаниеСообщения("Привет, мир!"); @@ -99,21 +99,11 @@ УстановитьПривилегированныйРежим(Истина); - СообщениеСВ = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения); - СообщениеСВ.Автор = Автор.Идентификатор; - СообщениеСВ.Текст = Сообщение.Текст; - Для каждого Действие Из Сообщение.Действия Цикл - СообщениеСВ.Действия.Добавить(Действие.Значение, Действие.Представление); - КонецЦикла; - - ДобавитьПолучателей(СообщениеСВ.Получатели, Получатели); - - Для каждого Вложение Из Сообщение.Вложения Цикл - СообщениеСВ.Вложения.Добавить(Вложение.Поток, - Вложение.Имя, - Вложение.ТипСодержимого, - Вложение.Отображаемое); - КонецЦикла; + СообщениеСВ = СообщениеИзОписания( + Автор, + ИдентификаторОбсуждения, + Получатели, + Сообщение); СообщениеСВ.Записать(); КонецПроцедуры @@ -124,11 +114,11 @@ // Выбрасывает исключение, если не удалось отправить сообщение. // // Параметры: -// Автор - СправочникСсылка.Пользователи -// - ПользовательСистемыВзаимодействия -// Сообщение - см. ОписаниеСообщения. -// ОбсуждениеКонтекст - ЛюбаяСсылка - сообщение будет отправлено в контекстное обсуждение. -// - ИдентификаторОбсужденияСистемыВзаимодействия - сообщение будет отправлено в указанное обсуждение. +// Автор - СправочникСсылка.Пользователи +// - ПользовательСистемыВзаимодействия +// Сообщение - см. ОписаниеСообщения. +// ОбсуждениеКонтекст - ЛюбаяСсылка - сообщение будет отправлено в контекстное обсуждение. +// - ИдентификаторОбсужденияСистемыВзаимодействия - сообщение будет отправлено в указанное обсуждение. // // Пример: // Сообщение = Обсуждения.ОписаниеСообщения("Привет, мир!"); @@ -186,21 +176,11 @@ УстановитьПривилегированныйРежим(Истина); - СообщениеСВ = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения); - СообщениеСВ.Автор = Автор.Идентификатор; - СообщениеСВ.Текст = Сообщение.Текст; - Для каждого Действие Из Сообщение.Действия Цикл - СообщениеСВ.Действия.Добавить(Действие.Значение, Действие.Представление); - КонецЦикла; - - ДобавитьПолучателей(СообщениеСВ.Получатели, Получатели); - - Для каждого Вложение Из Сообщение.Вложения Цикл - СообщениеСВ.Вложения.Добавить(Вложение.Поток, - Вложение.Имя, - Вложение.ТипСодержимого, - Вложение.Отображаемое); - КонецЦикла; + СообщениеСВ = СообщениеИзОписания( + Автор, + ИдентификаторОбсуждения, + Получатели, + Сообщение); СообщениеСВ.Записать(); КонецПроцедуры @@ -208,7 +188,7 @@ // Возвращает Истина, если база зарегистрирована в системе Взаимодействия. // // Возвращаемое значение: -// Булево +// Булево // Функция СистемаВзаимодействийПодключена() Экспорт Если ОбсужденияСлужебный.Заблокированы() Тогда @@ -222,7 +202,7 @@ // есть хотя бы один зарегистрированный пользователь. // // Возвращаемое значение: -// Булево +// Булево // Функция ОбсужденияДоступны() Экспорт Возврат ОбсужденияСлужебный.Подключены(); @@ -232,13 +212,13 @@ // и элементами справочника Пользователи. // // Параметры: -// ПользователиСистемыВзаимодействия - Массив Из ИдентификаторПользователяСистемыВзаимодействия -// - КоллекцияИдентификаторовПользователейСистемыВзаимодействия +// ПользователиСистемыВзаимодействия - Массив из ИдентификаторПользователяСистемыВзаимодействия +// - КоллекцияИдентификаторовПользователейСистемыВзаимодействия // // Возвращаемое значение: -// Соответствие из КлючИЗначение: -// * Ключ - ИдентификаторПользователяСистемыВзаимодействия -// * Значение - см. ПользовательИнформационнойБазы +// Соответствие из КлючИЗначение: +// * Ключ - ИдентификаторПользователяСистемыВзаимодействия +// * Значение - см. ПользовательИнформационнойБазы // Функция ПользователиИнформационнойБазы(ПользователиСистемыВзаимодействия)Экспорт ТипыВходныхПараметров = Новый Массив; @@ -277,10 +257,10 @@ // Выбрасывает исключение, если пользователь не был найден. // // Параметры: -// ПользовательСистемыВзаимодействия - ИдентификаторПользователяСистемыВзаимодействия. +// ПользовательСистемыВзаимодействия - ИдентификаторПользователяСистемыВзаимодействия. // // Возвращаемое значение: -// СправочникСсылка.Пользователи +// СправочникСсылка.Пользователи // Функция ПользовательИнформационнойБазы(ПользовательСистемыВзаимодействия) Экспорт Результат = Неопределено; @@ -306,12 +286,12 @@ // то возвращается Неопределено. // // Параметры: -// ПользователиИнформационнойБазы - Массив Из СправочникСсылка.Пользователи +// ПользователиИнформационнойБазы - Массив из СправочникСсылка.Пользователи // // Возвращаемое значение: -// Соответствие: -// * Ключ - СправочникСсылка.Пользователи -// * Значение - см. ПользовательСистемыВзаимодействия +// Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.Пользователи +// * Значение - см. ПользовательСистемыВзаимодействия // Функция ПользователиСистемыВзаимодействия(ПользователиИнформационнойБазы) Экспорт ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( @@ -355,10 +335,10 @@ // // Параметры: // Пользователь - СправочникСсылка.Пользователи -// - СправочникОбъект.Пользователи +// - СправочникОбъект.Пользователи // // Возвращаемое значение: -// ПользовательСистемыВзаимодействия +// ПользовательСистемыВзаимодействия // Функция ПользовательСистемыВзаимодействия(Пользователь) Экспорт Результат = Неопределено; @@ -421,8 +401,8 @@ // Выбрасывает исключение, если обновить пользователя системы взаимодействия не удалось. // // Параметры: -// Пользователь - СправочникСсылка.Пользователи -// - СправочникОбъект.Пользователи +// Пользователь - СправочникСсылка.Пользователи +// - СправочникОбъект.Пользователи // Процедура ОбновитьПользователяВСистемеВзаимодействия(Пользователь) Экспорт @@ -453,14 +433,15 @@ // и функции подсистемы Обсуждения. // // Параметры: -// Текст - Строка - текст сообщения системы Взаимодействия -// - ФорматированнаяСтрока +// Текст - Строка - текст сообщения системы Взаимодействия +// - ФорматированнаяСтрока // // Возвращаемое значение: // Структура: -// * Текст - ФорматированнаяСтрока -// * Вложения - Массив Из см. ОписаниеВложения -// * Действия - СписокЗначений - см. синтакс-помощник СообщениеСистемыВзаимодействия +// * Текст - ФорматированнаяСтрока +// * Вложения - Массив из см. ОписаниеВложения +// * Данные - Неопределено - см. синтакс-помощник СообщениеСистемыВзаимодействия +// * Действия - СписокЗначений - см. синтакс-помощник СообщениеСистемыВзаимодействия // Функция ОписаниеСообщения(Знач Текст) Экспорт Описание = Новый Структура; @@ -471,6 +452,7 @@ Описание.Вставить("Текст", Текст); Описание.Вставить("Вложения", Новый Массив); + Описание.Вставить("Данные", Неопределено); Описание.Вставить("Действия", Новый СписокЗначений); Возврат Описание; КонецФункции @@ -479,19 +461,19 @@ // и функции подсистемы Обсуждения. // // Параметры: -// Поток - Поток - поток, из которого будет создано вложение системы Взаимодействия. -// - ПотокВПамяти -// - ФайловыйПоток -// Наименование - Строка +// Поток - Поток - поток, из которого будет создано вложение системы Взаимодействия. +// - ПотокВПамяти +// - ФайловыйПоток +// Наименование - Строка // // Возвращаемое значение: -// Структура: -// * Поток - Поток - поток, из которого будет создано вложение системы взаимодействия. +// Структура: +// * Поток - Поток - поток, из которого будет создано вложение системы взаимодействия. // - ПотокВПамяти // - ФайловыйПоток -// * Наименование - Строка -// * ТипСодержимого - Строка -// * Отображаемое - Булево - значение по умолчанию Истина +// * Наименование - Строка +// * ТипСодержимого - Строка +// * Отображаемое - Булево - значение по умолчанию Истина // Функция ОписаниеВложения(Поток, Наименование) Экспорт @@ -530,10 +512,10 @@ // Выбрасывает исключение, если не удалось создать нового пользователя системы Взаимодействия. // // Параметры: -// Пользователь - СправочникиСсылка.Пользователи - пользователь, для которого будет создан +// Пользователь - СправочникСсылка.Пользователи - пользователь, для которого будет создан // пользователь системы взаимодействия. // Возвращаемое значение: -// ПользовательСистемыВзаимодействия +// ПользовательСистемыВзаимодействия // Функция НовыйПользовательСистемыВзаимодействия(Пользователь) ОписаниеПользователя = ОписаниеПользователя(Пользователь); @@ -555,6 +537,11 @@ Возврат ПользователиСлужебный.ОписаниеПользователя(Пользователь); КонецФункции +// Параметры: +// ПолучателиПриемник - КоллекцияИдентификаторовПользователейСистемыВзаимодействия +// ПолучателиИсточник - Соответствие +// - Массив из ПользовательСистемыВзаимодействия +// Процедура ДобавитьПолучателей(ПолучателиПриемник, ПолучателиИсточник) Если ПолучателиИсточник.Количество() = 0 Тогда @@ -575,7 +562,7 @@ КонецЦикла; Иначе - Для каждого Получатель Из ПолучателиИсточник Цикл + Для каждого Получатель Из ПолучателиИсточник Цикл // ИдентификаторПользователяСистемыВзаимодействия, ПользовательСистемыВзаимодействия Если ТипЗнч(Получатель) = Тип("ИдентификаторПользователяСистемыВзаимодействия") Тогда ПолучателиПриемник.Добавить(Получатель); Иначе @@ -596,6 +583,8 @@ КонецЕсли; Сч = Сч + 1; КонецЦикла; + + Возврат Неопределено; КонецФункции @@ -635,4 +624,26 @@ Возврат Обсуждение; КонецФункции +Функция СообщениеИзОписания(Автор, ИдентификаторОбсуждения, Получатели, Сообщение) + + СообщениеСВ = СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения); + СообщениеСВ.Автор = Автор.Идентификатор; + СообщениеСВ.Текст = Сообщение.Текст; + СообщениеСВ.Данные = Сообщение.Данные; + Для каждого Действие Из Сообщение.Действия Цикл + СообщениеСВ.Действия.Добавить(Действие.Значение, Действие.Представление); + КонецЦикла; + + ДобавитьПолучателей(СообщениеСВ.Получатели, Получатели); + + Для каждого Вложение Из Сообщение.Вложения Цикл + СообщениеСВ.Вложения.Добавить(Вложение.Поток, + Вложение.Имя, + Вложение.ТипСодержимого, + Вложение.Отображаемое); + КонецЦикла; + Возврат СообщениеСВ; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl b/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl index 024452d25..e7ec17d37 100644 --- a/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияКлиент/Module.bsl @@ -13,8 +13,8 @@ // Параметры: // ОписаниеЗавершения - ОписаниеОповещения - оповещения, которые будет выполнено после закрытия формы подключения // с параметрами: -// * Результат - Неопределено -// * ДополнительныеПараметры - Неопределено +// * Результат - Неопределено +// * ДополнительныеПараметры - Неопределено // - Структура. // Процедура ПоказатьПодключение(ОписаниеЗавершения = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl b/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl index 97be0d01d..90de9e1a6 100644 --- a/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОбсужденияСлужебный/Module.bsl @@ -109,54 +109,9 @@ КонецПроцедуры -// Параметры: -// Данные - СправочникСсылка.ВариантыОтчетов -// Заголовок - Строка -// -// Возвращаемое значение: -// ОбсуждениеСистемыВзаимодействия -// -Функция ОбсуждениеКонтекстное(Данные, Заголовок = Неопределено) Экспорт - - Обсуждение = Неопределено; - - УстановитьПривилегированныйРежим(Истина); - - КонтекстОбсуждения = Новый КонтекстОбсужденияСистемыВзаимодействия( - ПолучитьНавигационнуюСсылку(Данные)); - - ОтборОбсуждений = Новый ОтборОбсужденийСистемыВзаимодействия(); - ОтборОбсуждений.КонтекстноеОбсуждение = Истина; - ОтборОбсуждений.КонтекстОбсуждения = КонтекстОбсуждения; - - НайденноеОбсуждения = Вычислить("СистемаВзаимодействия.ПолучитьОбсуждения(ОтборОбсуждений)"); - - Если НайденноеОбсуждения.Количество() > 0 Тогда - Возврат НайденноеОбсуждения[0]; - КонецЕсли; - - Если Заголовок = Неопределено Тогда - - Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'История %1'"), Данные); - - КонецЕсли; - - Обсуждение = Вычислить("СистемаВзаимодействия.СоздатьОбсуждение()"); - Обсуждение.Заголовок = Заголовок; - Обсуждение.КонтекстОбсуждения = КонтекстОбсуждения; - - Обсуждение.Записать(); - - Возврат Обсуждение; - -КонецФункции - #Область ДляВызоваИзДругихПодсистем -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// +// См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); @@ -168,8 +123,7 @@ КонецПроцедуры -// см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -191,10 +145,10 @@ // Если пользователь заблокирован, то возвращается Неопределено. // // Параметры: -// Пользователь - СправочникСсылка.Пользователь +// Пользователь - СправочникСсылка.Пользователи // // Возвращаемое значение: -// ИнформацияОбОшибке, Неопределено +// ИнформацияОбОшибке, Неопределено // Функция ЗаблокироватьПользователяСистемыВзаимодействия(Пользователь) Экспорт Результат = Неопределено; @@ -268,12 +222,6 @@ КонецПроцедуры -#КонецОбласти - -#КонецОбласти - -#Область СлужебныеПроцедурыИФункции - Процедура ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий(ПараметрыОбновления) Экспорт ПолноеИмяОбъектаМетаданных = "Справочник.Пользователи"; @@ -311,6 +259,12 @@ КонецПроцедуры +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + Функция СобытиеЖурналаРегистрации(ДетализацияСобытия = "") Экспорт Возврат НСтр("ru='Обсуждения'", ОбщегоНазначения.КодОсновногоЯзыка()) + ?(ПустаяСтрока(ДетализацияСобытия), "", "."+ДетализацияСобытия); @@ -319,17 +273,21 @@ Процедура СоздатьИзменитьИнтеграцию(Параметры) Экспорт Идентификатор = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "Идентификатор"); + // АПК:488-выкл безопасный код Если Идентификатор <> Неопределено Тогда - НоваяИнтеграция = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор)"); + НоваяИнтеграция = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор)"); // ИнтеграцияСистемыВзаимодействия Иначе - НоваяИнтеграция = Вычислить("СистемаВзаимодействия.СоздатьИнтеграцию()"); + НоваяИнтеграция = Вычислить("СистемаВзаимодействия.СоздатьИнтеграцию()"); // ИнтеграцияСистемыВзаимодействия КонецЕсли; + // АПК:488-вкл НоваяИнтеграция.ТипВнешнейСистемы = Параметры.Тип; НоваяИнтеграция.Представление = Параметры.Ключ; НоваяИнтеграция.Ключ = Параметры.Ключ; НоваяИнтеграция.Использование = Истина; - ОписаниеВнешнейСистемы = Вычислить("СистемаВзаимодействия.ПолучитьОписаниеВнешнейСистемы(Параметры.Тип)"); + // АПК:488-выкл безопасный код + ОписаниеВнешнейСистемы = Вычислить("СистемаВзаимодействия.ПолучитьОписаниеВнешнейСистемы(Параметры.Тип)"); // ОписаниеВнешнейСистемыСистемыВзаимодействия + // АПК:488-вкл НеУказанныеПараметры = Новый Массив; Для каждого ПараметрИнтеграции Из ОписаниеВнешнейСистемы.ОписанияПараметров Цикл @@ -359,7 +317,9 @@ Процедура ОтключитьИнтеграцию(Идентификатор) Экспорт + // АПК:488-выкл безопасный код Интеграция = Вычислить("СистемаВзаимодействия.ПолучитьИнтеграцию(Идентификатор)"); + // АПК:488-вкл Интеграция.Использование = Ложь; Интеграция.Записать(); diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl index 0f3c64d2d..f662b6034 100644 --- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -106,6 +106,8 @@ // псевдоним поля для возвращаемой структуры с результатом, а в качестве // значения (опционально) фактическое имя поля в таблице. // Если ключ задан, а значение не определено, то имя поля берется из ключа. +// Допускается указание имени поля через точку, но при этом параметр КодЯзыка для такого поля +// учитываться не будет. // - Массив // - ФиксированныйМассив - имена реквизитов в формате требований // к свойствам структуры. @@ -124,7 +126,7 @@ // - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), // то все реквизиты вернутся со значением Неопределено. // -Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, КодЯзыка = Неопределено) Экспорт +Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт // Если передано имя предопределенного. Если ТипЗнч(Ссылка) = Тип("Строка") Тогда @@ -181,10 +183,14 @@ КонецЕсли; МультиязычныеРеквизиты = Новый Соответствие; + СуффиксЯзыка = ""; Если ЗначениеЗаполнено(КодЯзыка) Тогда - СуффиксЯзыка = МультиязычностьСервер.СуффиксЯзыка(КодЯзыка); - Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда - МультиязычныеРеквизиты = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылка); + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка); + Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда + МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылка); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -256,6 +262,38 @@ Возврат Результат; КонецЕсли; + Если Тип("Структура") = ТипЗнч(Реквизиты) Тогда + Реквизиты = Новый Массив; + Для Каждого КлючИЗначение Из СтруктураПолей Цикл + ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), + КлючИЗначение.Значение, + КлючИЗначение.Ключ); + Реквизиты.Добавить(ИмяПоля); + КонецЦикла; + КонецЕсли; + + РеквизитыЧерезТочку = Новый Массив; + Для Индекс = -Реквизиты.ВГраница() По 0 Цикл + ИмяПоля = Реквизиты[-Индекс]; + Если СтрНайти(ИмяПоля, ".") Тогда + РеквизитыЧерезТочку.Добавить(ИмяПоля); + Реквизиты.Удалить(-Индекс); + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(Реквизиты) Тогда + ЗначенияРеквизитовОбъекта = ЗначенияРеквизитовОбъектов(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Ссылка), Реквизиты, ВыбратьРазрешенные, КодЯзыка)[Ссылка]; + Если ЗначениеЗаполнено(ЗначенияРеквизитовОбъекта) Тогда + ЗаполнитьЗначенияСвойств(Результат, ЗначенияРеквизитовОбъекта); + КонецЕсли; + КонецЕсли; + + Если Не ЗначениеЗаполнено(РеквизитыЧерезТочку) Тогда + Возврат Результат; + КонецЕсли; + + Реквизиты = РеквизитыЧерезТочку; + ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ |&ТекстЗапросаПолей @@ -265,7 +303,7 @@ | Таблица.Ссылка = &Ссылка"; Если Не ВыбратьРазрешенные Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1 КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаПолей", ТекстЗапросаПолей); @@ -327,6 +365,8 @@ // Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить. // - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить. // ИмяРеквизита - Строка - имя получаемого реквизита. +// Допускается указание имени реквизита через точку, но при этом параметр КодЯзыка для +// такого реквизита учитываться не будет. // ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя; // если есть ограничение на уровне записей, то возвращается Неопределено; // если нет прав для работы с таблицей, то возникнет исключение; @@ -340,7 +380,7 @@ // - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), // то возвращается Неопределено. // -Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, КодЯзыка = Неопределено) Экспорт +Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт Если ПустаяСтрока(ИмяРеквизита) Тогда ВызватьИсключение @@ -377,13 +417,13 @@ // КодЯзыка - Строка - код языка для мультиязычного реквизита. // // Возвращаемое значение: -// Соответствие - список объектов и значений их реквизитов: +// Соответствие из КлючИЗначение - список объектов и значений их реквизитов: // * Ключ - ЛюбаяСсылка - ссылка на объект; // * Значение - Структура: // ** Ключ - Строка - имя реквизита; // ** Значение - Произвольный - значение реквизита. // -Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь, КодЯзыка = Неопределено) Экспорт +Функция ЗначенияРеквизитовОбъектов(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт Если ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда Реквизиты = СтрСоединить(Реквизиты, ","); @@ -406,20 +446,28 @@ Возврат ЗначенияРеквизитов; КонецЕсли; - РеквизитыТекстЗапроса = Реквизиты; Если ЗначениеЗаполнено(КодЯзыка) Тогда - СуффиксЯзыка = МультиязычностьСервер.СуффиксЯзыка(КодЯзыка); - Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда - МультиязычныеРеквизиты = МультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылки[0]); - НаборРеквизитов = СтрРазделить(Реквизиты, ","); - Для Позиция = 0 По НаборРеквизитов.ВГраница() Цикл - ИмяРеквизита = СокрЛП(НаборРеквизитов[Позиция]); - Если МультиязычныеРеквизиты[ИмяРеквизита] <> Неопределено Тогда - ИмяССуффиксом = ИмяРеквизита + СуффиксЯзыка; - НаборРеквизитов[Позиция] = ИмяССуффиксом + " КАК " + ИмяРеквизита; - КонецЕсли; - КонецЦикла; - РеквизитыТекстЗапроса = СтрСоединить(НаборРеквизитов, ","); + КодЯзыка = СтрРазделить(КодЯзыка, "_", Истина)[0]; + КонецЕсли; + + РеквизитыТекстЗапроса = Реквизиты; + + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + СуффиксЯзыка = МодульМультиязычностьСервер.СуффиксЯзыка(КодЯзыка); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Если ЗначениеЗаполнено(СуффиксЯзыка) Тогда + МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(Ссылки[0]); + НаборРеквизитов = СтрРазделить(Реквизиты, ","); + Для Позиция = 0 По НаборРеквизитов.ВГраница() Цикл + ИмяРеквизита = СокрЛП(НаборРеквизитов[Позиция]); + Если МультиязычныеРеквизиты[ИмяРеквизита] <> Неопределено Тогда + ИмяССуффиксом = ИмяРеквизита + СуффиксЯзыка; + НаборРеквизитов[Позиция] = ИмяССуффиксом + " КАК " + ИмяРеквизита; + КонецЕсли; + КонецЦикла; + РеквизитыТекстЗапроса = СтрСоединить(НаборРеквизитов, ","); + КонецЕсли; КонецЕсли; КонецЕсли; @@ -440,14 +488,14 @@ Для Каждого СсылкиПоТипу Из СсылкиПоТипам Цикл Тип = СсылкиПоТипу.Ключ; - - Попытка - ПолноеИмяОбъектаМетаданных = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); - Исключение + ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип); + Если ОбъектМетаданных = Неопределено Тогда ВызватьИсключение НСтр("ru = 'Неверный первый параметр Ссылки в функции ОбщегоНазначения.ЗначенияРеквизитовОбъектов: |- Значения массива должны быть ссылками'"); - КонецПопытки; + КонецЕсли; + + ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); ИменаОбъектовМетаданных.Добавить(ПолноеИмяОбъектаМетаданных); ТекстЗапроса = @@ -458,23 +506,59 @@ | &ПолноеИмяОбъектаМетаданных КАК Таблица |ГДЕ | Таблица.Ссылка В (&Ссылки)"; - Если Не ВыбратьРазрешенные Или ТекстыЗапросов.Количество() > 0 Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1 КонецЕсли; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Реквизиты", РеквизитыТекстЗапроса); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Ссылки", "&" + ИмяПараметра); ПараметрыЗапроса.Вставить(ИмяПараметра, СсылкиПоТипу.Значение); + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + Если ЗначениеЗаполнено(КодЯзыка) И КодЯзыка <> КодОсновногоЯзыка() + И Не МодульМультиязычностьСервер.МультиязычныеСтрокиВРеквизитах(ОбъектМетаданных) Тогда + + МультиязычныеРеквизиты = МодульМультиязычностьСервер.МультиязычныеРеквизитыОбъекта(ОбъектМетаданных); + ПоляТаблиц = Новый Массив; + ПоляТаблиц.Добавить("Таблица.Ссылка"); + Для Каждого Реквизит Из СтрРазделить(Реквизиты, ",") Цикл + Если МультиязычныеРеквизиты[Реквизит] = Истина Тогда + ПоляТаблиц.Добавить("ТаблицаПредставления." + Реквизит + " КАК " + Реквизит); + Иначе + ПоляТаблиц.Добавить(Реквизит); + КонецЕсли; + КонецЦикла; + + ПоляТаблиц = СтрСоединить(ПоляТаблиц, ","); + + Таблицы = ПолноеИмяОбъектаМетаданных + " " + "КАК Таблица" + Символы.ПС + + "ЛЕВОЕ СОЕДИНЕНИЕ" + " " + ПолноеИмяОбъектаМетаданных + ".Представления КАК ТаблицаПредставления" + Символы.ПС + + "ПО ТаблицаПредставления.Ссылка = Таблица.Ссылка И ТаблицаПредставления.КодЯзыка = &КодЯзыка"; + + ИмяПараметра = "Ссылки" + СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", ""); + Условия = "Таблица.Ссылка В (&" + ИмяПараметра + ")"; + + СтрокиЗапроса = Новый Массив; + СтрокиЗапроса.Добавить("ВЫБРАТЬ" + ?(ВыбратьРазрешенные И Не ЗначениеЗаполнено(ТекстыЗапросов), " " + "РАЗРЕШЕННЫЕ", "")); // @Query-part-1, @Query-part-3 + СтрокиЗапроса.Добавить(ПоляТаблиц); + СтрокиЗапроса.Добавить("ИЗ"); // @Query-part-1 + СтрокиЗапроса.Добавить(Таблицы); + СтрокиЗапроса.Добавить("ГДЕ"); // @Query-part-1 + СтрокиЗапроса.Добавить(Условия); + + ТекстЗапроса = СтрСоединить(СтрокиЗапроса, Символы.ПС); + КонецЕсли; + КонецЕсли; + ТекстыЗапросов.Добавить(ТекстЗапроса); КонецЦикла; ТекстЗапроса = СтрСоединить(ТекстыЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС); Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("КодЯзыка", КодЯзыка); Для Каждого Параметр Из ПараметрыЗапроса Цикл Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение); КонецЦикла; @@ -537,11 +621,11 @@ // КодЯзыка - Строка - код языка для мультиязычного реквизита. // // Возвращаемое значение: -// Соответствие - Ключ - ссылка на объект, Значение - значение прочитанного реквизита: +// Соответствие из КлючИЗначение - Ключ - ссылка на объект, Значение - значение прочитанного реквизита: // * Ключ - ссылка на объект, // * Значение - значение прочитанного реквизита. // -Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, КодЯзыка = Неопределено) Экспорт +Функция ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено) Экспорт Если ПустаяСтрока(ИмяРеквизита) Тогда ВызватьИсключение НСтр("ru = 'Неверный второй параметр ИмяРеквизита в функции ОбщегоНазначения.ЗначениеРеквизитаОбъектов: @@ -584,43 +668,18 @@ // Процедура УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка = Неопределено) Экспорт - Если КодЯзыка = Неопределено Тогда - КодЯзыка = КодОсновногоЯзыка(); + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.УстановитьЗначенияРеквизитов(Объект, Значения, КодЯзыка); + Возврат; КонецЕсли; - Для каждого ЗначениеРеквизита Из Значения Цикл - СтрокаБезПробелов = СтрЗаменить(ЗначениеРеквизита.Значение, " ", ""); - - Если МультиязычностьСервер.СтрокаВВидеНСтр(СтрокаБезПробелов) Тогда - - Для каждого Язык Из Метаданные.Языки Цикл - - СуффиксЯзыка = ""; - Если КодОсновногоЯзыка() <> Язык.КодЯзыка Тогда - СуффиксЯзыка = МультиязычностьСервер.СуффиксЯзыка(Язык.КодЯзыка); - Если ПустаяСтрока(СуффиксЯзыка) Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - Если СтрНайти(СтрокаБезПробелов, Язык.КодЯзыка +"=") > 0 Тогда - Объект[ЗначениеРеквизита.Ключ + СуффиксЯзыка] = НСтр(ЗначениеРеквизита.Значение, Язык.КодЯзыка); - КонецЕсли; - - КонецЦикла; - - Иначе - СуффиксЯзыка = ""; - Если ЗначениеЗаполнено(КодЯзыка) Тогда - Если КодОсновногоЯзыка() <> КодЯзыка Тогда - СуффиксЯзыка = МультиязычностьСервер.СуффиксЯзыка(КодЯзыка); - Если ПустаяСтрока(СуффиксЯзыка) Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - КонецЕсли; - Объект[ЗначениеРеквизита.Ключ + СуффиксЯзыка] = ЗначениеРеквизита.Значение; - КонецЕсли; - + Для Каждого ЗначениеРеквизита Из Значения Цикл + Значение = ЗначениеРеквизита.Значение; + Если ТипЗнч(Значение) = Тип("Строка") И СтрокаВВидеНСтр(Значение) Тогда + Значение = НСтр(ЗначениеРеквизита.Значение); + КонецЕсли; + Объект[ЗначениеРеквизита.Ключ] = ЗначениеРеквизита.Значение; КонецЦикла; КонецПроцедуры @@ -635,8 +694,24 @@ // Функция КодОсновногоЯзыка() Экспорт - УстановитьПривилегированныйРежим(Истина); - Возврат ПараметрыСеанса.ОсновнойЯзык; + Если ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщийМодуль("МультиязычностьСервер"); + Возврат МодульМультиязычностьСервер.КодОсновногоЯзыка(); + КонецЕсли; + + Возврат Метаданные.ОсновнойЯзык.КодЯзыка; + +КонецФункции + +// Возвращает признак того, что для пользователя установлен язык интерфейса +// соответствующий основному языку информационной базы. +// +// Возвращаемое значение: +// Булево +// +Функция ЭтоОсновнойЯзык() Экспорт + + Возврат СтрСравнить(КодОсновногоЯзыка(), ТекущийЯзык().КодЯзыка) = 0; КонецФункции @@ -683,10 +758,10 @@ // те из них, которые не проведены. // // Параметры: -// Документы - Массив Из ДокументСсылка - документы, статус проведения которых необходимо проверить. +// Документы - Массив из ДокументСсылка - документы, статус проведения которых необходимо проверить. // // Возвращаемое значение: -// Массив Из ДокументСсылка - непроведенные документы. +// Массив из ДокументСсылка - непроведенные документы. // Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт @@ -845,7 +920,7 @@ // или не выполнялся, будет вызван МетодПоиска для подбора замен // // Параметры: -// ПарыЗамен - Соответствие: +// ПарыЗамен - Соответствие из КлючИЗначение: // * Ключ - ЛюбаяСсылка - что ищем (дубль). // * Значение - ЛюбаяСсылка - на что заменяем (оригинал). // Ссылки сами на себя и пустые ссылки для поиска будут проигнорированы. @@ -936,7 +1011,7 @@ Попытка КоличествоДублей = Дубли.Количество(); - Сч = 1; + Номер = 1; Для Каждого Дубль Из Дубли Цикл БылиОшибки = Результат.ЕстьОшибки; @@ -949,9 +1024,10 @@ КонецЕсли; Результат.ЕстьОшибки = Результат.ЕстьОшибки ИЛИ БылиОшибки; - ДлительныеОперации.СообщитьПрогресс(Сч - ,СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена дублей...обработано (%1 из %2)'"), Сч, КоличествоДублей)); - Сч = Сч + 1; + ДлительныеОперации.СообщитьПрогресс(Номер, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Замена дублей... обработано (%1 из %2)'"), + Номер, КоличествоДублей)); + Номер = Номер + 1; ДобавитьВСтатистикуЗаменыСсылок(Статистика, Дубль, Результат.ЕстьОшибки); КонецЦикла; @@ -969,10 +1045,10 @@ Если ПодсистемаСуществует("СтандартныеПодсистемы.УдалениеПомеченныхОбъектов") И ПараметрыВыполнения.УдалятьНепосредственно Тогда - УдалениеПомеченныхМенеджер = ОбщийМодуль("УдалениеПомеченныхОбъектов"); + МодульУдалениеПомеченныхОбъектов = ОбщийМодуль("УдалениеПомеченныхОбъектов"); ДлительныеОперации.СообщитьПрогресс(0, НСтр("ru='Удаление дублей...'")); - РезультатУдаления = УдалениеПомеченныхМенеджер.УдалитьПомеченныеОбъекты(Результат.ОчередьКНепосредственномуУдалению); + РезультатУдаления = МодульУдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъекты(Результат.ОчередьКНепосредственномуУдалению); ЗарегистрироватьОшибкиУдаления(Результат, РезультатУдаления.ПрепятствующиеУдалению); КонецЕсли; @@ -997,7 +1073,7 @@ // * ВключатьБизнесЛогику - Булево - режим записи объектов при замене в них ссылок дублей на оригиналы. // Если Истина (по умолчанию), то места использования дублей записываются в обычном режиме, // иначе запись ведется в режиме ОбменДанными.Загрузка = Истина. -// * ЗаменаПарыВТранзакции - Булево - определяет размер транзакции при замене дублей. +// * ЗаменаПарыВТранзакции - Булево - устарел. определяет размер транзакции при замене дублей. // Если Истина (по умолчанию), то все места использования одного дубля заменяются в одной транзакции. // Это может быть очень ресурсоемко в случае большого количества мест использований. // Если Ложь, то замена в каждом месте использования выполняется в отдельной транзакции. @@ -1020,7 +1096,7 @@ // // Параметры: // НаборСсылок - Массив из ЛюбаяСсылка - ссылки, для которых ищем места использования. -// АдресРезультата - Строка - необязательный адрес во временном хранилище, куда будет помещен копия результата +// АдресРезультата - Строка - адрес во временном хранилище, куда будет помещен копия результата // замены. // ДополнительныеПараметры - см. ОбщегоНазначения.ПараметрыПоискаМестИспользования // @@ -1173,10 +1249,11 @@ КонецФункции // Возвращаемое значение: -// Структура: -// * ДополнительныеИсключенияПоискаСсылок - Соответствие - позволяет расширить исключения поиска ссылок +// Структура: +// * ДополнительныеИсключенияПоискаСсылок - Соответствие - позволяет расширить исключения поиска ссылок // см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок -// * ОтменаИсключенийПоискаСсылок - Массив из ОбъектМетаданных - полностью отменяет исключения поиска ссылок для объектов метаданных. +// * ОтменаИсключенийПоискаСсылок - Массив из ОбъектМетаданных - полностью отменяет исключения поиска ссылок для +// объектов метаданных. // Функция ПараметрыПоискаМестИспользования() Экспорт @@ -1191,10 +1268,10 @@ // Возвращает исключения при поиске мест использования объектов. // // Возвращаемое значение: -// Соответствие - исключения поиска ссылок в разрезе объектов метаданных: +// Соответствие из КлючИЗначение - исключения поиска ссылок в разрезе объектов метаданных: // * Ключ - ОбъектМетаданных - объект метаданных, для которого применяются исключения. // * Значение - Строка -// - Массив - описание исключенных реквизитов. +// - Массив из Строка - описание исключенных реквизитов. // Если "*", то исключены все реквизиты объекта метаданных. // Если массив строк, то содержит относительные имена исключенных реквизитов. // @@ -1276,11 +1353,11 @@ // * ЗначениеКлючевыхРеквизитов - Структура - Ключ - имя реквизита, значение - значение реквизита // // Возвращаемое значение: -// ТаблицаЗначений: -// * ПодчиненныйОбъект - ОбъектМетаданных - (обязательный) объект метаданных подчиненного объекта. -// * ПоляСвязей - Строка - (обязательный) реквизиты, определяющие связь между основными и подчиненными объектами. -// * ПриПоискеЗаменыСсылок - Строка - общий модуль или модуль менеджера, в котором есть процедура ПриПоискеЗаменыСсылок. -// * ВыполнятьАвтоматическийПоискЗаменСсылок - Булево - см. описание ЗаменитьСсылки +// ТаблицаЗначений: +// * ПодчиненныйОбъект - ОбъектМетаданных - (обязательный) объект метаданных подчиненного объекта. +// * ПоляСвязей - Строка - (обязательный) реквизиты, определяющие связь между основными и подчиненными объектами. +// * ПриПоискеЗаменыСсылок - Строка - общий модуль или модуль менеджера, в котором есть процедура ПриПоискеЗаменыСсылок. +// * ВыполнятьАвтоматическийПоискЗаменСсылок - см. ЗаменитьСсылки // Функция ПодчиненныеОбъекты() Экспорт @@ -1629,8 +1706,8 @@ Если ПланыОбмена.ГлавныйУзел() <> Неопределено И ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - ОбщийМодульОбменДаннымиСервер = ОбщийМодуль("ОбменДаннымиСервер"); - Если ОбщийМодульОбменДаннымиСервер.НазначениеПланаОбмена(ПланыОбмена.ГлавныйУзел().Метаданные().Имя) = "РИБСФильтром" Тогда + МодульОбменДаннымиСервер = ОбщийМодуль("ОбменДаннымиСервер"); + Если МодульОбменДаннымиСервер.НазначениеПланаОбмена(ПланыОбмена.ГлавныйУзел().Метаданные().Имя) = "РИБСФильтром" Тогда Возврат Истина; КонецЕсли; КонецЕсли; @@ -1843,6 +1920,8 @@ ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); // Блокировать запуск, если версия ниже минимальной. ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры); + ОбщиеПараметры.МинимальнаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.МинимальнаяВерсияПлатформы); + ОбщиеПараметры.РекомендуемаяВерсияПлатформы = НомерСборкиПоТекущейВерсииПлатформы(ОбщиеПараметры.РекомендуемаяВерсияПлатформы); Минимальная = ОбщиеПараметры.МинимальнаяВерсияПлатформы; Рекомендуемая = ОбщиеПараметры.РекомендуемаяВерсияПлатформы; @@ -1922,6 +2001,8 @@ Возврат ОписаниеПодсистемы.Значение.ИдентификаторИнтернетПоддержки; КонецЕсли; КонецЦикла; + + Возврат ""; КонецФункции #КонецОбласти @@ -1989,8 +2070,8 @@ // Сохраняет настройку рабочей даты пользователя. // // Параметры: -// НоваяРабочаяДата - Дата - дата, которую необходимо установить в качестве рабочей даты пользователя. -// ИмяПользователя - Строка - имя пользователя, для которого устанавливается рабочая дата. +// НоваяРабочаяДата - Дата - дата, которую необходимо установить в качестве рабочей даты пользователя. +// ИмяПользователя - Строка - имя пользователя, для которого устанавливается рабочая дата. // Если не задано, то устанавливается для текущего пользователя. // Процедура УстановитьРабочуюДатуПользователя(НоваяРабочаяДата, ИмяПользователя = Неопределено) Экспорт @@ -2004,11 +2085,11 @@ // Возвращает значение настройки рабочей даты для пользователя. // // Параметры: -// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата. +// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата. // Если не задано, то устанавливается для текущего пользователя. // // Возвращаемое значение: -// Дата - значение настройки рабочей даты пользователя или пустая дата, если настройка не задана. +// Дата - значение настройки рабочей даты пользователя или пустая дата, если настройка не задана. // Функция РабочаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт @@ -2028,11 +2109,11 @@ // если рабочая дата пользователя не задана. // // Параметры: -// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата. +// ИмяПользователя - Строка - имя пользователя, для которого запрашивается рабочая дата. // Если не задано, то устанавливается для текущего пользователя. // // Возвращаемое значение: -// Дата - значение настройки рабочей даты пользователя или текущая дата сеанса, если настройка не задана. +// Дата - значение настройки рабочей даты пользователя или текущая дата сеанса, если настройка не задана. // Функция ТекущаяДатаПользователя(ИмяПользователя = Неопределено) Экспорт @@ -2138,7 +2219,7 @@ // Свойства структуры и их значения совпадают с колонками переданной строки. // // Параметры: -// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений - строка таблицы значений. +// СтрокаТаблицыЗначений - СтрокаТаблицыЗначений // // Возвращаемое значение: // Структура - преобразованная строка таблицы значений. @@ -2517,7 +2598,7 @@ // // Возвращаемое значение: // ФиксированнаяСтруктура, ФиксированноеСоответствие, ФиксированныйМассив - фиксированные данные, аналогичные -// переданным в параметре Данные. +// переданным в параметре Данные. // Функция ФиксированныеДанные(Данные, ВызыватьИсключение = Истина) Экспорт @@ -2656,7 +2737,7 @@ // если Ложь - снять фиксацию, если Неопределено - не изменять. // // Возвращаемое значение: -// Структура - , ФиксированнаяСтруктура, +// Структура, ФиксированнаяСтруктура, // Соответствие // ФиксированноеСоответствие // Массив @@ -3235,6 +3316,66 @@ ИначеЕсли Метаданные.Обработки.Содержит(ОбъектМетаданных) Тогда Возврат "Обработки"; + ИначеЕсли Метаданные.Отчеты.Содержит(ОбъектМетаданных) Тогда + Возврат "Отчеты"; + + ИначеЕсли Метаданные.Подсистемы.Содержит(ОбъектМетаданных) Тогда + Возврат "Подсистемы"; + + ИначеЕсли Метаданные.ОбщиеМодули.Содержит(ОбъектМетаданных) Тогда + Возврат "ОбщиеМодули"; + + ИначеЕсли Метаданные.ПараметрыСеанса.Содержит(ОбъектМетаданных) Тогда + Возврат "ПараметрыСеанса"; + + ИначеЕсли Метаданные.Роли.Содержит(ОбъектМетаданных) Тогда + Возврат "Роли"; + + ИначеЕсли Метаданные.КритерииОтбора.Содержит(ОбъектМетаданных) Тогда + Возврат "КритерииОтбора"; + + ИначеЕсли Метаданные.ПодпискиНаСобытия.Содержит(ОбъектМетаданных) Тогда + Возврат "ПодпискиНаСобытия"; + + ИначеЕсли Метаданные.ФункциональныеОпции.Содержит(ОбъектМетаданных) Тогда + Возврат "ФункциональныеОпции"; + + ИначеЕсли Метаданные.ПараметрыФункциональныхОпций.Содержит(ОбъектМетаданных) Тогда + Возврат "ПараметрыФункциональныхОпций"; + + ИначеЕсли Метаданные.ХранилищаНастроек.Содержит(ОбъектМетаданных) Тогда + Возврат "ХранилищаНастроек"; + + ИначеЕсли Метаданные.ОбщиеФормы.Содержит(ОбъектМетаданных) Тогда + Возврат "ОбщиеФормы"; + + ИначеЕсли Метаданные.ОбщиеКоманды.Содержит(ОбъектМетаданных) Тогда + Возврат "ОбщиеКоманды"; + + ИначеЕсли Метаданные.ГруппыКоманд.Содержит(ОбъектМетаданных) Тогда + Возврат "ГруппыКоманд"; + + ИначеЕсли Метаданные.ОбщиеМакеты.Содержит(ОбъектМетаданных) Тогда + Возврат "ОбщиеМакеты"; + + ИначеЕсли Метаданные.ОбщиеКартинки.Содержит(ОбъектМетаданных) Тогда + Возврат "ОбщиеКартинки"; + + ИначеЕсли Метаданные.ПакетыXDTO.Содержит(ОбъектМетаданных) Тогда + Возврат "ПакетыXDTO"; + + ИначеЕсли Метаданные.WebСервисы.Содержит(ОбъектМетаданных) Тогда + Возврат "WebСервисы"; + + ИначеЕсли Метаданные.WSСсылки.Содержит(ОбъектМетаданных) Тогда + Возврат "WSСсылки"; + + ИначеЕсли Метаданные.Стили.Содержит(ОбъектМетаданных) Тогда + Возврат "Стили"; + + ИначеЕсли Метаданные.Языки.Содержит(ОбъектМетаданных) Тогда + Возврат "Языки"; + Иначе Возврат ""; @@ -3545,14 +3686,14 @@ КонецФункции -// Проверяет, является ли объект группой элементов. +// Проверяет, является ли элемент справочника или плана видов характеристик группой элементов. // // Параметры: -// Объект - ЛюбаяСсылка -// - Объект - проверяемый объект. +// Объект - СправочникСсылка, ПланВидовХарактеристикСсылка +// - СправочникОбъект, ПланВидовХарактеристикОбъект - проверяемый объект. // // Возвращаемое значение: -// Булево - Истина, если является. +// Булево // Функция ОбъектЯвляетсяГруппой(Объект) Экспорт @@ -3621,8 +3762,9 @@ // или неподдерживаемого объекта метаданных. // // Возвращаемое значение: -// - СправочникСсылка.ИдентификаторыОбъектовМетаданных, СправочникСсылка.ИдентификаторыОбъектовРасширений -// - Null +// СправочникСсылка.ИдентификаторыОбъектовМетаданных +// СправочникСсылка.ИдентификаторыОбъектовРасширений +// Null // // Пример: // Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Ссылка)); @@ -3660,17 +3802,15 @@ // - Задачи. // // Параметры: -// ОписаниеОбъектовМетаданных - Массив - со значениями типа: -// * ОбъектМетаданных - объект метаданных конфигурации; -// * Строка - полное имя объекта метаданных, которое можно использовать -// в функции Метаданные.НайтиПоПолномуИмени; -// * Тип - тип - который можно использовать в функции Метаданные.НайтиПоТипу. -// +// ОписаниеОбъектовМетаданных - Массив из ОбъектМетаданных - объекты метаданных конфигурации; +// - Массив из Строка - полные имена объектов метаданных, которые можно использовать +// в функции Метаданные.НайтиПоПолномуИмени; +// - Массив из Тип - типы, которые можно использовать в функции Метаданные.НайтиПоТипу. // ВызыватьИсключение - Булево - если Ложь, то несуществующие и неподдерживаемые объекты метаданных // будут пропущены в возвращаемом значении. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - полное имя указанного объекта метаданных. // * Значение - СправочникСсылка.ИдентификаторыОбъектовМетаданных // - СправочникСсылка.ИдентификаторыОбъектовРасширений - найденный идентификатор. @@ -3732,7 +3872,7 @@ // Null или Неопределено вместо вызова исключения. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных // - СправочникСсылка.ИдентификаторыОбъектовРасширений - переданный идентификатор. // * Значение - ОбъектМетаданных - объект метаданных, соответствующий идентификатору. @@ -3806,7 +3946,7 @@ // Для остальных типов приводит тип к строке, например "Число". // // Параметры: -// Тип - тип - для которого надо получить представление. +// Тип - Тип - для которого надо получить представление. // // Возвращаемое значение: // Строка - представление типа. @@ -4689,9 +4829,10 @@ |ИЗ | РегистрСведений.КэшПрограммныхИнтерфейсов КАК ТаблицаКэша |ГДЕ - | ТаблицаКэша.Идентификатор ПОДОБНО ""%" + ПодстрокаПоиска + "%"" + | ТаблицаКэша.Идентификатор ПОДОБНО ""%ПодстрокаПоиска%"" | СПЕЦСИМВОЛ ""~"""; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПодстрокаПоиска", ПодстрокаПоиска); Запрос = Новый Запрос(ТекстЗапроса); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); @@ -4745,9 +4886,9 @@ // Данные - Произвольный - данные помещаемые в безопасное хранилище. Неопределенно - удаляет все данные. // Для удаления данных по ключу следует использовать процедуру УдалитьДанныеИзБезопасногоХранилища. // Ключ - Строка - ключ сохраняемых настроек, по умолчанию "Пароль". -// Ключ должен соответствовать правилам, установленным для идентификаторов: -// * Первым символом ключа должна быть буква или символ подчеркивания (_). -// * Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). +// Ключ должен соответствовать правилам имен идентификаторов: +// 1. Первым символом ключа должна быть буква или символ подчеркивания (_). +// 2. Каждый из последующих символов может быть буквой, цифрой или символом подчеркивания (_). // // Пример: // Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) @@ -4821,7 +4962,7 @@ // ОбщиеДанные - Булево - Истина, если требуется в модели сервиса получить данные из общих данных в разделенном режиме. // // Возвращаемое значение: -// Произвольный, Структура, Неопределенно - данные из безопасного хранилища. Если указан один ключ, +// Произвольный, Структура, Неопределено - данные из безопасного хранилища. Если указан один ключ, // то возвращается его значение, иначе структура. // Если данные отсутствуют - Неопределенно. // @@ -4847,18 +4988,16 @@ |параметр должен содержать ссылку; передано значение: %3 (тип %4).'"), "Владелец", "ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища", Владелец, ТипЗнч(Владелец))); - Если РазделениеВключено() - И ДоступноИспользованиеРазделенныхДанных() Тогда + Если РазделениеВключено() И ДоступноИспользованиеРазделенныхДанных() Тогда Если ОбщиеДанные = Истина Тогда - ИмяБезопасноеХранилищеДанных = "БезопасноеХранилищеДанных"; + ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанных"; Иначе - ИмяБезопасноеХранилищеДанных = "БезопасноеХранилищеДанныхОбластейДанных"; + ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанныхОбластейДанных"; КонецЕсли; Иначе - ИмяБезопасноеХранилищеДанных = "БезопасноеХранилищеДанных"; - + ИмяБезопасногоХранилищаДанных = "БезопасноеХранилищеДанных"; КонецЕсли; - Результат = ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасноеХранилищеДанных, Ключи); + Результат = ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключи); Если Результат <> Неопределено И Результат.Количество() = 1 Тогда Возврат ?(Результат.Свойство(Ключи), Результат[Ключи], Неопределено); @@ -5322,7 +5461,7 @@ // окончания обновления ИБ, тогда требуется прекратить выполнение обработчика. // // Параметры: -// РегламентноеЗадание - ОбъектМетаданных.РегламентноеЗадание - регламентное задание, +// РегламентноеЗадание - ОбъектМетаданныхРегламентноеЗадание - регламентное задание, // из которого был вызван данный метод. Необходимо передавать для проверки доступности // по функциональным опциям. // @@ -5551,7 +5690,7 @@ // ПолноеИмяМакета - Строка - полное имя макета конфигурации с ZIP-архивом. // // Возвращаемое значение: -// AddIn, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать. +// ОбъектВнешнейКомпоненты, Неопределено - экземпляр объекта внешней компоненты или Неопределено, если не удалось создать. // // Пример: // @@ -5707,7 +5846,7 @@ // * Текст - Строка - текст запроса. // * Параметры - Структура - параметры запроса. // -Функция ЗапросВСтрокуXML(Запрос) Экспорт +Функция ЗапросВСтрокуXML(Запрос) Экспорт // АПК:299 Структура = Новый Структура("Текст, Параметры"); ЗаполнитьЗначенияСвойств(Структура, Запрос); Возврат ЗначениеВСтрокуXML(Структура); @@ -5772,10 +5911,10 @@ // * Ссылка - ЛюбаяСсылка - проверяемая ссылка. // * Данные - ЛюбаяСсылка - место использования. // * Метаданные - ОбъектМетаданных - метаданные места использования. -// ИсключенияПоискаСсылок - см. ИсключениеПоискаСсылок. +// ИсключенияПоискаСсылок - см. ОбщегоНазначения.ИсключениеПоискаСсылок. // // Возвращаемое значение: -// - Булево +// Булево // Функция ЭтоСлужебнаяСвязьДанных(МестоИспользования, ИсключенияПоискаСсылок) Экспорт @@ -5840,6 +5979,25 @@ КонецФункции +Функция СтрокаВВидеНСтр(Знач ПроверяемаяСтрока) Экспорт + + ПроверяемаяСтрока = СтрЗаменить(ПроверяемаяСтрока, " ", ""); + + ВариантыСовпадений = Новый Массив; + Для каждого Язык Из Метаданные.Языки Цикл + ВариантыСовпадений.Добавить(Язык.КодЯзыка + "="); + КонецЦикла; + + Для каждого ВариантСовпадения Из ВариантыСовпадений Цикл + Если СтрНайти(ПроверяемаяСтрока, ВариантСовпадения) > 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -5987,7 +6145,6 @@ Возврат Результат; КонецФункции - // Параметры: // ТаблицаПоиска - см. МестаИспользования // @@ -5996,7 +6153,6 @@ // Основной цикл обработки ФильтрСсылок = Новый Структура("Ссылка, КлючЗамены"); - БылиОшибки = Результат.ЕстьОшибки; Результат.ЕстьОшибки = Ложь; ФильтрСсылок.Ссылка = Дубль; @@ -6603,7 +6759,14 @@ Функция ЗадачиПроцесса(БизнесПроцесс, ТипЗадач) - Запрос = Новый Запрос(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБРАТЬ Таб.Ссылка ИЗ %1 КАК Таб ГДЕ Таб.БизнесПроцесс = &БизнесПроцесс",ТипЗадач)); + ТекстЗапроса = "ВЫБРАТЬ + | ИмяТаблицы.Ссылка + |ИЗ + | &ИмяТаблицы КАК ИмяТаблицы + |ГДЕ + | ИмяТаблицы.БизнесПроцесс = &БизнесПроцесс"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ТипЗадач); + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс); Возврат Запрос.Выполнить().Выбрать(); @@ -6871,7 +7034,7 @@ КонецПроцедуры // Параметры: -// ОбъектМетаданных - ОбъектМетаданных +// ОбъектМетаданных - ОбъектМетаданных // // Возвращаемое значение: // Массив из Структура: @@ -6968,7 +7131,7 @@ КонецФункции // Возвращаемое значение: -// Структура: +// Структура: // * СтандартныеРеквизиты - Структура // * Реквизиты - Структура // * СтандартныеТабличныеЧасти - Массив из Структура: @@ -7046,8 +7209,9 @@ ОписаниеОбъекта.Вставить("МожетБытьПроведен", Метаданные.Документы.Содержит(Мета)); Возврат ОписаниеОбъекта; КонецФункции + // Параметры: -// ОбъектМетаданных - ОбъектМетаданных +// ОбъектМетаданных - ОбъектМетаданных // // Возвращаемое значение: // Массив из Структура: @@ -7059,7 +7223,7 @@ // Функция ОписаниеЗадач(Знач Мета) - Перем ОписаниеЗадач; + ОписаниеЗадач = Неопределено; Если НЕ Метаданные.БизнесПроцессы.Содержит(Мета) Тогда Возврат ОписаниеЗадач; КонецЕсли; @@ -7132,7 +7296,9 @@ Если ТипИсточникаДанных = Тип("Строка") Тогда // Источник - имя таблицы, получаем поля запросом. - Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ " + ИсточникДанных + " ГДЕ ЛОЖЬ"); + ТекстЗапроса = "ВЫБРАТЬ * ИЗ &ИмяТаблицы ГДЕ ЛОЖЬ"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ИсточникДанных); + Запрос = Новый Запрос(ТекстЗапроса); ИсточникПолей = Запрос.Выполнить(); Иначе // Источник - набор записей @@ -7569,7 +7735,7 @@ КонецФункции // Параметры: -// МетаданныеРеквизита - ОбъектМетаданныхРеквизит +// МетаданныеРеквизита - ОбъектМетаданныхРеквизит // Функция ИнформацияПоРеквизиту(МетаданныеРеквизита) // ОписаниеСтандартногоРеквизита @@ -7607,15 +7773,12 @@ Возврат; КонецЕсли; - ЦентрМониторингаМенеджер = ОбщийМодуль("ЦентрМониторинга"); + МодульЦентрМониторинга = ОбщийМодуль("ЦентрМониторинга"); Для каждого ЭлементСтатистики Из Статистика Цикл - - ЦентрМониторингаМенеджер.ЗаписатьОперациюБизнесСтатистики( - "БазоваяФункциональность.ЗаменаСсылок."+ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов); - - ЦентрМониторингаМенеджер.ЗаписатьОперациюБизнесСтатистики( - "БазоваяФункциональность.ЗаменаСсылокКоличествоОшибок."+ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоОшибок); - + МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики( + "БазоваяФункциональность.ЗаменаСсылок."+ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоЭлементов); + МодульЦентрМониторинга.ЗаписатьОперациюБизнесСтатистики( + "БазоваяФункциональность.ЗаменаСсылокКоличествоОшибок." + ЭлементСтатистики.Ключ, ЭлементСтатистики.Значение.КоличествоОшибок); КонецЦикла; КонецПроцедуры @@ -7710,7 +7873,6 @@ ПараметрыВыполнения.Вставить("ПривилегированнаяЗапись", ПараметрыПоУмолчанию.ПривилегированнаяЗапись); ПараметрыВыполнения.Вставить("УчитыватьПрикладныеПравила", ПараметрыПоУмолчанию.УчитыватьПрикладныеПравила); ПараметрыВыполнения.Вставить("МестаЗамены", Новый Массив); - ЗаменаПарыВТранзакции = ПараметрыПоУмолчанию.ЗаменаПарыВТранзакции; // Переданные параметры обрабатываются условно для обратной совместимости. ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "СпособУдаления"); @@ -7727,11 +7889,6 @@ ПараметрыВыполнения.ВключатьБизнесЛогику = ЗначениеПараметра; КонецЕсли; - ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "ЗаменаПарыВТранзакции"); - Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда - ЗаменаПарыВТранзакции = ЗначениеПараметра; - КонецЕсли; - ЗначениеПараметра = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыЗамены, "ПривилегированнаяЗапись"); Если ТипЗнч(ЗначениеПараметра) = Тип("Булево") Тогда ПараметрыВыполнения.ПривилегированнаяЗапись = ЗначениеПараметра; @@ -7949,31 +8106,6 @@ #КонецОбласти -#Область ТекущееОкружение - -Функция МинимальнаяВерсияПлатформы() - - Результат = "8.3.14.1694"; - - СистемнаяИнформация = Новый СистемнаяИнформация; - ТекущаяВерсия = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения); - - Если ТекущаяВерсия = "8.3.15" Тогда - Результат = "8.3.15.2107"; - ИначеЕсли ТекущаяВерсия = "8.3.16" Тогда - Результат = "8.3.16.1814"; - ИначеЕсли ТекущаяВерсия = "8.3.17" Тогда - Результат = "8.3.17.1851"; - ИначеЕсли ТекущаяВерсия = "8.3.18" Тогда - Результат = "8.3.18.1208"; - КонецЕсли; - - Возврат Результат; - -КонецФункции - -#КонецОбласти - #Область Данные Функция СравниваемыеКолонки(Знач КоллекцияСтрок, Знач ИменаКолонок, Знач ИсключаяКолонки) @@ -8448,22 +8580,22 @@ #Область БезопасноеХранилище -Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасноеХранилищеДанных, Ключ) +Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключ) - Результат = Новый Структура(Ключ); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | БезопасноеХранилищеДанных.Данные КАК Данные - |ИЗ - | РегистрСведений." + ИмяБезопасноеХранилищеДанных + " КАК БезопасноеХранилищеДанных - |ГДЕ - | БезопасноеХранилищеДанных.Владелец = &Владелец"; + ТекстЗапроса = + "ВЫБРАТЬ + | БезопасноеХранилищеДанных.Данные КАК Данные + |ИЗ + | #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных + |ГДЕ + | БезопасноеХранилищеДанных.Владелец = &Владелец"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", "РегистрСведений." + ИмяБезопасногоХранилищаДанных); + Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Владелец", Владелец); РезультатЗапроса = Запрос.Выполнить().Выбрать(); + Результат = Новый Структура(Ключ); Если РезультатЗапроса.Следующий() Тогда Если ЗначениеЗаполнено(РезультатЗапроса.Данные) Тогда СохраненныеДанные = РезультатЗапроса.Данные.Получить(); @@ -8549,7 +8681,11 @@ // Имя - Строка - имя например, "Справочник", "Справочники", "Справочник.Организации". // // Возвращаемое значение: -// СправочникиМенеджер - , СправочникМенеджер, ДокументыМенеджер, ДокументМенеджер, ... +// СправочникиМенеджер +// СправочникМенеджер +// ДокументыМенеджер +// ДокументМенеджер +// ... // Функция МенеджерОбъектаПоИмени(Имя) Перем КлассОМ, ИмяОМ, Менеджер; @@ -8823,4 +8959,36 @@ #КонецОбласти +#Область ТекущееОкружение + +Функция НомерСборкиПоТекущейВерсииПлатформы(НомераСборокСтрокой) + + НомераСборок = СтрРазделить(НомераСборокСтрокой, ";", Истина); + + СборкиПоВерсиям = Новый Соответствие; + Для Каждого НомерСборки Из НомераСборок Цикл + НомерВерсии = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(НомерСборки); + СборкиПоВерсиям.Вставить(СокрЛП(НомерВерсии), СокрЛП(НомерСборки)); + КонецЦикла; + + СистемнаяИнформация = Новый СистемнаяИнформация; + ТекущаяВерсия = ОбщегоНазначенияКлиентСервер.ВерсияКонфигурацииБезНомераСборки(СистемнаяИнформация.ВерсияПриложения); + + Результат = СборкиПоВерсиям[ТекущаяВерсия]; + Если Не ЗначениеЗаполнено(Результат) Тогда + Результат = НомераСборок[0]; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция МинимальнаяВерсияПлатформы() Экспорт // АПК:581 + + Возврат "8.3.14.1694; 8.3.15.2107; 8.3.16.1814; 8.3.17.1851; 8.3.18.1208"; + +КонецФункции + +#КонецОбласти + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index 4283fb72b..841f0905b 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -443,7 +443,7 @@ // если Ложь - снять фиксацию, если Неопределено - не изменять. // // Возвращаемое значение: -// Структура - , ФиксированнаяСтруктура, +// Структура, ФиксированнаяСтруктура, // Соответствие // ФиксированноеСоответствие // Массив @@ -829,10 +829,10 @@ // Сохраняет персональные настройки пользователя. // // Параметры: -// Настройки - Структура: -// * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - признак необходимости +// Настройки - Структура: +// * НапоминатьОбУстановкеРасширенияРаботыСФайлами - Булево - признак необходимости // напоминания об установке расширения. -// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - запрашивать подтверждение по завершении работы. +// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - запрашивать подтверждение по завершении работы. // Процедура СохранитьПерсональныеНастройки(Настройки) Экспорт @@ -932,14 +932,15 @@ // Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами: // * Результат - Структура - результат подключения компоненты: // ** Подключено - Булево - признак подключения. -// ** ПодключаемыйМодуль - AddIn - экземпляр объекта внешней компоненты; -// - ФиксированноеСоответствие - экземпляры объектов внешней компоненты, -// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов, -// Ключ - Идентификатор, Значение - экземпляр объекта. +// ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты; +// - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты, +// указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов: +// *** Ключ - Строка - идентификатор внешней компоненты; +// *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта. // ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка. // * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения. -// Идентификатор - Строка - идентификатор объекта внешней компоненты. -// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. +// Идентификатор - Строка - идентификатор объекта внешней компоненты. +// ПолноеИмяМакета - Строка - полное имя макета, используемое как местоположение компоненты. // ПараметрыПодключения - Структура // - Неопределено - см. функцию ПараметрыПодключенияКомпоненты. // @@ -1258,9 +1259,6 @@ // ТекстПредупреждения - Строка - текст предупреждения о невозможности продолжения операции. // Если не указан, то выводится текст по умолчанию. // -// Возвращаемое значение: -// Булево - Истина, если расширение подключено. -// // Пример: // // Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl index b8b2031ba..c8da16331 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl @@ -124,9 +124,8 @@ // Параметры: // Отказ - Булево - если установить данному параметру значение Истина, то работа с программой не будет // завершена. -// Предупреждения - Массив - добавить элементы типа Структура, свойства которой описывают внешний вид предупреждения, -// а также дальнейшие действия. -// См. описание свойств в СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. +// Предупреждения - Массив из см. СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы - +// можно добавить сведения о внешнем виде предупреждения и дальнейших действиях. // Процедура ПередЗавершениемРаботыСистемы(Отказ, Предупреждения) Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index 2c8f7b820..152db6333 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -443,7 +443,7 @@ // // Параметры: // Приемник - Соответствие - коллекция, в которую будут добавляться новые значения. -// Источник - Соответствие - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. +// Источник - Соответствие из КлючИЗначение - коллекция, из которой будут считываться пары Ключ и Значение для заполнения. // Заменять - Булево // - Неопределено - что делать в местах пересечения ключей источника и приемника: // Истина - заменять значения приемника (самый быстрый способ), @@ -644,11 +644,11 @@ // Получает строку, содержащую ключи структуры, разделенные символом разделителя. // // Параметры: -// Структура - Структура - структура, ключи которой преобразуются в строку. -// Разделитель - Строка - разделитель, который вставляется в строку между ключами структуры. +// Структура - Структура - структура, ключи которой преобразуются в строку. +// Разделитель - Строка - разделитель, который вставляется в строку между ключами структуры. // // Возвращаемое значение: -// Строка - строка, содержащая ключи структуры разделенные разделителем. +// Строка - строка, содержащая ключи структуры разделенные разделителем. // Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт @@ -669,7 +669,7 @@ // Структура - Структура // - ФиксированнаяСтруктура - объект, из которого необходимо прочитать значение ключа. // Ключ - Строка - имя свойства структуры, для которого необходимо прочитать значение. -// ЗначениеПоУмолчанию - Произвольный - необязательный. Возвращается когда в структуре нет значения по указанному +// ЗначениеПоУмолчанию - Произвольный - возвращается когда в структуре нет значения по указанному // ключу. // Для скорости рекомендуется передавать только быстро вычисляемые значения (например примитивные типы), // а инициализацию более тяжелых значений выполнять после проверки полученного значения (только если это @@ -1188,7 +1188,7 @@ // ОбластьПоискаДобавления - КоллекцияЭлементовОтбораКомпоновкиДанных - контейнер с элементами и группами отбора, // например, Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Представление - Строка - представление элемента компоновки данных. // Использование - Булево - использование элемента. @@ -2257,7 +2257,7 @@ // Сравнивает два расписания между собой. // // Параметры: -// Расписание1 - РасписаниеРегламентногоЗадания - первое расписание. +// Расписание1 - РасписаниеРегламентногоЗадания - первое расписание. // Расписание2 - РасписаниеРегламентногоЗадания - второе расписание. // // Возвращаемое значение: @@ -2355,18 +2355,20 @@ КонецФункции // Создает объект описания защищенного соединения OpenSSL. +// См. также описание объекта ЗащищенноеСоединениеOpenSSL в синтаксис-помощнике. +// // Параметры: // СертификатКлиента - СертификатКлиентаФайл // - СертификатКлиентаWindows -// - Неопределено - см. ЗащищенноеСоединениеOpenSSL +// - Неопределено - клиентский сертификат OpenSSL. // СертификатыУдостоверяющихЦентров - СертификатыУдостоверяющихЦентровФайл // - СертификатыУдостоверяющихЦентровWindows // - СертификатыУдостоверяющихЦентровLinux // - СертификатыУдостоверяющихЦентровОС -// - Неопределено - см. ЗащищенноеСоединениеOpenSSL +// - Неопределено - сертификаты удостоверяющих центров OpenSSL. // // Возвращаемое значение: -// ЗащищенноеСоединениеOpenSSL - описание защищенного соединения. +// ЗащищенноеСоединениеOpenSSL // Функция НовоеЗащищенноеСоединение(СертификатКлиента = Неопределено, СертификатыУдостоверяющихЦентров = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl index 3820417a5..245b718f8 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl @@ -19,11 +19,21 @@ // подтверждение при завершении работы программы не // будет запрашиваться, если явно не разрешить в // персональных настройках программы. -// * МинимальнаяВерсияПлатформы - Строка - минимальная версии платформы, требуемая для запуска программы. -// Запуск программы на версии платформы ниже указанной будет невозможен. -// Например, "8.3.6.1650". +// +// * МинимальнаяВерсияПлатформы - Строка - минимальная версии платформы, требуемая для запуска программы. +// Запуск программы на версии платформы ниже указанной будет невозможен. +// Например, "8.3.6.1650". +// Допускается указание нескольких версий платформы через точку с запятой. +// В этом случае минимальная версия платформы будет выбрана, исходя из +// фактически используемой. +// Например, "8.3.14.1694; 8.3.15.2107; 8.3.16.1791" - при запуске +// на предыдущих релизах 8.3.14 будет предложено перейти на 8.3.14.1694, +// при запуске на 8.3.15 - 8.3.15.2107, и 8.3.16 - 8.3.16.1791, соответственно. +// // * РекомендуемаяВерсияПлатформы - Строка - рекомендуемая версия платформы для запуска программы. // Например, "8.3.8.2137". +// Допускается указание нескольких версий платформы через +// точку с запятой. См. пример в параметре МинимальнаяВерсияПлатформы. // * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных // и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. // Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. @@ -61,15 +71,15 @@ //// //Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт // -// Если ИмяПараметра = "ТекущийПользователь" Тогда +// Если ИмяПараметра = "ТекущийПользователь" Тогда // ПараметрыСеанса.ТекущийПользователь = Значение; // УстановленныеПараметры.Добавить("ТекущийПользователь"); -// КонецЕсли; +// КонецЕсли; // //КонецПроцедуры // // Параметры: -// Обработчики - Соответствие: +// Обработчики - Соответствие из КлючИЗначение: // * Ключ - Строка - в формате "<ИмяПараметраСеанса>|<НачалоИмениПараметраСеанса*>". // Символ '*'используется в конце имени параметра сеанса и обозначает, // что один обработчик будет вызван для инициализации всех параметров сеанса @@ -168,7 +178,7 @@ // нужно создавать часть объектов или подбирать замену из существующих объектов // // Параметры: -// ПодчиненныеОбъекты - см. ОбщегоНазначения.ПодчиненныеОбъекты +// ПодчиненныеОбъекты - см. ОбщегоНазначения.ПодчиненныеОбъекты // // Пример: // СвязиПодчиненногоОбъекта = Новый Соответствие; @@ -240,8 +250,9 @@ // т.к. это приводит к рекурсии. // // Параметры: -// ОтключенныеПодсистемы - Соответствие - в ключе указывается имя отключаемой подсистемы, -// в значении - установить в Истина. +// ОтключенныеПодсистемы - Соответствие из КлючИЗначение: +// * Ключ - Строка - имя отключаемой подсистемы +// * Значение - Булево - Истина // Процедура ПриОпределенииОтключенныхПодсистем(ОтключенныеПодсистемы) Экспорт diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl index 72518468b..2c7558a65 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиент/Module.bsl @@ -1010,7 +1010,9 @@ // Определяет соответствие между командами расчета показателей и показателями. // // Возвращаемое значение: -// Соответствие - Ключ - имя команды, Значение - имя показателя. +// Соответствие из КлючИЗначение: +// * Ключ - Строка - имя команды; +// * Значение - Строка - имя показателя. // Функция КомандыПоказателей() diff --git a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl index 8d90a40b7..e976f7917 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияСлужебныйКлиентСервер/Module.bsl @@ -628,7 +628,7 @@ // // Параметры: // ПолеТабличногоДокумента - ПолеФормы -// - ПолеТабличногоДокумента - документ, +// - ПолеТабличногоДокумента - Документ // значения ячеек которого участвуют в расчете. // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/ОрганизацииПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОрганизацииПереопределяемый/Module.bsl index bcfd1c599..ff23ec83d 100644 --- a/SSL/src/CommonModules/ОрганизацииПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОрганизацииПереопределяемый/Module.bsl @@ -21,6 +21,8 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеОрганизации +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка +// // Пример: // СведенияОбОрганизации = ОрганизацииСервер.СведенияОбОрганизации(Организация); // @@ -75,7 +77,7 @@ // // КонецЕсли; // -Процедура ПриОпределенииРегистрационныхДанныхОрганизации(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхОрганизации(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт @@ -92,9 +94,10 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // ДополнительныеСведения - см. ОрганизацииСервер.ДополнительныеСведенияОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииДополнительныхСведенийОрганизации(Организация, Поля, Дата, ДополнительныеСведения) Экспорт - +Процедура ПриОпределенииДополнительныхСведенийОрганизации(Организация, Поля, Дата, ДополнительныеСведения, КодЯзыка) Экспорт + КонецПроцедуры @@ -110,8 +113,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииОрганизации(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииОрганизации(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -127,8 +131,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // БанковскийСчет - см. ОрганизацииСервер.БанковскийСчетОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииБанковскогоСчетаОрганизации(Организация, Поля, Дата, БанковскийСчет) Экспорт +Процедура ПриОпределенииБанковскогоСчетаОрганизации(Организация, Поля, Дата, БанковскийСчет, КодЯзыка) Экспорт КонецПроцедуры @@ -147,8 +152,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеОбособленногоПодразделения. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -163,8 +169,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияОбособленногоПодразделения. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииОбособленногоПодразделения(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииОбособленногоПодразделения(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -184,8 +191,9 @@ // то возвращается значение на текущую дату. // РегистрационныеДанные - Структура - // см. ОрганизацииСервер.РегистрационныеДанныеИностраннойОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхИностраннойОрганизации(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхИностраннойОрганизации(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -201,8 +209,9 @@ // то возвращается значение на текущую дату. // КонтактнаяИнформация - Структура - // см. ОрганизацииСервер.КонтактнаяИнформацияИностраннойОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииИностраннойОрганизации(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииИностраннойОрганизации(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -221,8 +230,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеИндивидуальногоПредпринимателя. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхИндивидуальногоПредпринимателя(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхИндивидуальногоПредпринимателя(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -237,8 +247,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияИндивидуальногоПредпринимателя. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииИндивидуальногоПредпринимателя(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииИндивидуальногоПредпринимателя(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -257,8 +268,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеРуководителяОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхРуководителяОрганизации(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхРуководителяОрганизации(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -274,8 +286,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияРуководителяОрганизации. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииРуководителяОрганизации(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииРуководителяОрганизации(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -294,8 +307,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеГлавногоБухгалтера. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхГлавногоБухгалтера(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхГлавногоБухгалтера(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -310,8 +324,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияГлавногоБухгалтера. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииГлавногоБухгалтера(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииГлавногоБухгалтера(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры @@ -330,8 +345,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // РегистрационныеДанные - см. ОрганизацииСервер.РегистрационныеДанныеУполномоченногоПредставителя. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииРегистрационныхДанныхУполномоченногоПредставителя(Организация, Поля, Дата, РегистрационныеДанные) Экспорт +Процедура ПриОпределенииРегистрационныхДанныхУполномоченногоПредставителя(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка) Экспорт КонецПроцедуры @@ -346,8 +362,9 @@ // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. // КонтактнаяИнформация - см. ОрганизацииСервер.КонтактнаяИнформацияУполномоченногоПредставителя. +// КодЯзыка - см. ОрганизацииСервер.СведенияОбОрганизации.КодЯзыка // -Процедура ПриОпределенииКонтактнойИнформацииУполномоченногоПредставителя(Организация, Поля, Дата, КонтактнаяИнформация) Экспорт +Процедура ПриОпределенииКонтактнойИнформацииУполномоченногоПредставителя(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ОрганизацииСервер/Module.bsl b/SSL/src/CommonModules/ОрганизацииСервер/Module.bsl index 7c8c98cb3..5c2e88b8a 100644 --- a/SSL/src/CommonModules/ОрганизацииСервер/Module.bsl +++ b/SSL/src/CommonModules/ОрганизацииСервер/Module.bsl @@ -21,6 +21,11 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - Строка - язык, на котором требуется получить сведения. +// Состоит из кода языка по ISO 639-1 и, опционально, кода страны по ISO 3166-1, разделенных +// символом подчеркивания. Примеры: "en", "en_US", "en_GB", "ru", "ru_RU". +// Значение по умолчанию - язык конфигурации. +// // Возвращаемое значение: // Структура - // см. ОрганизацииСервер.РегистрационныеДанныеОрганизации @@ -41,25 +46,25 @@ // Пример: // СведенияОбОрганизации = ОрганизацииСервер.СведенияОбОрганизации(Организация); // -Функция СведенияОбОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция СведенияОбОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт ОбщиеСведения = Новый Массив; - ОбщиеСведения.Добавить(РегистрационныеДанныеОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(ДополнительныеСведенияОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(БанковскийСчетОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеОбособленногоПодразделения(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияОбособленногоПодразделения(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеОтделенияИностраннойОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияОтделенияИностраннойОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеИндивидуальногоПредпринимателя(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияИндивидуальногоПредпринимателя(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеРуководителяОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияРуководителяОрганизации(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеГлавногоБухгалтера(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияГлавногоБухгалтера(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(РегистрационныеДанныеУполномоченногоПредставителя(Организация, Поля, Дата)); - ОбщиеСведения.Добавить(КонтактнаяИнформацияУполномоченногоПредставителя(Организация, Поля, Дата)); + ОбщиеСведения.Добавить(РегистрационныеДанныеОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(ДополнительныеСведенияОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(БанковскийСчетОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеОбособленногоПодразделения(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияОбособленногоПодразделения(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеОтделенияИностраннойОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияОтделенияИностраннойОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеИндивидуальногоПредпринимателя(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияИндивидуальногоПредпринимателя(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеРуководителяОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияРуководителяОрганизации(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеГлавногоБухгалтера(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияГлавногоБухгалтера(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(РегистрационныеДанныеУполномоченногоПредставителя(Организация, Поля, Дата, КодЯзыка)); + ОбщиеСведения.Добавить(КонтактнаяИнформацияУполномоченногоПредставителя(Организация, Поля, Дата, КодЯзыка)); СведенияОбОрганизации = Новый Структура(); @@ -93,8 +98,9 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка // Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных полей: +// Структура - содержит значения затребованных полей: // * ДатаРегистрации - Дата - дата регистрации юридического лица. // * ИНН - Строка - ИНН организации. // * КодНалоговогоОргана - Строка - код налогового органа. @@ -125,10 +131,10 @@ // * ЭтоФизическоеЛицо - Булево - признак что это физическое лицо. // * ЭтоЮридическоеЛицо - Булево - признак что это юридическое лицо. // -Функция РегистрационныеДанныеОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОрганизации(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОрганизации(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; @@ -145,15 +151,17 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных полей: -// * АдресЭлектроннойПочтыОрганизации - Строка - email организации. -// * АдресОрганизацииФакт - Строка - адрес организации. -// * АдресОрганизацииФактXML - Строка - адрес организации xml. -// * АдресОрганизацииФактJSON - Строка - адрес организации json. -// * АдресИностраннойОрганизации - Строка - адрес иностранной организации. -// * АдресИностраннойОрганизацииXML - Строка - адрес иностранной организации. -// * АдресИностраннойОрганизацииJSON - Строка - адрес иностранной организации. +// Структура - содержит значения затребованных полей: +// * АдресЭлектроннойПочтыОрганизации - Строка - email организации. +// * АдресОрганизацииФакт - Строка - адрес организации. +// * АдресОрганизацииФактXML - Строка - адрес организации xml. +// * АдресОрганизацииФактJSON - Строка - адрес организации json. +// * АдресИностраннойОрганизации - Строка - адрес иностранной организации. +// * АдресИностраннойОрганизацииXML - Строка - адрес иностранной организации. +// * АдресИностраннойОрганизацииJSON - Строка - адрес иностранной организации. // * ВидПлательщикаСтраховыхВзносов - Строка - вид плательщика страховых взносов. // * ГоловнаяОрганизацияКПП - Строка - КПП головная организация. // * ГоловнаяОрганизацияНаименование - Строка - наименование головной организации. @@ -182,22 +190,24 @@ // * БухгалтерИмя - Строка - имя бухгалтера. // * БухгалтерОтчество - Строка - отчество бухгалтера. // * БухгалтерФамилия - Строка - фамилия бухгалтера. -// * БухгалтерАдресЭлектроннойПочты - Строка - адрес электронной почты бухгалтера +// * БухгалтерАдресЭлектроннойПочты - Строка - адрес электронной почты бухгалтера. // * РуководительДолжность - Строка - должность руководителя. // * РуководительИмя - Строка - имя руководителя. // * РуководительОтчество - Строка - отчество руководителя. // * РуководительФамилия - Строка - фамилия руководителя. -// * РуководительАдресЭлектроннойПочты - Строка - адрес электронной почты руководителя. +// * РуководительАдресЭлектроннойПочты - Строка - адрес электронной почты руководителя. // * СистемыНалогообложения - Строка - система налогообложения. // * СтраховойТариф - Число - страховой тариф. // * ТелефонОрганизации - Строка - телефон организации. // * ФаксОрганизации - Строка - факс организации. // * ШифрСтрахователяФСС - Строка - шифр страхователя ФСС. +// * ЭмблемаОрганизацииДляШтампаЭлектроннойПодписи - Картинка - эмблема организации для штампа электронной +// подписи согласно ГОСТ Р 7.0.97-2016. // -Функция ДополнительныеСведенияОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция ДополнительныеСведенияОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт ДополнительныеСведения = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииДополнительныхСведенийОрганизации(Организация, Поля, Дата, ДополнительныеСведения); + ОрганизацииПереопределяемый.ПриОпределенииДополнительныхСведенийОрганизации(Организация, Поля, Дата, ДополнительныеСведения, КодЯзыка); Возврат ДополнительныеСведения; @@ -214,8 +224,10 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных полей: +// Структура - содержит значения затребованных полей: // * АдресОрганизации - Строка - адрес организации. // * АдресОрганизацииXML - Строка - адрес организации xml. // * АдресОрганизацииJSON - Строка - адрес организации json. @@ -230,10 +242,10 @@ // * АдресОрганизацииРегион - Строка - регион. // * АдресОрганизацииУлица - Строка - улица. // -Функция КонтактнаяИнформацияОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииОрганизации(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииОрганизации(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; @@ -250,17 +262,19 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: -// Структура - содержит имена (ключи) и значения затребованных полей: +// Структура - содержит значения затребованных полей: // * БанковскийСчетБанк - Строка - банк. // * БанковскийСчетБИК - Строка - БИК. -// * БанковскийСчетКоррСчет - Строка - корр. счет. +// * БанковскийСчетКоррСчет - Строка - корреспондентский счет. // * БанковскийСчетНомерСчета - Строка - номер счета. // -Функция БанковскийСчетОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция БанковскийСчетОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт БанковскийСчет = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииБанковскогоСчетаОрганизации(Организация, Поля, Дата, БанковскийСчет); + ОрганизацииПереопределяемый.ПриОпределенииБанковскогоСчетаОрганизации(Организация, Поля, Дата, БанковскийСчет, КодЯзыка); Возврат БанковскийСчет; @@ -281,21 +295,22 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * КППОбособленногоПодразделения - Строка - КПП обособленного подразделения. // * НаименованиеОбособленногоПодразделенияПолное - Строка - наименование обособленного подразделения. // -Функция РегистрационныеДанныеОбособленногоПодразделения(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеОбособленногоПодразделения(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; КонецФункции - // Возвращает структуру, содержащую сведения о контактной информации обособленного подразделения. // // Параметры: @@ -307,6 +322,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * АдресОбособленногоПодразделения - Строка - адрес обособленного подразделения. @@ -323,10 +340,10 @@ // * АдресОбособленногоПодразделенияРегион - Строка - регион. // * АдресОбособленногоПодразделенияУлица - Строка - улица. // -Функция КонтактнаяИнформацияОбособленногоПодразделения(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияОбособленногоПодразделения(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииОбособленногоПодразделения(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииОбособленногоПодразделения(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; @@ -347,22 +364,23 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * ОтделениеИностраннойОрганизацииИНН - Строка - ИНН отделения иностранной организации. // * ОтделениеИностраннойОрганизацииКПП - Строка - КПП отделения иностранной организации. // * ОтделениеИностраннойОрганизацииНаименование - Строка - наименование. // -Функция РегистрационныеДанныеОтделенияИностраннойОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеОтделенияИностраннойОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхОбособленногоПодразделения(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; КонецФункции - // Возвращает структуру, содержащую сведения о контактной информации иностранной организации. // // Параметры: @@ -374,6 +392,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * ОтделениеИностраннойОрганизацииАдресРФ - Строка - адрес иностранной организации. @@ -390,10 +410,10 @@ // * ОтделениеИностраннойОрганизацииАдресРФРегион - Строка - регион. // * ОтделениеИностраннойОрганизацииАдресРФУлица - Строка - улица. // -Функция КонтактнаяИнформацияОтделенияИностраннойОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияОтделенияИностраннойОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииИностраннойОрганизации(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииИностраннойОрганизации(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; @@ -414,6 +434,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * ИПВидДокументаУдостоверенияЛичности - Строка - вид документа ИП. @@ -437,10 +459,10 @@ // * ФизическоеЛицоНаименование - Строка - наименование физлица. // * ЭтоИП - Булево - признак, что это индивидуальный предприниматель. // -Функция РегистрационныеДанныеИндивидуальногоПредпринимателя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеИндивидуальногоПредпринимателя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхИндивидуальногоПредпринимателя(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхИндивидуальногоПредпринимателя(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; @@ -458,6 +480,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * АдресМестаЖительства - Строка - адрес места жительства. @@ -479,10 +503,10 @@ // * ТелефонОрганизации - Строка - телефон организации. // * УлицаМестаЖительства - Строка - улица. // -Функция КонтактнаяИнформацияИндивидуальногоПредпринимателя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияИндивидуальногоПредпринимателя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииИндивидуальногоПредпринимателя(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииИндивидуальногоПредпринимателя(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; @@ -503,6 +527,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * РуководительГражданствоКод - Строка - код гражданства. @@ -521,16 +547,15 @@ // * РуководительУдостоверениеЛичностиСерия - Строка - серия. // * РуководительФИО - Строка - ФИО. // -Функция РегистрационныеДанныеРуководителяОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеРуководителяОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанныеРуководителя = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхРуководителяОрганизации(Организация, Поля, Дата, РегистрационныеДанныеРуководителя); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхРуководителяОрганизации(Организация, Поля, Дата, РегистрационныеДанныеРуководителя, КодЯзыка); Возврат РегистрационныеДанныеРуководителя; КонецФункции - // Возвращает структуру, содержащую сведения о контактной информации руководителя организации. // // Параметры: @@ -542,6 +567,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * РуководительАдресМестаЖительства - Строка - адрес. @@ -558,10 +585,10 @@ // * РуководительАдресМестаЖительстваРегион - Строка - регион. // * РуководительАдресМестаЖительстваУлица - Строка - улица. // -Функция КонтактнаяИнформацияРуководителяОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияРуководителяОрганизации(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформацияРуководителя = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииРуководителяОрганизации(Организация, Поля, Дата, КонтактнаяИнформацияРуководителя); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииРуководителяОрганизации(Организация, Поля, Дата, КонтактнаяИнформацияРуководителя, КодЯзыка); Возврат КонтактнаяИнформацияРуководителя; @@ -582,6 +609,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * БухгалтерГражданствоКод - Строка - код гражданства бухгалтера. @@ -604,16 +633,15 @@ // уполномоченного представителя. // * БухгалтерФИО - Строка - ФИО. // -Функция РегистрационныеДанныеГлавногоБухгалтера(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеГлавногоБухгалтера(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхГлавногоБухгалтера(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхГлавногоБухгалтера(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; КонецФункции - // Возвращает структуру, содержащую сведения о контактной информации главного бухгалтера организации. // // Параметры: @@ -625,6 +653,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * БухгалтерАдресМестаЖительства - Строка - адрес. @@ -641,10 +671,10 @@ // * БухгалтерАдресМестаЖительстваРегион - Строка - регион. // * БухгалтерАдресМестаЖительстваУлица - Строка - улица. // -Функция КонтактнаяИнформацияГлавногоБухгалтера(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияГлавногоБухгалтера(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииГлавногоБухгалтера(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииГлавногоБухгалтера(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; @@ -665,6 +695,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * УполномоченныйПредставительДатаРождения - Строка - дата рождения. @@ -678,16 +710,15 @@ // * УполномоченныйПредставительУдостоверениеЛичностиСерия - Строка - серия. // * УполномоченныйПредставительФИО - Строка - ФИО. // -Функция РегистрационныеДанныеУполномоченногоПредставителя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция РегистрационныеДанныеУполномоченногоПредставителя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт РегистрационныеДанные = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхУполномоченногоПредставителя(Организация, Поля, Дата, РегистрационныеДанные); + ОрганизацииПереопределяемый.ПриОпределенииРегистрационныхДанныхУполномоченногоПредставителя(Организация, Поля, Дата, РегистрационныеДанные, КодЯзыка); Возврат РегистрационныеДанные; КонецФункции - // Возвращает структуру, содержащую сведения о контактной информации уполномоченного представителя организации. // // Параметры: @@ -699,6 +730,8 @@ // Дата - Дата // - Неопределено - дата, на которую требуется получить данные. Если значение не указано, // то возвращается значение на текущую дату. +// КодЯзыка - см. СведенияОбОрганизации.КодЯзыка +// // Возвращаемое значение: // Структура - содержит имена (ключи) и значения затребованных полей: // * УполномоченныйПредставительАдресМестаЖительстваНаселенныйПункт - Строка - населенный пункт. @@ -716,10 +749,10 @@ // * УполномоченныйПредставительАдресМестаЖительстваУлица - Строка - улица. // * УполномоченныйПредставительМестоРождения - Строка - место рождения. // -Функция КонтактнаяИнформацияУполномоченногоПредставителя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено) Экспорт +Функция КонтактнаяИнформацияУполномоченногоПредставителя(Знач Организация, Знач Поля = "", Знач Дата = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КонтактнаяИнформация = Новый Структура(); - ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииУполномоченногоПредставителя(Организация, Поля, Дата, КонтактнаяИнформация); + ОрганизацииПереопределяемый.ПриОпределенииКонтактнойИнформацииУполномоченногоПредставителя(Организация, Поля, Дата, КонтактнаяИнформация, КодЯзыка); Возврат КонтактнаяИнформация; diff --git a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl index b7d7acbd2..d8af17cb5 100644 --- a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl @@ -192,10 +192,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); diff --git a/SSL/src/CommonModules/ОтчетОДвиженияхДокументаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетОДвиженияхДокументаПереопределяемый/Module.bsl index 6bcd4afe0..8adb925dc 100644 --- a/SSL/src/CommonModules/ОтчетОДвиженияхДокументаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетОДвиженияхДокументаПереопределяемый/Module.bsl @@ -12,7 +12,7 @@ // // Параметры: // Документ - ДокументСсылка - документ коллекцию движений которого необходимо дополнить. -// РегистрыСДвижениями - Соответствие: +// РегистрыСДвижениями - Соответствие из КлючИЗначение: // * Ключ - ОбъектМетаданных - регистр как объект метаданных. // * Значение - Строка - имя поля регистратора. // @@ -27,7 +27,7 @@ // // Параметры: // Документ - ДокументСсылка - документ коллекцию движений которого необходимо дополнить. -// РассчитанноеКоличество - Соответствие: +// РассчитанноеКоличество - Соответствие из КлючИЗначение: // * Ключ - Строка - полное имя регистра (вместо точек используется символ подчеркивания). // * Значение - Число - рассчитанное количество записей. // diff --git a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl index 34531b26c..14a24bf4f 100644 --- a/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиент/Module.bsl @@ -96,12 +96,12 @@ // Выполняет поиск элемента настройки по полю компоновки данных. // // Параметры: -// Настройки - НастройкиКомпоновкиДанных -// ПользовательскиеНастройки - КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных -// Поле - ПолеКомпоновкиДанных +// Настройки - НастройкиКомпоновкиДанных +// ПользовательскиеНастройки - КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных +// Поле - ПолеКомпоновкиДанных // // Возвращаемое значение: -// Неопределено +// Неопределено // Функция ЭлементНастройкиПоПолю(Настройки, ПользовательскиеНастройки, Поле) ЭлементНастройки = ЭлементПараметровДанныхПоПолю(Настройки, ПользовательскиеНастройки, Поле); @@ -157,12 +157,12 @@ // компоновки данных, индекс и сами настройки компоновки данных, которым подчинен текущий элемент. // // Параметры: -// КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных -// Идентификатор - Число -// - Строка +// КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// Идентификатор - Число +// - Строка // // Возвращаемое значение: -// Структура: +// Структура: // * Описание - Неопределено // - ДоступныйОбъектНастройкиКомпоновкиДанных // - ДоступноеПолеКомпоновкиДанных @@ -346,17 +346,74 @@ И ТипКоллекции <> Тип("КоллекцияЭлементовУсловногоОформленияКомпоновкиДанных"); КонецФункции -Процедура КэшироватьЗначениеОтбора(ЗначениеОтбора, Идентификатор, КомпоновщикНастроек) Экспорт +Процедура КэшироватьЗначениеОтбора(КомпоновщикНастроек, ЭлементОтбора, ЗначениеОтбора) Экспорт ДополнительныеСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства; КэшЗначенийОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( ДополнительныеСвойства, "КэшЗначенийОтборов", Новый Соответствие); - КэшЗначенийОтборов.Вставить(Идентификатор, ЗначениеОтбора); + ЭлементОтбораОсновныхНастроек = Неопределено; + + Если ЗначениеЗаполнено(ЭлементОтбора.ИдентификаторПользовательскойНастройки) Тогда + + КэшЗначенийОтборов.Вставить(ЭлементОтбора.ИдентификаторПользовательскойНастройки, ЗначениеОтбора); + + НайденныеЭлементыНастроек = КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОсновныеНастройкиПоИдентификаторуПользовательскойНастройки( + ЭлементОтбора.ИдентификаторПользовательскойНастройки); + + Если НайденныеЭлементыНастроек.Количество() > 0 Тогда + ЭлементОтбораОсновныхНастроек = НайденныеЭлементыНастроек[0]; + КонецЕсли; + + Иначе + ЭлементОтбораОсновныхНастроек = ЭлементОтбора; + КонецЕсли; + + Если ТипЗнч(ЭлементОтбораОсновныхНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + КэшЗначенийОтборов.Вставить(ЭлементОтбораОсновныхНастроек.ЛевоеЗначение, ЗначениеОтбора); + КонецЕсли; ДополнительныеСвойства.Вставить("КэшЗначенийОтборов", КэшЗначенийОтборов); КонецПроцедуры +Функция КэшЗначенияОтбора(КомпоновщикНастроек, ЭлементОтбора) Экспорт + ЗначениеОтбора = Неопределено; + + ДополнительныеСвойства = КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства; + + КэшЗначенийОтборов = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры( + ДополнительныеСвойства, "КэшЗначенийОтборов", Новый Соответствие); + + Если ЗначениеЗаполнено(ЭлементОтбора.ИдентификаторПользовательскойНастройки) Тогда + ЗначениеОтбора = КэшЗначенийОтборов[ЭлементОтбора.ИдентификаторПользовательскойНастройки]; + КонецЕсли; + + Если ЗначениеОтбора <> Неопределено Тогда + Возврат ЗначениеОтбора; + КонецЕсли; + + ЭлементОтбораОсновныхНастроек = Неопределено; + + Если ЗначениеЗаполнено(ЭлементОтбора.ИдентификаторПользовательскойНастройки) Тогда + + НайденныеЭлементыНастроек = КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьОсновныеНастройкиПоИдентификаторуПользовательскойНастройки( + ЭлементОтбора.ИдентификаторПользовательскойНастройки); + + Если НайденныеЭлементыНастроек.Количество() > 0 Тогда + ЭлементОтбораОсновныхНастроек = НайденныеЭлементыНастроек[0]; + КонецЕсли; + + Иначе + ЭлементОтбораОсновныхНастроек = ЭлементОтбора; + КонецЕсли; + + Если ТипЗнч(ЭлементОтбораОсновныхНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + ЗначениеОтбора = КэшЗначенийОтборов[ЭлементОтбораОсновныхНастроек.ЛевоеЗначение]; + КонецЕсли; + + Возврат ЗначениеОтбора; +КонецФункции + // Определяет полный путь к элементу компоновки данных. // // Параметры: diff --git a/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl index f424533a9..293a58204 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентПереопределяемый/Module.bsl @@ -12,7 +12,10 @@ // Позволяет переопределить обработку результата формирования отчета. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // ОтчетСформирован - Булево - Истина если отчет был успешно сформирован. // Процедура ПослеФормирования(ФормаОтчета, ОтчетСформирован) Экспорт @@ -23,7 +26,10 @@ // См. "Расширение поля формы для поля табличного документа.ОбработкаРасшифровки" в синтакс-помощнике. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // Элемент - ПолеФормы - табличный документ. // Расшифровка - Произвольный - значение расшифровки точки, серии или значения диаграммы. // СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. @@ -36,7 +42,10 @@ // См. "Расширение поля формы для поля табличного документа.ОбработкаДополнительнойРасшифровки" в синтакс-помощнике. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // Элемент - ПолеФормы - табличный документ. // Расшифровка - Произвольный - значение расшифровки точки, серии или значения диаграммы. // СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события. @@ -49,7 +58,10 @@ // Пример добавления команды см. ОтчетыПереопределяемый.ПриСозданииНаСервере(). // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // Команда - КомандаФормы - команда, которая была вызвана. // Результат - Булево - Истина, если вызов команды обработан. // @@ -63,7 +75,10 @@ // См. "ФормаКлиентскогоПриложения.ОбработкаВыбора" в синтакс-помощнике. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // ВыбранноеЗначение - Произвольный - результат выбора в подчиненной форме. // ИсточникВыбора - ФормаКлиентскогоПриложения - форма, где осуществлен выбор. // Результат - Булево - Истина, если результат выбора обработан. @@ -76,7 +91,10 @@ // См. "Расширение поля формы для поля табличного документа.Выбор" в синтакс-помощнике. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // Элемент - ПолеФормы - табличный документ. // Область - ОбластьЯчеекТабличногоДокумента - выбранное значение. // СтандартнаяОбработка - Булево - признак выполнения стандартной обработки события. @@ -89,7 +107,10 @@ // См. "ФормаКлиентскогоПриложения.ОбработкаОповещения" в синтакс-помощнике. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // ИмяСобытия - Строка - идентификатор события для принимающих форм. // Параметр - Произвольный - расширенная информация о событии. // Источник - ФормаКлиентскогоПриложения @@ -106,10 +127,15 @@ // а выбранный период следует вернуть в ОбработчикРезультата. // // Параметры: -// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// ФормаОтчета - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета - форма отчета: +// * Отчет - ОтчетОбъект - структура данных формы аналогичная объекту отчета. +// // Период - СтандартныйПериод - значение настройки компоновщика, соответствующей выбранному периоду. +// // СтандартнаяОбработка - Булево - если Истина, то будет использован стандартный диалог выбора периода. // Если установить в Ложь то стандартный диалог не откроется. +// // ОбработчикРезультата - ОписаниеОповещения - обработчик результата выбора периода. // В качестве результата в ОбработчикРезультата могут быть переданы значения типов: // Неопределено - пользователь отказался от ввода периода. diff --git a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl index d8b6ff936..32deb0f8c 100644 --- a/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыКлиентСервер/Module.bsl @@ -275,7 +275,7 @@ // // СвойстваНастройки - Структура - описание настройки отчета, которая будет выведена в форме отчета. // // * ОписаниеТипов - ОписаниеТипов - тип настройки. // // * ЗначенияДляВыбора - СписокЗначений - объекты, которые будут предложены пользователю в списке -// выбора. Дополняет список объектов, уже выбранных пользователем ранее. +// // выбора. Дополняет список объектов, уже выбранных пользователем ранее. // // * ЗапросЗначенийВыбора - Запрос - возвращает объекты, которыми необходимо дополнить ЗначенияДляВыбора. // // Первой колонкой (с 0м индексом) должен выбираться объект, // // который следует добавить в ЗначенияДляВыбора.Значение. @@ -331,6 +331,15 @@ // Процедура ДополнитьСвязиОбъектовМетаданных(СвязиОбъектовМетаданных) Экспорт // // Обработка события. // КонецПроцедуры +// +// ** ПриОпределенииОсновныхПолей - Булево - если Истина, то в модуле объекта отчета +// следует определить обработчик события по шаблону: +// +// // См. ОтчетыПереопределяемый.ПриОпределенииОсновныхПолей. +// // +// Процедура ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля) Экспорт +// // Обработка события. +// КонецПроцедуры // Функция НастройкиОтчетаПоУмолчанию() Экспорт Настройки = Новый Структура; @@ -369,6 +378,7 @@ События.Вставить("ПриОпределенииИспользуемыхТаблиц", Ложь); События.Вставить("ДополнитьСвязиОбъектовМетаданных", Ложь); События.Вставить("ПриОпределенииСвойствЭлементовФормыНастроек", Ложь); + События.Вставить("ПриОпределенииОсновныхПолей", Ложь); Настройки.Вставить("События", События); @@ -554,7 +564,7 @@ // - НастройкиВложенногоОбъектаКомпоновкиДанных - значение элемента настройки. // // Возвращаемое значение: -// ДоступноеПолеКомпоновкиДанных - , ДоступныйПараметрКомпоновкиДанных, +// ДоступноеПолеКомпоновкиДанных, ДоступныйПараметрКомпоновкиДанных, // ДоступныйОбъектНастройкиКомпоновкиДанных - Найденная доступная настройка. // Неопределено - если доступная настройка не существует. // @@ -957,6 +967,11 @@ КонецПроцедуры +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ТекстСостояния - Строка +// КартинкаСостояния - Неопределено +// Процедура ОтобразитьСостояниеОтчета(Форма, Знач ТекстСостояния = "", Знач КартинкаСостояния = Неопределено) Экспорт ПолеОтчета = Форма.Элементы.Найти("ОтчетТабличныйДокумент"); @@ -1181,6 +1196,11 @@ Возврат Представление; КонецФункции +// Параметры: +// Цвет - Цвет +// Возвращаемое значение: +// Строка +// Функция ПредставлениеЦвета(Цвет) Если Цвет.Вид = ВидЦвета.ЭлементСтиля Тогда Представление = Строка(Цвет); @@ -1424,9 +1444,13 @@ КонецЕсли; КонецФункции -Функция СкопироватьРекурсивно(Знач Узел, Знач ЧтоКопировать, Знач КудаВставить, Знач Индекс, Соответствие) Экспорт +Функция СкопироватьРекурсивно(Знач Узел, Знач ЧтоКопировать, Знач КудаВставить, Знач Индекс, Соответствие = Неопределено, БезСтруктуры = Ложь) Экспорт + Если Соответствие = Неопределено Тогда + Соответствие = Новый Соответствие; + КонецЕсли; + ТипЭлемента = ТипЗнч(ЧтоКопировать); - ПараметрыКопирования = ПараметрыКопирования(ТипЭлемента, КудаВставить); + ПараметрыКопирования = ПараметрыКопирования(ТипЭлемента, КудаВставить, БезСтруктуры); Если ПараметрыКопирования.НужноУказыватьТипЭлемента Тогда Если Индекс = Неопределено Тогда @@ -1447,7 +1471,7 @@ Возврат НоваяСтрока; КонецФункции -Функция ПараметрыКопирования(ТипЭлемента, Коллекция) +Функция ПараметрыКопирования(ТипЭлемента, Коллекция, БезСтруктуры = Ложь) Результат = Новый Структура; Результат.Вставить("НужноУказыватьТипЭлемента", Ложь); Результат.Вставить("ИсключаяСвойства", Неопределено); @@ -1514,7 +1538,7 @@ Результат.ЕстьПараметрыВывода = Истина; Результат.ЕстьПоляГруппировки = Истина; Результат.ЕстьПорядок = Истина; - Результат.ЕстьСтруктура = Истина; + Результат.ЕстьСтруктура = Не БезСтруктуры; Результат.ЕстьУсловноеОформление = Истина; ИначеЕсли ТипЭлемента = Тип("ТаблицаКомпоновкиДанных") Тогда @@ -1547,7 +1571,7 @@ Результат.ЕстьПараметрыДанных = Истина; Результат.ЕстьПользовательскиеПоля = Истина; Результат.ЕстьПорядок = Истина; - Результат.ЕстьСтруктура = Истина; + Результат.ЕстьСтруктура = Не БезСтруктуры; Результат.ЕстьУсловноеОформление = Истина; ИначеЕсли ТипЭлемента <> Тип("ДанныеФормыЭлементДерева") Тогда @@ -1589,12 +1613,13 @@ // ДиаграммаКомпоновкиДанных, // ЭлементУсловногоОформленияКомпоновкиДанных - элемент настройки, который заполняется. // -Функция ЗаполнитьСвойстваРекурсивно(Узел, ЧтоЗаполнить, ЧемЗаполнить, Соответствие = Неопределено, ПараметрыКопирования = Неопределено) Экспорт +Функция ЗаполнитьСвойстваРекурсивно(Узел, ЧтоЗаполнить, ЧемЗаполнить, Соответствие = Неопределено, ПараметрыКопирования = Неопределено, БезСтруктуры = Ложь) Экспорт Если Соответствие = Неопределено Тогда Соответствие = Новый Соответствие; КонецЕсли; + Если ПараметрыКопирования = Неопределено Тогда - ПараметрыКопирования = ПараметрыКопирования(ТипЗнч(ЧемЗаполнить), Неопределено); + ПараметрыКопирования = ПараметрыКопирования(ТипЗнч(ЧемЗаполнить), Неопределено, БезСтруктуры); КонецЕсли; Если ПараметрыКопирования.ИсключаяСвойства <> "*" Тогда diff --git a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl index dacd0ccaf..97d02126f 100644 --- a/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыПереопределяемый/Module.bsl @@ -43,7 +43,7 @@ // пустую строку. // * ОграничиватьВыборУказаннымиЗначениями - Булево - указать Истина, чтобы ограничить выбор пользователя // значениями, указанными в ЗначенияДляВыбора (его конечным состоянием). -// * Тип - см. ОтчетыСервер.ТипНастройкиСтрокой. +// * Тип - Строка. // // Пример: // 1. Для всех настроек типа СправочникСсылка.Пользователи скрыть и не разрешать выбирать помеченных на удаление, @@ -103,6 +103,22 @@ +КонецПроцедуры + +// Вызывается при инициализации свойств результата отчета. +// Если основные поля определены, то при вызове команд контекстной настройки +// (Вставить поле слева, Вставить поле справа, Вставить группировку ниже, +// Вставить группировку выше), они будут выводиться в подменю +// для выбора полей вставки. +// +// Параметры: +// Форма - ФормаКлиентскогоПриложения - форма отчета. +// ОсновныеПоля - Массив из Строка - имена часто используемых полей отчета. +// +Процедура ПриОпределенииОсновныхПолей(Форма, ОсновныеПоля) Экспорт + + + КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl index e42653eb6..b4a5f0258 100644 --- a/SSL/src/CommonModules/ОтчетыСервер/Module.bsl +++ b/SSL/src/CommonModules/ОтчетыСервер/Module.bsl @@ -16,11 +16,10 @@ // // Параметры: // Отчет - ОтчетОбъект -// - ВнешнийОтчетОбъект - отчет, которому необходимо установить схему. +// - ВнешнийОтчет - СКД-отчет, которому необходимо установить схему. // Контекст - ФормаКлиентскогоПриложения - форма отчета или форма настройки отчета. -// Передается "как есть" из одноименного параметра события -// ПередЗагрузкойНастроекВКомпоновщик. -// - Структура - см. ВариантыОтчетов.ПодключитьОтчетИЗагрузитьНастройки. +// Передается "как есть" из одноименного параметра события ПередЗагрузкойНастроекВКомпоновщик. +// - ВариантыОтчетов.ПодключитьОтчетИЗагрузитьНастройки. // Схема - СхемаКомпоновкиДанных - схема, которую необходимо установить отчету. // КлючСхемы - Строка - идентификатор новой схемы, который будет записан в дополнительные свойства // пользовательских настроек. @@ -231,11 +230,11 @@ Ячейка.Текст = ?(ПредставлениеСсылки = Неопределено, АдресСсылки, ПредставлениеСсылки); КонецПроцедуры -// Определяет что отчет пустой. +// Определяет, что отчет пустой. // // Параметры: // ОтчетОбъект - ОтчетОбъект -// - ВнешнийОтчетОбъект - проверяемый отчет. +// - ВнешнийОтчет - проверяемый отчет. // ПроцессорКД - ПроцессорКомпоновкиДанных - объект, выполняющий компоновку данных в отчете. // // Возвращаемое значение: @@ -316,6 +315,110 @@ Возврат Истина; КонецФункции +// Возвращает коллекцию свойств элементов формы отчета (настроек отчета), связанные с настройками, +// которые доступны для переопределения в модуле объекта отчета. +// +// Параметры: +// ТипФормы - ТипФормыОтчета +// КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных +// ДополнительныеПараметры - см. ВариантыОтчетов.НастройкиФормыОтчета +// +// Возвращаемое значение: +// Структура: +// * Группы - см. СвойстваГруппыЭлементовФормы +// * Поля - см. ПоляЭлементовФормыНастроек +// +Функция СвойстваЭлементовФормыНастроек(ТипФормы, КомпоновщикНастроек, ДополнительныеПараметры) Экспорт + #Область ПодготовкаСтруктуры + + СвойстваЭлементов = Новый Структура("Группы, Поля"); + СвойстваЭлементов.Группы = Новый Структура; + + Поля = ПоляЭлементовФормыНастроек(); + + ДоступныеРежимы = Новый Массив; + ДоступныеРежимы.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ); + Если ТипФормы = ТипФормыОтчета.Настройка Тогда + ДоступныеРежимы.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный); + КонецЕсли; + + НедоступныеЭлементыСтруктуры = Новый Соответствие; + НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаКомпоновкиДанных"), ТипФормыОтчета.Настройка); + НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаТаблицыКомпоновкиДанных"), ТипФормыОтчета.Настройка); + НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаДиаграммыКомпоновкиДанных"), ТипФормыОтчета.Настройка); + НедоступныеЭлементыСтруктуры.Вставить(Тип("ТаблицаКомпоновкиДанных"), ТипФормыОтчета.Настройка); + НедоступныеЭлементыСтруктуры.Вставить(Тип("ДиаграммаКомпоновкиДанных"), ТипФормыОтчета.Настройка); + + #КонецОбласти + + #Область ЗаполнениеСтруктуры + + Сведения = СведенияОПользовательскихНастройках(КомпоновщикНастроек.Настройки); + ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки; + Для Каждого ЭлементПользовательскойНастройки Из ПользовательскиеНастройки.Элементы Цикл + НайденныеСведения = Сведения[ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки]; + ЭлементНастройки = НайденныеСведения.ЭлементНастройки; // ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных, ГруппировкаДиаграммыКомпоновкиДанных + + Если ЭлементНастройки = Неопределено + Или НедоступныеЭлементыСтруктуры.Получить(ТипЗнч(ЭлементНастройки)) = ТипФормы + Или ДоступныеРежимы.Найти(ЭлементНастройки.РежимОтображения) = Неопределено Тогда + Продолжить; + КонецЕсли; + + ТипЭлемента = ТипЗнч(ЭлементНастройки); + Если ТипЭлемента = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда + Представление = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления( + ЭлементНастройки, Неопределено, ""); + + Если Не ЗначениеЗаполнено(ЭлементНастройки.Представление) Тогда + ЭлементНастройки.Представление = Представление; + ИначеЕсли Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) + И ЭлементНастройки.Представление <> Представление Тогда + + ЭлементНастройки.ПредставлениеПользовательскойНастройки = ЭлементНастройки.Представление; + ЭлементНастройки.Представление = Представление; + КонецЕсли; + КонецЕсли; + + Поле = Поля.Добавить(); + Поле.ИдентификаторНастройки = ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки; + Поле.ИндексНастройки = ПользовательскиеНастройки.Элементы.Индекс(ЭлементПользовательскойНастройки); + Поле.Настройки = НайденныеСведения.Настройки; + Поле.ЭлементНастройки = ЭлементНастройки; + Поле.ОписаниеНастройки = НайденныеСведения.ОписаниеНастройки; + Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + + Если НедоступныеЭлементыСтруктуры.Получить(ТипЗнч(ЭлементНастройки)) <> Неопределено Тогда + Представление = ЭлементНастройки.ПараметрыВывода.Элементы.Найти("TITLE"); + Если Представление <> Неопределено + И ЗначениеЗаполнено(Представление.Значение) Тогда + Поле.Представление = Представление.Значение; + КонецЕсли; + КонецЕсли; + + Если ТипФормы = ТипФормыОтчета.Настройка + И ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда + Поле.ИдентификаторГруппы = "Дополнительно"; + КонецЕсли; + КонецЦикла; + + Если Поля.Найти("Дополнительно", "ИдентификаторГруппы") <> Неопределено Тогда + СвойстваЭлементов.Группы.Вставить("Дополнительно", СвойстваГруппыЭлементовФормы()); + КонецЕсли; + + Поля.Сортировать("ИндексНастройки"); + СвойстваЭлементов.Поля = Поля; + + Если ДополнительныеПараметры.События.ПриОпределенииСвойствЭлементовФормыНастроек Тогда + ОтчетОбъект(ДополнительныеПараметры.ПолноеИмя).ПриОпределенииСвойствЭлементовФормыНастроек( + ТипФормы, СвойстваЭлементов, ПользовательскиеНастройки.Элементы); + КонецЕсли; + + #КонецОбласти + + Возврат СвойстваЭлементов; +КонецФункции + // Конструктор свойств группы элементов формы пользовательских настроек. // // Возвращаемое значение: @@ -342,11 +445,11 @@ // Выводит и группирует элементы формы, связанные с пользовательскими настройками. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОтчета -// УзелИерархииЭлементов - ГруппаФормы -// ПараметрыОбновления - Структура -// - Неопределено +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета +// УзелИерархииЭлементов - ГруппаФормы +// ПараметрыОбновления - Структура +// - Неопределено // Процедура ОбновитьЭлементыФормыНастроек(Форма, УзелИерархииЭлементов, ПараметрыОбновления = Неопределено) Экспорт Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда @@ -410,6 +513,14 @@ Если ТипЗнч(НастройкиXML) = Тип("Строка") Тогда Попытка Настройки = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкиXML); + + // Устанавливается связь со схемой, для восстановления неиспользовавшихся значений параметров данных, + // которые теряются при сериализации настроек (см. синтакс-помощник: ЗначенияПараметровДанныхКомпоновкиДанных). + КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; + ИнициализироватьКомпоновщикНастроек(КомпоновщикНастроек, НастройкиОтчета.АдресСхемы); + КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); + + Настройки = КомпоновщикНастроек.Настройки; Исключение Настройки = Неопределено; КонецПопытки; @@ -731,9 +842,9 @@ // // Возвращаемое значение: // Структура - количество пользовательских настроек в разрезе режимов отображения: -// - БыстрогоДоступа - количество настроек с режимом отображения БыстрыйДоступ или Авто; -// - Обычных - количество настроек с режимом отображения Обычный; -// - Итог - общее количество доступных настроек. +// * БыстрогоДоступа - Число - количество настроек с режимом отображения БыстрыйДоступ или Авто; +// * Обычных - Число - количество настроек с режимом отображения Обычный; +// * Итог - Число - общее количество доступных настроек. // Функция КоличествоДоступныхНастроек(КомпоновщикНастроек) Экспорт ДоступныеНастройки = Новый Структура; @@ -889,110 +1000,6 @@ //////////////////////////////////////////////////////////////////////////////// // Обновление элементов формы пользовательских настроек -// Возвращает коллекцию свойств элементов формы отчета (настроек отчета), связанные с настройками, -// которые доступны для переопределения в модуле объекта отчета. -// -// Параметры: -// ТипФормы - ТипФормыОтчета -// КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных -// ДополнительныеПараметры - см. ВариантыОтчетов.НастройкиФормыОтчета -// -// Возвращаемое значение: -// Структура: -// * Группы - см. СвойстваГруппыЭлементовФормы -// * Поля - см. ПоляЭлементовФормыНастроек -// -Функция СвойстваЭлементовФормыНастроек(ТипФормы, КомпоновщикНастроек, ДополнительныеПараметры) Экспорт - #Область ПодготовкаСтруктуры - - СвойстваЭлементов = Новый Структура("Группы, Поля"); - СвойстваЭлементов.Группы = Новый Структура; - - Поля = ПоляЭлементовФормыНастроек(); - - ДоступныеРежимы = Новый Массив; - ДоступныеРежимы.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ); - Если ТипФормы = ТипФормыОтчета.Настройка Тогда - ДоступныеРежимы.Добавить(РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный); - КонецЕсли; - - НедоступныеЭлементыСтруктуры = Новый Соответствие; - НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаКомпоновкиДанных"), ТипФормыОтчета.Настройка); - НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаТаблицыКомпоновкиДанных"), ТипФормыОтчета.Настройка); - НедоступныеЭлементыСтруктуры.Вставить(Тип("ГруппировкаДиаграммыКомпоновкиДанных"), ТипФормыОтчета.Настройка); - НедоступныеЭлементыСтруктуры.Вставить(Тип("ТаблицаКомпоновкиДанных"), ТипФормыОтчета.Настройка); - НедоступныеЭлементыСтруктуры.Вставить(Тип("ДиаграммаКомпоновкиДанных"), ТипФормыОтчета.Настройка); - - #КонецОбласти - - #Область ЗаполнениеСтруктуры - - Сведения = СведенияОПользовательскихНастройках(КомпоновщикНастроек.Настройки); - ПользовательскиеНастройки = КомпоновщикНастроек.ПользовательскиеНастройки; - Для Каждого ЭлементПользовательскойНастройки Из ПользовательскиеНастройки.Элементы Цикл - НайденныеСведения = Сведения[ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки]; - ЭлементНастройки = НайденныеСведения.ЭлементНастройки; // ГруппировкаКомпоновкиДанных, ГруппировкаТаблицыКомпоновкиДанных, ГруппировкаДиаграммыКомпоновкиДанных - - Если ЭлементНастройки = Неопределено - Или НедоступныеЭлементыСтруктуры.Получить(ТипЗнч(ЭлементНастройки)) = ТипФормы - Или ДоступныеРежимы.Найти(ЭлементНастройки.РежимОтображения) = Неопределено Тогда - Продолжить; - КонецЕсли; - - ТипЭлемента = ТипЗнч(ЭлементНастройки); - Если ТипЭлемента = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда - Представление = ОтчетыКлиентСервер.ПредставлениеЭлементаУсловногоОформления( - ЭлементНастройки, Неопределено, ""); - - Если Не ЗначениеЗаполнено(ЭлементНастройки.Представление) Тогда - ЭлементНастройки.Представление = Представление; - ИначеЕсли Не ЗначениеЗаполнено(ЭлементНастройки.ПредставлениеПользовательскойНастройки) - И ЭлементНастройки.Представление <> Представление Тогда - - ЭлементНастройки.ПредставлениеПользовательскойНастройки = ЭлементНастройки.Представление; - ЭлементНастройки.Представление = Представление; - КонецЕсли; - КонецЕсли; - - Поле = Поля.Добавить(); - Поле.ИдентификаторНастройки = ЭлементПользовательскойНастройки.ИдентификаторПользовательскойНастройки; - Поле.ИндексНастройки = ПользовательскиеНастройки.Элементы.Индекс(ЭлементПользовательскойНастройки); - Поле.Настройки = НайденныеСведения.Настройки; - Поле.ЭлементНастройки = ЭлементНастройки; - Поле.ОписаниеНастройки = НайденныеСведения.ОписаниеНастройки; - Поле.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; - - Если НедоступныеЭлементыСтруктуры.Получить(ТипЗнч(ЭлементНастройки)) <> Неопределено Тогда - Представление = ЭлементНастройки.ПараметрыВывода.Элементы.Найти("TITLE"); - Если Представление <> Неопределено - И ЗначениеЗаполнено(Представление.Значение) Тогда - Поле.Представление = Представление.Значение; - КонецЕсли; - КонецЕсли; - - Если ТипФормы = ТипФормыОтчета.Настройка - И ТипЗнч(ЭлементНастройки) = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда - Поле.ИдентификаторГруппы = "Дополнительно"; - КонецЕсли; - КонецЦикла; - - Если Поля.Найти("Дополнительно", "ИдентификаторГруппы") <> Неопределено Тогда - СвойстваЭлементов.Группы.Вставить("Дополнительно", СвойстваГруппыЭлементовФормы()); - КонецЕсли; - - Поля.Сортировать("ИндексНастройки"); - СвойстваЭлементов.Поля = Поля; - - Если ДополнительныеПараметры.События.ПриОпределенииСвойствЭлементовФормыНастроек Тогда - ОтчетОбъект(ДополнительныеПараметры.ПолноеИмя).ПриОпределенииСвойствЭлементовФормыНастроек( - ТипФормы, СвойстваЭлементов, ПользовательскиеНастройки.Элементы); - КонецЕсли; - - #КонецОбласти - - Возврат СвойстваЭлементов; -КонецФункции - // Возвращаемое значение: // ТаблицаЗначений: // * ИндексНастройки - Число @@ -1188,14 +1195,14 @@ // Добавляет сведения о элементах отборов, значениях параметров и т.д. // // Параметры: -// Настройки - НастройкиКомпоновкиДанных -// Свойство - ОтборКомпоновкиДанных -// - ЗначенияПараметровДанныхКомпоновкиДанных -// - ЗначенияПараметровВыводаКомпоновкиДанных -// - УсловноеОформлениеКомпоновкиДанных -// ИдентификаторСвойства - Строка -// Сведения - см. ВидыСведений -// ДополнительныеСвойства - Структура +// Настройки - НастройкиКомпоновкиДанных +// Свойство - ОтборКомпоновкиДанных +// - ЗначенияПараметровДанныхКомпоновкиДанных +// - ЗначенияПараметровВыводаКомпоновкиДанных +// - УсловноеОформлениеКомпоновкиДанных +// ИдентификаторСвойства - Строка +// Сведения - см. ВидыСведений +// ДополнительныеСвойства - Структура // Процедура ПолучитьСведенияОЭлементахСвойстваНастроек(Настройки, Свойство, ИдентификаторСвойства, Сведения, ДополнительныеСвойства) СвойстваСЭлементами = Новый Структура("Отбор, ПараметрыДанных, ПараметрыВывода, УсловноеОформление"); @@ -1274,7 +1281,7 @@ // Конструктор индекса свойств пользовательских настроек. // // Возвращаемое значение: -// Структура: +// Структура: // * Настройки - НастройкиКомпоновкиДанных // * ЭлементНастройки - ЭлементОтбораКомпоновкиДанных // - ЗначениеПараметраКомпоновкиДанных @@ -1531,13 +1538,13 @@ // созданных методом СоздатьЭлементыФормыПользовательскихНастроек. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОтчета: -// * Элементы - ВсеЭлементыФормы -// * Отчет - ОтчетОбъект -// ГруппаЭлементов - ГруппаФормы -// ЭлементыНастроек - см. ПалитраКоллекцииЭлементовНастроек -// ОписаниеНастроек - ТаблицаЗначений +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета: +// * Элементы - ВсеЭлементыФормы +// * Отчет - ОтчетОбъект +// ГруппаЭлементов - ГруппаФормы +// ЭлементыНастроек - см. ПалитраКоллекцииЭлементовНастроек +// ОписаниеНастроек - ТаблицаЗначений // Процедура НайтиЭлементыФормыНастроек(Форма, ГруппаЭлементов, ЭлементыНастроек, ОписаниеНастроек) ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы; @@ -1805,8 +1812,8 @@ // ВСписке, НеВСписке и т.д. // // Параметры: -// ЭлементыНастроек - см. ПалитраКоллекцииЭлементовНастроек -// СвойстваЭлементов - Структура: +// ЭлементыНастроек - см. ПалитраКоллекцииЭлементовНастроек +// СвойстваЭлементов - Структура: // * Группы - Структура // * Поля - ТаблицаЗначений // @@ -2278,9 +2285,11 @@ Процедура ДобавитьЭлементПериода(Элементы, Группа, ШаблонИмени, Свойство, ЗаголовокЭлементаНастройки) ИмяЭлемента = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмени, "", Свойство); - ШаблонЗаголовка = "%1 (дата %2)"; + ШаблонЗаголовка = НСтр("ru = '%1 (дата %2)'"); Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонЗаголовка, ЗаголовокЭлементаНастройки, ?(СтрЗаканчиваетсяНа(Свойство, "Начала"), "начала", "окончания")); + ШаблонЗаголовка, + ЗаголовокЭлементаНастройки, + ?(СтрЗаканчиваетсяНа(Свойство, "Начала"), НСтр("ru = 'начала'"), НСтр("ru = 'окончания'"))); Элемент = Элементы.Найти(ИмяЭлемента); Если Элемент = Неопределено Тогда @@ -2323,11 +2332,11 @@ // Устанавливает значения свойствам стандартного периода: ДатаНачала, ДатаОкончания // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОтчета: -// * Элементы - ВсеЭлементыФормы -// * Отчет - ОтчетОбъект -// Индекс - Число +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета: +// * Элементы - ВсеЭлементыФормы +// * Отчет - ОтчетОбъект +// Индекс - Число // Процедура ИнициализироватьПериод(Форма, Индекс) ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; @@ -2364,14 +2373,14 @@ // Создает элементы формы типа ТаблицаФормы, ссылающиеся на реквизит типа СписокЗначений // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОтчета: -// * Отчет - ОтчетОбъект -// ЭлементНастройки - СтрокаТаблицыЗначений -// ОписаниеЭлементаНастройки - СтрокаТаблицыЗначений -// - Неопределено -// ИмяСписка - Строка -// ИменаРеквизитов - Структура: +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета: +// * Отчет - ОтчетОбъект +// ЭлементНастройки - СтрокаТаблицыЗначений +// ОписаниеЭлементаНастройки - СтрокаТаблицыЗначений +// - Неопределено +// ИмяСписка - Строка +// ИменаРеквизитов - Структура: // * Сгенерированных - Структура // * Предопределенных - Структура // @@ -2620,10 +2629,10 @@ // Устанавливает значение флажка. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОтчета: -// * Отчет - ОтчетОбъект -// Индекс - Число +// Форма - ФормаКлиентскогоПриложения +// - РасширениеУправляемойФормыДляОтчета: +// * Отчет - ОтчетОбъект +// Индекс - Число // Процедура ИнициализироватьФлажок(Форма, Индекс) ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; @@ -2643,12 +2652,12 @@ // Запоминает состояние формы. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ИмяТаблицы - Строка -// КлючевыеКолонки - Строка +// Форма - ФормаКлиентскогоПриложения +// ИмяТаблицы - Строка +// КлючевыеКолонки - Строка // // Возвращаемое значение: -// Структура: +// Структура: // * Текущая - Неопределено // * Выделенные - Массив // @@ -2691,9 +2700,9 @@ // Восстанавливает состояние формы. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ИмяТаблицы - Строка -// КлючевыеКолонки - Строка +// Форма - ФормаКлиентскогоПриложения +// ИмяТаблицы - Строка +// КлючевыеКолонки - Строка // Процедура ВосстановитьВыделенныеСтроки(Форма, ИмяТаблицы, СтрокиТаблицы) Экспорт ТаблицаРеквизит = Форма[ИмяТаблицы]; @@ -2836,7 +2845,7 @@ // Коллекция в которую требуется добавить выбранное поле. // ИмяИлиПолеКД - Строка // - ПолеКомпоновкиДанных - имя поля. -// Заголовок - Строка - необязательный. Представление поля. +// Заголовок - Строка - представление поля. // // Возвращаемое значение: // ВыбранноеПолеКомпоновкиДанных - добавленное выбранное поле. @@ -3107,7 +3116,13 @@ // ПолныйПутьКЭлементу - Строка - полный путь к элементу. Может быть получена в функции ПолныйПутьКЭлементу(). // // Возвращаемое значение: -// ЭлементКД - Произвольный - найденный узел настроек. +// - НастройкиКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных +// - ГруппировкаКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыТаблицыКомпоновкиДанных +// - ГруппировкаТаблицыКомпоновкиДанных +// - КоллекцияЭлементовСтруктурыДиаграммыКомпоновкиДанных +// - ГруппировкаДиаграммыКомпоновкиДанных - найденный узел настроек. // Функция ЭлементНастроекПоПолномуПути(Знач Настройки, Знач ПолныйПутьКЭлементу) Экспорт Индексы = СтрРазделить(ПолныйПутьКЭлементу, "/", Ложь); diff --git a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl index e00018457..841c7da00 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительности/Module.bsl @@ -12,7 +12,7 @@ // процедуры ЗакончитьЗамерВремени или ЗакончитьЗамерВремениТехнологический. // // Возвращаемое значение: -// Число(14,0) - время UTC начала с точностью до миллисекунд. +// Число - число длиной 14 символов, время UTC начала с точностью до миллисекунд. // Функция НачатьЗамерВремени() Экспорт @@ -30,13 +30,13 @@ // и записывает результат в регистр сведений ЗамерыВремени. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации -// - Строка - ключевая операция. -// ВремяНачала - Число - универсальная дата в миллисекундах, +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации +// - Строка - ключевая операция. +// ВремяНачала - Число - универсальная дата в миллисекундах, // возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. -// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. -// Комментарий - Строка -// - Соответствие - произвольная информация замера. +// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. +// Комментарий - Строка +// - Соответствие - произвольная информация замера. // ВыполненСОшибкой - Булево - признак того, что замер не был выполнен до конца, // Процедура ЗакончитьЗамерВремени(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено, ВыполненСОшибкой = Ложь) Экспорт @@ -63,13 +63,13 @@ // и записывает результат в регистр сведений ЗамерыВремениТехнологические. // // Параметры: -// КлючеваяОперация - СправочникСсылка.КлючевыеОперации -// - Строка - ключевая операция. -// ВремяНачала - Число - универсальная дата в миллисекундах, +// КлючеваяОперация - СправочникСсылка.КлючевыеОперации +// - Строка - ключевая операция. +// ВремяНачала - Число - универсальная дата в миллисекундах, // возвращаемая при начале замера функцией ОценкаПроизводительности.НачатьЗамерВремени. -// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. -// Комментарий - Строка -// - Соответствие - произвольная информация замера. +// ВесЗамера - Число - количественный показатель замера, например количество строк в документе. +// Комментарий - Строка +// - Соответствие - произвольная информация замера. // Процедура ЗакончитьЗамерВремениТехнологический(КлючеваяОперация, ВремяНачала, ВесЗамера = 1, Комментарий = Неопределено) Экспорт Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда @@ -149,9 +149,9 @@ РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда Выборка = РезультатЗапроса.Выбрать(); - Выборка.Следующий(); + Выборка.Следующий(); КлючеваяОперацияСсылка = Выборка.Ссылка; - КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); + КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации КлючеваяОперацияОбъект.ЦелевоеВремя = КлючеваяОперация.ЦелевоеВремя; КлючеваяОперацияОбъект.Записать(); @@ -207,7 +207,7 @@ Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); КлючеваяОперацияСсылка = Выборка.Ссылка; - КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); + КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации КлючеваяОперацияОбъект.Имя = КлючеваяОперация.ИмяКлючевойОперацииНовое; КлючеваяОперацияОбъект.Наименование = РазложитьСтрокуПоСловам(КлючеваяОперация.ИмяКлючевойОперацииНовое); Если КлючеваяОперация.Свойство("ЦелевоеВремя") Тогда @@ -229,10 +229,10 @@ // процедуры ЗакончитьЗамерДлительнойОперации. // // Параметры: -// КлючеваяОперация - Строка - ключевая операция. +// КлючеваяОперация - Строка - ключевая операция. // // Возвращаемое значение: -// ОписаниеЗамера - соответствие: +// ОписаниеЗамера - Соответствие: // КлючеваяОперация - имя ключевой операции. // ВремяНачала - время начала ключевой операции в миллисекундах. // ВремяПоследнегоЗамера - время последнего замера ключевой операции в миллисекундах. @@ -257,10 +257,10 @@ // Фиксирует замер вложенного шага длительной операции. // Параметры: -// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. -// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. -// ИмяШага - Строка - произвольное имя вложенного шага. -// Комментарий - Строка - произвольное дополнительное описание замера. +// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. +// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. +// ИмяШага - Строка - произвольное имя вложенного шага. +// Комментарий - Строка - произвольное дополнительное описание замера. // Процедура ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага, Комментарий = "") Экспорт @@ -297,10 +297,10 @@ // Завершает замер длительной операции. // Если указано имя шага, фиксирует его как отдельный вложенный шаг // Параметры: -// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. -// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. -// ИмяШага - Строка - произвольное имя вложенного шага. -// Комментарий - Строка - произвольное дополнительное описание замера. +// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. +// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. +// ИмяШага - Строка - произвольное имя вложенного шага. +// Комментарий - Строка - произвольное дополнительное описание замера. // Процедура ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага = "", Комментарий = "") Экспорт @@ -430,7 +430,7 @@ Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); КлючеваяОперацияСсылка = Выборка.Ссылка; - КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); + КлючеваяОперацияОбъект = КлючеваяОперацияСсылка.ПолучитьОбъект(); // СправочникОбъект.КлючевыеОперации КлючеваяОперацияОбъект.ЗавершенаСОшибкой = КлючеваяОперация.Признак; КлючеваяОперацияОбъект.Записать(); @@ -466,11 +466,11 @@ // // Параметры: // ИмяКлючевойОперации - Строка - название ключевой операции. -// ЦелевоеВремя - Число - целевое время ключевой операции. -// Длительная - Булево - признак фиксации удельного времени для замера ключевой операции. +// ЦелевоеВремя - Число - целевое время ключевой операции. +// Длительная - Булево - признак фиксации удельного времени для замера ключевой операции. // // Возвращаемое значение: -// СправочникСсылка.КлючевыеОперации. +// СправочникСсылка.КлючевыеОперации. // Функция СоздатьКлючевуюОперацию(ИмяКлючевойОперации, ЦелевоеВремя = 1, Длительная = Ложь) Экспорт @@ -539,7 +539,7 @@ // // Примеры: // РазложитьСтрокуПоСловам("ОдинДваТри") - возвратит строку "Один два три". -// РазложитьСтрокуПоСловам("одиндватри") - возвратит строку "одиндватри". +// РазложитьСтрокуПоСловам("одиндватри") - возвратит строку "одиндватри". // Функция РазложитьСтрокуПоСловам(Знач Строка) @@ -790,7 +790,7 @@ // // Параметры: // КаталогиЭкспорта - Структура - структура со значением типа Массив. -// ДопПараметры - Структура - дополнительные параметры. +// ДопПараметры - Структура - дополнительные параметры. // Процедура ЭкспортОценкиПроизводительности(КаталогиЭкспорта, ДопПараметры = Неопределено) Экспорт @@ -938,9 +938,9 @@ // Регламентное задание экспорта // Параметры: -// ДопПараметры - Структура: -// * ДатаНачала - Дата - дата начала замеров -// * ДатаОкончания - Дата - дата окончания замеров. +// ДопПараметры - Структура: +// * ДатаНачала - Дата - дата начала замеров +// * ДатаОкончания - Дата - дата окончания замеров. // Функция ЗамерыСРазделениемПоКлючевымОперациям(ВерхняяГраньДатыЗамеров, ДопПараметры = Неопределено) @@ -1064,7 +1064,7 @@ КлючеваяОперацияЗамеры = ТекЗамер.Значение; Для Каждого Комментарий Из КлючеваяОперацияЗамеры["comments"] Цикл - КлючеваяОперация = ФабрикаXDTO.Создать(ТипКлючеваяОперация); + КлючеваяОперация = ФабрикаXDTO.Создать(ТипКлючеваяОперация); // см. XDTOПакет.ApdexExport.KeyOperation КлючеваяОперация.name = КлючеваяОперацияЗамеры["name"]; КлючеваяОперация.nameFull = КлючеваяОперацияЗамеры["nameFull"]; КлючеваяОперация.long = КлючеваяОперацияЗамеры["long"]; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl index bd88744b6..6c9c84e84 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервера/Module.bsl @@ -11,10 +11,10 @@ // Функция записи массива замеров // // Параметры: -// Замеры - Массив элементов типа Структура. +// Замеры - Массив из Структура // // Возвращаемое значение: -// Число - текущее значение периода записи замеров на сервере в секундах в случае записи замеров. +// Число - текущее значение периода записи замеров на сервере в секундах в случае записи замеров. // Функция ЗафиксироватьДлительностьКлючевыхОпераций(ЗамерыДляЗаписи) Экспорт @@ -186,7 +186,7 @@ // Параметры оценки производительности // // Возвращаемое значение: -// Структура - параметры, полученные на сервере. +// Структура - параметры, полученные на сервере. // Функция ПолучитьПараметрыНаСервере() Экспорт diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl index ba71cc22a..0e26bac71 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl @@ -15,24 +15,24 @@ // в случае завершения сеанса часть замеров может быть потеряна. // // Параметры: -// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено, то ключевую операцию +// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено, то ключевую операцию // необходимо указать явно вызовом процедуры // УстановитьКлючевуюОперациюЗамера. -// ФиксироватьСОшибкой - Булево - признак автоматической фиксации ошибки. +// ФиксироватьСОшибкой - Булево - признак автоматической фиксации ошибки. // Истина - при автоматическом завершении замера, он будет записан // с признаком "Выполнен с ошибкой". В том месте кода, где ошибка явно // не может возникнуть, необходимо либо явно завершить замер методом // ЗавершитьЗамерВремени, либо снять признак ошибки с помощью метода // УстановитьПризнакОшибкиЗамера. // Ложь - замер будет считаться корректным при автоматическом завершении. -// АвтоЗавершение - Булево - признак автоматического завершения замера. +// АвтоЗавершение - Булево - признак автоматического завершения замера. // Истина - завершение замера будет выполнено автоматически // через глобальный обработчик ожидания. // Ложь - завершить замер необходимо явно вызовом процедуры // ЗавершитьЗамерВремени. // // Возвращаемое значение: -// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. +// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. // Функция ЗамерВремени(КлючеваяОперация = Неопределено, ФиксироватьСОшибкой = Ложь, АвтоЗавершение = Истина) Экспорт @@ -57,17 +57,17 @@ // Результат замера будет записан в РегистрСведений.ЗамерыВремени. // // Параметры: -// АвтоЗавершение - Булево - признак автоматического завершения замера. +// АвтоЗавершение - Булево - признак автоматического завершения замера. // Истина - завершение замера будет выполнено автоматически // через глобальный обработчик ожидания. // Ложь - завершить замер необходимо явно вызовом процедуры // ЗавершитьЗамерВремени. -// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию +// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию // необходимо указать явно вызовом процедуры // УстановитьКлючевуюОперациюЗамера. // // Возвращаемое значение: -// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. +// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. // Функция НачатьЗамерВремениТехнологический(АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) Экспорт @@ -121,13 +121,13 @@ // Устанавливает параметры замера. // // Параметры: -// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// ПараметрыЗамера - Структура: -// * КлючеваяОперация - Строка - имя ключевой операции. -// * ВесЗамера - Число - количественный показатель сложности замера -// * Комментарий - Строка +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// ПараметрыЗамера - Структура: +// * КлючеваяОперация - Строка - имя ключевой операции. +// * ВесЗамера - Число - количественный показатель сложности замера +// * Комментарий - Строка // - Соответствие - дополнительная произвольной информации замера. -// * ВыполненаСОшибкой - Булево - признак выполнения замера с ошибкой, +// * ВыполненаСОшибкой - Булево - признак выполнения замера с ошибкой, // см. процедуру УстановитьПризнакОшибкиЗамера. // Процедура УстановитьПараметрыЗамера(УИДЗамера, ПараметрыЗамера) Экспорт @@ -145,8 +145,8 @@ // Устанавливает ключевую операцию замера. // // Параметры: -// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// КлючеваяОперация - Строка - наименование ключевой операции. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// КлючеваяОперация - Строка - наименование ключевой операции. // // Если на момент начала замера имя ключевой операции еще неизвестно, // то с помощью этой процедуры в любой момент до завершения замера можно @@ -181,8 +181,8 @@ // Устанавливает вес операции замера. // // Параметры: -// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// ВесЗамера - Число - количественный показатель сложности +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// ВесЗамера - Число - количественный показатель сложности // замера, например количество строк в документе. // Процедура УстановитьВесЗамера(УИДЗамера, ВесЗамера) Экспорт @@ -200,7 +200,7 @@ // Параметры: // УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. // Комментарий - Строка -// - Соответствие - дополнительная произвольной информации замера. +// - Соответствие из КлючИЗначение - дополнительная произвольной информации замера. // В случае указания соответствия: // * Ключ - Строка - имя дополнительного параметра информации замера. // * Значение - Строка @@ -220,8 +220,8 @@ // Устанавливает признак ошибки операции замера. // // Параметры: -// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. -// Признак - Булево - признак замера. Истина - замер выполнился без ошибок. +// УИДЗамера - УникальныйИдентификатор - уникальный идентификатор замера. +// Признак - Булево - признак замера. Истина - замер выполнился без ошибок. // Ложь - при выполнении замера есть ошибка. // Процедура УстановитьПризнакОшибкиЗамера(УИДЗамера, Признак) Экспорт @@ -239,8 +239,8 @@ // Результат замера будет записан в регистр сведений ЗамерыВремени. // // Параметры: -// КлючеваяОперация - Строка - имя ключевой операции. -// ФиксироватьСОшибкой - Булево - признак автоматической фиксации ошибки. +// КлючеваяОперация - Строка - имя ключевой операции. +// ФиксироватьСОшибкой - Булево - признак автоматической фиксации ошибки. // Истина - при автоматическом завершении замера, он будет записан // с признаком "Выполнен с ошибкой". В том месте кода, где ошибка явно // не может возникнуть, необходимо либо явно завершить замер методом @@ -248,18 +248,18 @@ // УстановитьПризнакОшибкиЗамера // Ложь - замер будет считаться корректны при автоматическом завершении. // ЗавершитьЗамерВремени. -// АвтоЗавершение - Булево - признак автоматического завершения замера. +// АвтоЗавершение - Булево - признак автоматического завершения замера. // Истина - завершение замера будет выполнено автоматически // через глобальный обработчик ожидания. // Ложь - завершить замер необходимо явно вызовом процедуры // ЗавершитьЗамерВремени. -// ИмяПоследнегоШага - Строка - имя последнего шага ключевой операции. Целесообразно использовать, если +// ИмяПоследнегоШага - Строка - имя последнего шага ключевой операции. Целесообразно использовать, если // замер запущен с автоматическим завершением. В противным случае последние // действия, выполненные между ЗафиксироватьЗамерДлительнойОперации и // срабатыванием обработчика ожидания будет записано под именем "Последний шаг". // // Возвращаемое значение: -// ОписаниеЗамера - соответствие: +// ОписаниеЗамера - Соответствие: // КлючеваяОперация - имя ключевой операции. // ВремяНачала - время начала ключевой операции в миллисекундах. // ВремяПоследнегоЗамера - время последнего замера ключевой операции в миллисекундах. @@ -300,10 +300,10 @@ // Фиксирует замер вложенного шага длительной операции. // Параметры: -// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. -// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. -// ИмяШага - Строка - произвольное имя вложенного шага. -// Комментарий - Строка - произвольное дополнительное описание замера. +// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. +// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. +// ИмяШага - Строка - произвольное имя вложенного шага. +// Комментарий - Строка - произвольное дополнительное описание замера. // Процедура ЗафиксироватьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага, Комментарий = "") Экспорт @@ -340,10 +340,10 @@ // Завершает замер длительной операции. // Если указано имя шага, фиксирует его как отдельный вложенный шаг // Параметры: -// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. -// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. -// ИмяШага - Строка - произвольное имя вложенного шага. -// Комментарий - Строка - произвольное дополнительное описание замера. +// ОписаниеЗамера - Соответствие - должно быть получено вызовом метода НачатьЗамерДлительнойОперации. +// КоличествоДанных - Число - количество данных, например, строк, обработанных в ходе выполнения вложенного шага. +// ИмяШага - Строка - произвольное имя вложенного шага. +// Комментарий - Строка - произвольное дополнительное описание замера. // Процедура ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных, ИмяШага = "", Комментарий = "") Экспорт @@ -383,17 +383,17 @@ // в случае завершения сеанса часть замеров может быть потеряна. // // Параметры: -// АвтоЗавершение - Булево - признак автоматического завершения замера. +// АвтоЗавершение - Булево - признак автоматического завершения замера. // Истина - завершение замера будет выполнено автоматически // через глобальный обработчик ожидания. // Ложь - завершить замер необходимо явно вызовом процедуры // ЗавершитьЗамерВремени. -// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию +// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию // необходимо указать явно вызовом процедуры // УстановитьКлючевуюОперациюЗамера. // // Возвращаемое значение: -// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. +// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. // Функция НачатьЗамерВремени(АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) Экспорт @@ -441,18 +441,18 @@ // Результат замера будет записан в регистр сведений ЗамерыВремени. // // Параметры: -// Смещение - Число - дата и время начала замера в миллисекундах (см. ТекущаяУниверсальнаяДатаВМиллисекундах). -// АвтоЗавершение - Булево - признак автоматического завершения замера. +// Смещение - Число - дата и время начала замера в миллисекундах (см. ТекущаяУниверсальнаяДатаВМиллисекундах). +// АвтоЗавершение - Булево - признак автоматического завершения замера. // Истина - завершение замера будет выполнено автоматически // через глобальный обработчик ожидания. // Ложь - завершить замер необходимо явно вызовом процедуры // ЗавершитьЗамерВремени. -// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию +// КлючеваяОперация - Строка - имя ключевой операции. Если Неопределено> то ключевую операцию // необходимо указать явно вызовом процедуры // УстановитьКлючевуюОперациюЗамера. // // Возвращаемое значение: -// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. +// УникальныйИдентификатор - уникальный идентификатор замера, который позволяет идентифицировать замер. // Функция НачатьЗамерВремениСоСмещением(Смещение, АвтоЗавершение = Истина, КлючеваяОперация = Неопределено) diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl index 2fc54115c..be09ff692 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl @@ -124,7 +124,7 @@ // ОбластьДобавления - контейнер с элементами и группами отбора, например. // Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Представление - Строка - представление элемента компоновки данных. // Использование - Булево - использование элемента. @@ -181,7 +181,7 @@ // Параметры: // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). // Представление - Строка - представление элемента компоновки данных. -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Использование - Булево - использование элемента. // РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения. @@ -241,7 +241,7 @@ // ОбластьПоискаДобавления - контейнер с элементами и группами отбора, например. // Список.Отбор или группа в отборе. // ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда). -// ПравоеЗначение - произвольный - сравниваемое значение. +// ПравоеЗначение - Произвольный - сравниваемое значение. // ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения. // Представление - Строка - представление элемента компоновки данных. // Использование - Булево - использование элемента. diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl index 96d065cc3..aa15d8dcf 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl @@ -14,10 +14,10 @@ // // Параметры: // ИмяКлючевойОперации - Строка - название ключевой операции. -// ВыполненаСОшибкой - Булево - признак ключевой операции. +// ВыполненаСОшибкой - Булево - признак ключевой операции. // // Возвращаемое значение: -// СправочникСсылка.КлючевыеОперации +// СправочникСсылка.КлючевыеОперации // Функция ПолучитьКлючевуюОперациюПоИмени(ИмяКлючевойОперации, Длительная = Ложь) Экспорт @@ -100,7 +100,7 @@ // Возвращает массив существующих в конфигурации разделителей. // // Возвращаемое значение: -// ФиксированныйМассив Из Строка - массив имен общих реквизитов, которые +// ФиксированныйМассив из Строка - массив имен общих реквизитов, которые // являются разделителями. // Функция РазделителиКонфигурации() Экспорт diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl index d10d36c11..253ecc280 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl @@ -10,9 +10,9 @@ // Получает N худших замеров производительности за период. // Параметры: -// ДатаНачала - ДатаВремя - начало периода выборки. -// ДатаОкончания - ДатаВремя - окончание периода выборка. -// ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. +// ДатаНачала - ДатаВремя - начало периода выборки. +// ДатаОкончания - ДатаВремя - окончание периода выборка. +// ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. // Функция ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт Возврат РегистрыСведений.ЗамерыВремени.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); @@ -20,9 +20,9 @@ // Получает N худших замеров производительности технологической за период. // Параметры: -// ДатаНачала - ДатаВремя - начало периода выборки. -// ДатаОкончания - ДатаВремя - окончание периода выборка. -// ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. +// ДатаНачала - ДатаВремя - начало периода выборки. +// ДатаОкончания - ДатаВремя - окончание периода выборка. +// ТопApdexКоличество - Число - количество худших замеров, если но, то возвращаются все замеры. // Функция ПолучитьТопAPDEXТехнологический(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество) Экспорт Возврат РегистрыСведений.ЗамерыВремениТехнологические.ПолучитьТопAPDEX(ДатаНачала, ДатаОкончания, ПериодАгрегации, ТопApdexКоличество); @@ -32,9 +32,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -56,10 +53,7 @@ КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -70,7 +64,7 @@ // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. // Параметры: -// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки +// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); @@ -79,9 +73,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда @@ -142,7 +133,7 @@ // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. // Параметры: -// УстановленныеПараметры - Массив +// УстановленныеПараметры - Массив // Процедура УстановкаПараметровСеанса(ИмяПараметра, УстановленныеПараметры) Экспорт @@ -241,7 +232,7 @@ // Возвращает каталоги экспорта файлов с результатами замеров. // // Параметры: -// Нет +// Нет // // Возвращаемое значение: // Структура: @@ -303,9 +294,9 @@ // В противном случае возвращается пустая ссылка. // // Параметры: -// Нет +// Нет // Возвращаемое значение: -// СправочникСсылка.КлючевыеОперации +// СправочникСсылка.КлючевыеОперации // Функция ПолучитьЭлементОбщаяПроизводительностьСистемы() Экспорт @@ -373,7 +364,7 @@ // Параметры - КаталогиЭкспорта - Структура // // Возвращаемое значение: -// Массив +// Массив // Функция РазрешенияНаРесурсыСервера(Каталоги) @@ -463,8 +454,8 @@ // * ОтключитьИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочников ИдентификаторыОбъектовМетаданных // и ИдентификаторыОбъектовРасширений, процедуру выгрузки и загрузки в узлах РИБ. // Для частичного встраивания отдельных функций библиотеки в конфигурации без постановки на поддержку. -// * ОтключенныеПодсистемы - Соответствие - позволяет виртуально отключать подсистемы для целей -// тестирования. +// * ОтключенныеПодсистемы - Соответствие из КлючИЗначение - позволяет виртуально отключать +// подсистемы для целей тестирования. // Если подсистема отключена, то метод ОбщегоНазначения.ПодсистемаСуществует // вернет Ложь. В соответствии ключ - имя отключенной подсистемы, // значение необходимо установить в Истина. diff --git a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl new file mode 100644 index 000000000..d42ea1a25 --- /dev/null +++ b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/Module.bsl @@ -0,0 +1,388 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область ПрограммныйИнтерфейс + +// Переводит текст на другой язык с использованием сервиса перевода текста. +// +// Параметры: +// Текст - Строка - произвольный текст. +// ЯзыкПеревода - Строка - код языка в формате ISO 639-1, на который выполняется перевод. +// Например, "en". +// Если не указан, то перевод выполняется на текущий язык. +// ИсходныйЯзык - Строка - код языка в формате ISO 639-1, с которого выполняется перевод. +// Например, "ru". +// Если не указан, то язык будет установлен сервисом перевода текста. +// +// Возвращаемое значение: +// Строка +// +Функция ПеревестиТекст(Текст, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + Если Не ЗначениеЗаполнено(Текст) Тогда + Возврат Текст; + КонецЕсли; + + Возврат ПеревестиТексты(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Текст), ЯзыкПеревода, ИсходныйЯзык)[Текст]; + +КонецФункции + +// Переводит тексты на другой язык с использованием сервиса перевода текста. +// +// Параметры: +// Тексты - Массив из Строка - произвольные тексты. +// ЯзыкПеревода - Строка - код языка в формате ISO 639-1, на который выполняется перевод. +// Например, "en". +// Если не указан, то перевод выполняется на текущий язык. +// ИсходныйЯзык - Строка - код языка в формате ISO 639-1, с которого выполняется перевод. +// Например, "ru". +// Если не указан, то язык будет установлен сервисом перевода текста. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - текст; +// * Значение - Строка - перевод. +// +Функция ПеревестиТексты(Тексты, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + ПроверитьНастройки(); + + Если ЗначениеЗаполнено(ИсходныйЯзык) И ЯзыкПеревода = ИсходныйЯзык Тогда + НайденныеПереводы = Новый Соответствие; + Для Каждого Текст Из Тексты Цикл + НайденныеПереводы.Вставить(Текст, Текст); + КонецЦикла; + Возврат НайденныеПереводы; + КонецЕсли; + + НайденныеПереводы = НайтиПереводТекстов(Тексты, ЯзыкПеревода, ИсходныйЯзык); + ТекстыТребующиеПеревод = Новый Массив; + + Для Каждого Текст Из Тексты Цикл + Если ЗначениеЗаполнено(НайденныеПереводы[Текст]) Тогда + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(Текст) Тогда + ТекстыТребующиеПеревод.Добавить(Текст); + Иначе + НайденныеПереводы.Вставить(Текст, Текст); + КонецЕсли; + КонецЦикла; + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьСервисПереводаТекста") Тогда + Возврат НайденныеПереводы; + КонецЕсли; + + МодульСервисаПереводаТекста = МодульСервисаПереводаТекста(); + + ОчередьПеревода = Новый Массив; + Порция = Новый Массив; + РазмерПорции = 0; + МаксимальныйРазмерПорции = МодульСервисаПереводаТекста.МаксимальныйРазмерПорции(); + + Для Каждого Текст Из ТекстыТребующиеПеревод Цикл + Если РазмерПорции + СтрДлина(Текст) <= МаксимальныйРазмерПорции Тогда + Порция.Добавить(Текст); + РазмерПорции = РазмерПорции + СтрДлина(Текст); + Иначе + ОчередьПеревода.Добавить(Порция); + Порция = Новый Массив; + РазмерПорции = 0; + КонецЕсли; + КонецЦикла; + Если ЗначениеЗаполнено(Порция) Тогда + ОчередьПеревода.Добавить(Порция); + КонецЕсли; + + Для Каждого Порция Из ОчередьПеревода Цикл + Попытка + Переводы = МодульСервисаПереводаТекста.ПеревестиТексты(Порция, ЯзыкПеревода, ИсходныйЯзык); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, + Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Не удалось выполнить операцию по причине: + |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Иначе + ТекстОшибки = НСтр("ru = 'Не удалось выполнить операцию. Обратитесь к администратору.'"); + КонецЕсли; + + ВызватьИсключение ТекстОшибки; + КонецПопытки; + Для Каждого Перевод Из Переводы Цикл + СохранитьПереводТекста(Перевод.Ключ, Перевод.Значение, ИсходныйЯзык, ЯзыкПеревода); + НайденныеПереводы.Вставить(Перевод.Ключ, Перевод.Значение); + КонецЦикла; + КонецЦикла; + + Возврат НайденныеПереводы; + +КонецФункции + +// Возвращает список языков, поддерживаемых сервисом перевода текста. +// +// Возвращаемое значение: +// СписокЗначений: +// * Значение - код языка; +// * Представление - представление языка. +// +Функция ДоступныеЯзыки() Экспорт + + ПредставленияЯзыков = Новый Соответствие; + Для Каждого КодЯзыка Из ПолучитьДопустимыеКодыЛокализации() Цикл + ПредставленияЯзыков.Вставить(КодЯзыка, ПредставлениеКодаЛокализации(КодЯзыка)); + КонецЦикла; + + Результат = Новый СписокЗначений; + + МодульСервисаПереводаТекста = МодульСервисаПереводаТекста(); + Если МодульСервисаПереводаТекста = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + Попытка + ДоступныеЯзыки = МодульСервисаПереводаТекста.ДоступныеЯзыки(); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, + Метаданные.Перечисления.СервисыПереводаТекста, Константы.СервисПереводаТекста.Получить(), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр( + "ru = 'Не удалось выполнить операцию по причине: + |%1'"), КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + Иначе + ТекстОшибки = НСтр("ru = 'Не удалось выполнить операцию. Обратитесь к администратору.'"); + КонецЕсли; + + ВызватьИсключение ТекстОшибки; + КонецПопытки; + + Для Каждого КодЯзыка Из ДоступныеЯзыки Цикл + Представление = ПредставленияЯзыков[КодЯзыка]; + Если ЗначениеЗаполнено(Представление) Тогда + Результат.Добавить(КодЯзыка, ТРег(Представление)); + КонецЕсли; + КонецЦикла; + + Результат.СортироватьПоПредставлению(); + + Возврат Результат; + +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +Процедура УстановитьИспользованиеСервисаПереводаТекста(Использовать) Экспорт + + Константы.ИспользоватьСервисПереводаТекста.Установить(Использовать); + +КонецПроцедуры + +Функция ДоступенПереводТекста() Экспорт + + Возврат ПолучитьФункциональнуюОпцию("ИспользоватьСервисПереводаТекста"); + +КонецФункции + +Функция СервисПереводаТекста() Экспорт + + Возврат Константы.СервисПереводаТекста.Получить(); + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция НайтиПереводТекстов(Тексты, ЯзыкПеревода, ИсходныйЯзык) + + ТекстыДляПоиска = Новый Массив; + ИдентификаторыТекстов = Новый Соответствие; + Для Каждого Текст Из Тексты Цикл + ИдентификаторТекста = ИдентификаторТекста(Текст); + ТекстыДляПоиска.Добавить(ИдентификаторТекста); + ИдентификаторыТекстов.Вставить(Текст, ИдентификаторТекста); + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ + | КэшПереводов.Текст КАК Текст, + | КэшПереводов.Перевод КАК Перевод, + | КэшПереводов.ИсходныйЯзык КАК ИсходныйЯзык + |ИЗ + | РегистрСведений.КэшПереводов КАК КэшПереводов + |ГДЕ + | КэшПереводов.Текст В(&Текст) + | И КэшПереводов.ЯзыкПеревода = &ЯзыкПеревода + | И КэшПереводов.ИсходныйЯзык = &ИсходныйЯзык"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Текст", ТекстыДляПоиска); + Запрос.УстановитьПараметр("ЯзыкПеревода", ЯзыкПеревода); + Запрос.УстановитьПараметр("ИсходныйЯзык", ИсходныйЯзык); + + ПереведенныеТексты = Новый Соответствие; + + УстановитьПривилегированныйРежим(Истина); + Выборка = Запрос.Выполнить().Выбрать(); + УстановитьПривилегированныйРежим(Ложь); + + Пока Выборка.Следующий() Цикл + ПереведенныеТексты.Вставить(Выборка.Текст, Выборка.Перевод); + КонецЦикла; + + Результат = Новый Соответствие; + Для Каждого Текст Из Тексты Цикл + Результат.Вставить(Текст, ПереведенныеТексты[ИдентификаторыТекстов[Текст]]); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура СохранитьПереводТекста(Текст, Перевод, ИсходныйЯзык, ЯзыкПеревода) + + Если Не ЗначениеЗаполнено(Текст) Или Не ЗначениеЗаполнено(Перевод) Или Не ЗначениеЗаполнено(ЯзыкПеревода) Тогда + Возврат; + КонецЕсли; + + ИдентификаторТекста = ИдентификаторТекста(Текст); + + НаборЗаписей = РегистрыСведений.КэшПереводов.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Текст.Установить(ИдентификаторТекста); + НаборЗаписей.Отбор.ЯзыкПеревода.Установить(ЯзыкПеревода); + НаборЗаписей.Отбор.ИсходныйЯзык.Установить(ИсходныйЯзык); + Запись = НаборЗаписей.Добавить(); + Запись.Текст = ИдентификаторТекста; + Запись.ИсходныйЯзык = ИсходныйЯзык; + Запись.ЯзыкПеревода = ЯзыкПеревода; + Запись.Перевод = СокрЛП(Перевод); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.КэшПереводов"); + ЭлементБлокировки.УстановитьЗначение("Текст", ИдентификаторТекста); + ЭлементБлокировки.УстановитьЗначение("ИсходныйЯзык", ИсходныйЯзык); + ЭлементБлокировки.УстановитьЗначение("ЯзыкПеревода", ЯзыкПеревода); + + УстановитьПривилегированныйРежим(Истина); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + НаборЗаписей.Записать(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +Функция ИдентификаторТекста(Знач Текст) + + Возврат ОбщегоНазначения.СократитьСтрокуКонтрольнойСуммой(НРег(СокрЛП(Текст)), 50); + +КонецФункции + +Функция ПредставлениеЯзыка(КодЯзыка) Экспорт + + Если ПолучитьДопустимыеКодыЛокализации().Найти(КодЯзыка) <> Неопределено Тогда + Возврат ПредставлениеКодаЛокализации(КодЯзыка); + КонецЕсли; + + Возврат ""; + +КонецФункции + +Функция МодульСервисаПереводаТекста(Знач СервисПереводаТекста = Неопределено) + + Если СервисПереводаТекста = Неопределено Тогда + СервисПереводаТекста = Константы.СервисПереводаТекста.Получить(); + КонецЕсли; + + Возврат МодулиСервисовПереводаТекста()[СервисПереводаТекста]; + +КонецФункции + +// Имена модулей соответствуют именам значений перечисления СервисыПереводаТекста. +Функция МодулиСервисовПереводаТекста() + + Результат = Новый Соответствие; + + Для Каждого ОбъектМетаданных Из Метаданные.Перечисления.СервисыПереводаТекста.ЗначенияПеречисления Цикл + ИмяМодуля = ОбъектМетаданных.Имя; + Если Метаданные.ОбщиеМодули.Найти(ИмяМодуля) <> Неопределено Тогда + Результат.Вставить(Перечисления.СервисыПереводаТекста[ОбъектМетаданных.Имя], ОбщегоНазначения.ОбщийМодуль(ИмяМодуля)); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура ПроверитьНастройки() + + МодульСервисаПереводаТекста = МодульСервисаПереводаТекста(); + Если МодульСервисаПереводаТекста = Неопределено Или Не МодульСервисаПереводаТекста.НастройкаВыполнена() Тогда + ВызватьИсключение НСтр("ru = 'Не указаны настройки сервиса перевода текстов.'"); + КонецЕсли; + +КонецПроцедуры + +// Возвращаемое значение: +// Структура: +// * ИнструкцияПоПодключению - Строка +// * ПараметрыАвторизации - см. ПараметрыАвторизации +// +Функция НастройкиСервисаПереводаТекста(СервисПереводаТекста) Экспорт + + Настройки = Новый Структура; + Настройки.Вставить("ИнструкцияПоПодключению"); + Настройки.Вставить("ПараметрыАвторизации", ПараметрыАвторизации()); + МодульСервисаПереводаТекста(СервисПереводаТекста).ПриОпределенииНастроек(Настройки); + + Возврат Настройки; + +КонецФункции + +// Возвращаемое значение: +// ТаблицаЗначений: +// * Имя - Строка +// * Представление - Строка +// * Подсказка - Строка +// * ОтображениеПодсказки - ОтображениеПодсказки +// +Функция ПараметрыАвторизации() + + Результат = Новый ТаблицаЗначений; + Результат.Колонки.Добавить("Имя"); + Результат.Колонки.Добавить("Представление"); + Результат.Колонки.Добавить("Подсказка"); + Результат.Колонки.Добавить("ОтображениеПодсказки", Новый ОписаниеТипов("ОтображениеПодсказки")); + + Возврат Результат; + +КонецФункции + +Функция НастройкиАвторизации(Знач СервисПереводаТекста = Неопределено) Экспорт + + МодульСервисаПереводаТекста = МодульСервисаПереводаТекста(СервисПереводаТекста); + Если МодульСервисаПереводаТекста = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат МодульСервисаПереводаТекста(СервисПереводаТекста).НастройкиАвторизации(); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/ПереводТекстаНаДругиеЯзыки.mdo b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/ПереводТекстаНаДругиеЯзыки.mdo new file mode 100644 index 000000000..48477af12 --- /dev/null +++ b/SSL/src/CommonModules/ПереводТекстаНаДругиеЯзыки/ПереводТекстаНаДругиеЯзыки.mdo @@ -0,0 +1,11 @@ + + + ПереводТекстаНаДругиеЯзыки + + ru + Перевод текста на другие языки + + true + true + true + diff --git a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl index 11d495fe9..c955da9b8 100644 --- a/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКоманды/Module.bsl @@ -165,7 +165,7 @@ // Задает условия видимости команды на форме в зависимости от контекста. // // Параметры: -// Команда - СтрокаТаблицыЗначений - команда, для которой добавляется условие видимости. +// Команда - СтрокаТаблицыЗначений: см. УправлениеПечатью.СоздатьКоллекциюКомандПечати // Реквизит - Строка - имя реквизита объекта. // Значение - Произвольный - значение реквизита объекта. Параметр обязательный для всех видов // сравнения кроме Заполнено и НеЗаполнено. @@ -274,18 +274,18 @@ // // Параметры: // ПолноеИмя - Строка - полное имя объекта метаданных. -// НастройкиПрограммногоИнтерфейса - Произвольный - результат выполнения функции -// НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов(). +// НастройкиПрограммногоИнтерфейса - см. ПодключаемыеКоманды.НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов. // // Возвращаемое значение: // Структура - настройки интеграции этого объекта. // Состав полей см. в блоке "Параметры процедуры ПриОпределенииНастроек" -// процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов(). +// процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииСоставаНастроекПодключаемыхОбъектов. // Дополнительно содержит следующие поля: // * Вид - Строка - вид имя объекта метаданных в верхнем регистре. // * ПолноеИмя - Строка - полное имя объекта метаданных. // * Менеджер - ОбработкаМенеджер // - ОтчетМенеджер - менеджер объекта метаданных. +// Неопределено - если настройки не удалось получить. // Функция НастройкиПодключаемогоОбъекта(ПолноеИмя, НастройкиПрограммногоИнтерфейса = Неопределено) Экспорт ЧастиИмени = СтрРазделить(ПолноеИмя, "."); @@ -357,8 +357,7 @@ // // Параметры: // ОбъектМетаданных - ОбъектМетаданных - объект метаданных, к которому подключены источники команд. -// Источники - ДеревоЗначений - см. описание одноименного параметра -// процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники. // ПодключенныеОбъекты - см. ПодключаемыеКоманды.ТаблицаПодключаемыхОбъектов // НастройкиПрограммногоИнтерфейса - см. ПодключаемыеКоманды.НастройкиПрограммногоИнтерфейсаПодключаемыхОбъектов // @@ -408,7 +407,7 @@ // Шаблон сведений об объектах метаданных - источников команд. // // Возвращаемое значение: -// См. описание 2 параметра процедуры ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту(). +// см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники. // Функция ДеревоИсточниковКоманд() Экспорт Результат = Новый ДеревоЗначений; @@ -774,7 +773,7 @@ БыстрыйПоискСведенийОПодменю.Вставить(НРег(ИмяПодменюПоУмолчанию), СведенияОПодменюПоУмолчанию); КонецЕсли; - Для Каждого Команда Из КомандыВида Цикл + Для Каждого Команда Из КомандыВида Цикл // СтрокаТаблицыЗначений: см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды Если ПустаяСтрока(Команда.Подменю) Тогда СведенияОПодменюКоманды = СведенияОПодменюПоУмолчанию; Иначе @@ -862,7 +861,7 @@ КонецЕсли; ЭтоКоманднаяПанель = (СведенияОПодменю.Подменю = КоманднаяПанель); КомандаФормы = СведенияОПодменю.ПоследняяКоманда; - Подменю = СведенияОПодменю.Подменю; + Подменю = СведенияОПодменю.Подменю; // ГруппаФормы Если Не ЭтоКоманднаяПанель Тогда Если СведенияОПодменю.ВыведеноКоманд = 1 И КомандаФормы <> Неопределено Тогда @@ -1455,7 +1454,7 @@ Результат = Результат + "Форма"+СтрСоединить(ЧастиПутиЗначениеПометки, ""); Возврат Результат; -КонецФункции // () +КонецФункции #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl index 6bccfabba..87b0743ea 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыКлиент/Module.bsl @@ -42,7 +42,7 @@ // Команда - КомандаФормы - выполняемая команда. // Источник - ТаблицаФормы // - ДанныеФормыСтруктура -// - Ссылка +// - ЛюбаяСсылка // - Массив - объект или список формы с полем "Ссылка", // Ссылка или массив ссылок. // @@ -80,7 +80,7 @@ // Параметры: // Форма - ФормаКлиентскогоПриложения - форма, на которой необходимо обновить команды печати. // Объект - ДанныеФормыСтруктура -// - Ссылка - объект формы с полем "Ссылка". +// - ЛюбаяСсылка - объект формы с полем "Ссылка". // ПараметрыЗаписи - Структура - произвольные параметры записи. См. описание события ПослеЗаписи в синтакс-помощнике. // Процедура ПослеЗаписи(Форма, Объект, ПараметрыЗаписи) Экспорт diff --git a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl index e76bfc309..573593ba1 100644 --- a/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПодключаемыеКомандыПереопределяемый/Module.bsl @@ -113,6 +113,11 @@ // * Картинка - Картинка - картинка команды. Необязательный. // * СочетаниеКлавиш - СочетаниеКлавиш - сочетание клавиш для быстрого вызова команды. Необязательный. // * ТолькоВоВсехДействиях - Булево - отображать команду только в меню Еще. +// * ЗначениеПометки - Строка - путь к реквизиту, где содержится значение пометки команды. Если источником команд является +// Таблица формы, то возможно использовать параметр %Источник%. +// Пример: +// - ЗначениеПометок.%Источник%, где ЗначениеПометок - реквизит формы произвольного типа, в котором содержится структура. +// - Объект.ПометкаУдаления, где Объект - реквизит формы с типом СправочникОбъект. // // Настройки видимости и доступности: // * ТипПараметра - ОписаниеТипов - типы объектов, для которых предназначена эта команда. @@ -138,12 +143,12 @@ // В этом случае в параметре выполнения будет передан список ссылок. // Необязательный. Значение по умолчанию - Истина. // * РежимЗаписи - Строка - действия, связанные с записью объекта, которые выполняются перед обработчиком команды: -// ** "НеЗаписывать" - объект не записывается, а в параметрах обработчика вместо ссылок передается +// "НеЗаписывать" - объект не записывается, а в параметрах обработчика вместо ссылок передается // вся форма. В этом режиме рекомендуется работать напрямую с формой, // которая передается в структуре 2-го параметра обработчика команды. -// ** "ЗаписыватьТолькоНовые" - записывать новые объекты. -// ** "Записывать" - записывать новые и модифицированные объекты. -// ** "Проводить" - проводить документы. +// "ЗаписыватьТолькоНовые" - записывать новые объекты. +// "Записывать" - записывать новые и модифицированные объекты. +// "Проводить" - проводить документы. // Перед записью и проведением у пользователя запрашивается подтверждение. // Необязательный. Значение по умолчанию - "Записывать". // * ТребуетсяРаботаСФайлами - Булево - если Истина, то в веб-клиенте предлагается diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl index ab77ccd66..1690a7762 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублей/Module.bsl @@ -225,7 +225,7 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. // // Параметры: -// ВидыПодключаемыхКоманд - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд.ВидыПодключаемыхКоманд +// ВидыПодключаемыхКоманд - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд.ВидыПодключаемыхКоманд // Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт @@ -246,10 +246,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт @@ -333,7 +333,7 @@ // // Параметры: // Параметры - Структура: -// * ПарыЗамен - Соответствие: +// * ПарыЗамен - Соответствие из КлючИЗначение: // * Ключ - ЛюбаяСсылка - что ищем (дубль). // * Значение - ЛюбаяСсылка - на что заменяем (оригинал). // Ссылки сами на себя и пустые ссылки для поиска будут проигнорированы. @@ -495,11 +495,11 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// * Ключ - Тип -// * ТипРеквизита - Строка -// * ИмяРеквизита - Строка -// * Используется - Булево -// * Метаданные - ОбъектМетаданных +// * Ключ - Строка +// * ТипРеквизита - Тип +// * ИмяРеквизита - Строка +// * Используется - Булево +// * Метаданные - ОбъектМетаданных // Функция СвязиПодчиненныхОбъектовПоТипам() Экспорт @@ -605,11 +605,11 @@ КонецПроцедуры // Параметры: -// ТаблицаЗамен - ТаблицаЗначений: -// * Ссылка - ЛюбаяСсылка -// * Замена - ЛюбаяСсылка -// ПарыЗамен - Соответствие -// НеподобранныеЗамены - Массив из ЛюбаяСсылка +// ТаблицаЗамен - ТаблицаЗначений: +// * Ссылка - ЛюбаяСсылка +// * Замена - ЛюбаяСсылка +// ПарыЗамен - Соответствие +// НеподобранныеЗамены - Массив из ЛюбаяСсылка // Процедура ДобавитьНайденныеКлючиВДубли(ТаблицаЗамен, ПарыЗамен, НеподобранныеЗамены) @@ -626,24 +626,24 @@ КонецПроцедуры // Параметры: -// НайденныйДубль - СтрокаТаблицыЗначений: -// * Ссылка - ЛюбаяСсылка -// * Замена - ЛюбаяСсылка -// ОписаниеПодчиненногоОбъекта - Произвольный -// ИспользуемыеСвязи - ТаблицаЗначений: +// НайденныйДубль - СтрокаТаблицыЗначений: +// * Ссылка - ЛюбаяСсылка +// * Замена - ЛюбаяСсылка +// ОписаниеПодчиненногоОбъекта - Произвольный +// ИспользуемыеСвязи - ТаблицаЗначений: // * Ключ - Тип // * ТипРеквизита - Строка // * ИмяРеквизита - Строка // * Используется - Булево // * Метаданные - ОбъектМетаданных // Возвращаемое значение: -// Структура: +// Структура: // * ИспользуемыеСвязи - ТаблицаЗначений: -// ** Ключ - Тип -// ** ТипРеквизита - Строка -// ** ИмяРеквизита - Строка -// ** Используется - Булево -// ** Метаданные - ОбъектМетаданных +// ** Ключ - Тип +// ** ТипРеквизита - Строка +// ** ИмяРеквизита - Строка +// ** Используется - Булево +// ** Метаданные - ОбъектМетаданных // * ЗаменяемоеЗначение - ЛюбаяСсылка // Функция НовыйПараметрыЗамены(НайденныйДубль, ОписаниеПодчиненногоОбъекта, ИспользуемыеСвязи) @@ -688,31 +688,31 @@ Для каждого КлючевойРеквизит Из ОписаниеПодчиненногоОбъекта.КлючевыеРеквизиты Цикл - Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ОБЪЕДИНИТЬ - |ВЫБРАТЬ - | Таб.Ссылка КАК Ссылка - | {НеИзменяемыеРеквизиты} - | {ИзменяемыеРеквизиты} + Значение = "ОБЪЕДИНИТЬ" // @query-part + + СтрЗаменить(" ВЫБРАТЬ + | Таб.Ссылка КАК Ссылка, + | &НеИзменяемыеРеквизиты, + | &ИзменяемыеРеквизиты |ИЗ - | {ТаблицаКлюча} КАК Таб + | #ТаблицаКлюча КАК Таб |ГДЕ - | Таб.%1 В + | &КлючевойРеквизит В | (ВЫБРАТЬ | Таб.Оригинал | ИЗ - | ТаблицаЗамен КАК Таб)", КлючевойРеквизит); + | ТаблицаЗамен КАК Таб)", "&КлючевойРеквизит","Таб." + КлючевойРеквизит); ЗначениеКлючей = ЗначениеКлючей + Значение; - Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("И Таб.%1 = Замена.%1 ", КлючевойРеквизит); - СвязиПоКлючу = СвязиПоКлючу + Значение; + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("Таб.%1 = Замена.%1 ", КлючевойРеквизит); + СвязиПоКлючу = СвязиПоКлючу + ?(ПустаяСтрока(СвязиПоКлючу), Значение, "И " + Значение); Если ИзменяемыеРеквизитыМассив.Найти(КлючевойРеквизит) <> Неопределено Тогда - Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(",Таб.%1 КАК %1", КлючевойРеквизит); - ИзменяемыеРеквизиты = ИзменяемыеРеквизиты + Значение; + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("Таб.%1 КАК %1", КлючевойРеквизит); + ИзменяемыеРеквизиты = ИзменяемыеРеквизиты + ?(ПустаяСтрока(ИзменяемыеРеквизиты),Значение, ","+Значение); - Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(",ВЫБОР КОГДА Замена%1.Оригинал IS NULL ТОГДА Таб.%1 ИНАЧЕ Замена%1.Дубль КОНЕЦ КАК %1", КлючевойРеквизит); - ЗначениеИзменяемыеРеквизиты = ЗначениеИзменяемыеРеквизиты + Значение; + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("ВЫБОР КОГДА Замена%1.Оригинал IS NULL ТОГДА Таб.%1 ИНАЧЕ Замена%1.Дубль КОНЕЦ КАК %1", КлючевойРеквизит); + ЗначениеИзменяемыеРеквизиты = ЗначениеИзменяемыеРеквизиты + ?(ПустаяСтрока(ЗначениеИзменяемыеРеквизиты),Значение, ","+Значение);; Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗамен КАК Замена%1 |ПО Таб.%1 = Замена%1.Оригинал", КлючевойРеквизит); @@ -720,22 +720,21 @@ Иначе - Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(",Таб.%1 КАК %1", КлючевойРеквизит); - НеИзменяемыеРеквизиты = НеИзменяемыеРеквизиты + Значение; + Значение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("Таб.%1 КАК %1", КлючевойРеквизит); + НеИзменяемыеРеквизиты = НеИзменяемыеРеквизиты + ?(ПустаяСтрока(НеИзменяемыеРеквизиты),Значение, ","+Значение); КонецЕсли; КонецЦикла; - ВставитьВТекстЗапроса(ТекстЗапроса, "ЗначениеКлючей", ЗначениеКлючей); - ВставитьВТекстЗапроса(ТекстЗапроса, "ЗначениеИзменяемыеРеквизиты", ЗначениеИзменяемыеРеквизиты); - ВставитьВТекстЗапроса(ТекстЗапроса, "СоединениеЗначениеЗаменяемыхРеквизитов", СоединениеЗначениеЗаменяемыхРеквизитов); - ВставитьВТекстЗапроса(ТекстЗапроса, "СвязиПоКлючу", СвязиПоКлючу); - ВставитьВТекстЗапроса(ТекстЗапроса, "НеИзменяемыеРеквизиты", НеИзменяемыеРеквизиты); - ВставитьВТекстЗапроса(ТекстЗапроса, "ИзменяемыеРеквизиты", ИзменяемыеРеквизиты); + ВставитьВТекстЗапроса(ТекстЗапроса, "#ЗначениеКлючей", ЗначениеКлючей); + ВставитьВТекстЗапроса(ТекстЗапроса, "ЛЕВОЕ СОЕДИНЕНИЕ #СоединениеЗначениеЗаменяемыхРеквизитов ПО ИСТИНА", СоединениеЗначениеЗаменяемыхРеквизитов); + ВставитьВТекстЗапроса(ТекстЗапроса, "&СвязиПоКлючу", СвязиПоКлючу); + ВставитьВТекстЗапроса(ТекстЗапроса, "&НеИзменяемыеРеквизиты", ?(ПустаяСтрока(НеИзменяемыеРеквизиты), "НЕОПРЕДЕЛЕНО", НеИзменяемыеРеквизиты)); + ВставитьВТекстЗапроса(ТекстЗапроса, "&ИзменяемыеРеквизиты", ?(ПустаяСтрока(ИзменяемыеРеквизиты), "НЕОПРЕДЕЛЕНО", ИзменяемыеРеквизиты)); - ВставитьВТекстЗапроса(ТекстЗапроса, "ТаблицаКлюча", ТаблицаКлюча); - ВставитьВТекстЗапроса(ТекстЗапроса, "ИмяКлюча", ИмяКлюча); + ВставитьВТекстЗапроса(ТекстЗапроса, "#ТаблицаКлюча", ТаблицаКлюча); + ВставитьВТекстЗапроса(ТекстЗапроса, "#ИмяКлюча", ИмяКлюча); Возврат ТекстЗапроса; @@ -743,46 +742,47 @@ Функция ШаблонЗапроса() - Возврат "// НАЧАЛО {ИмяКлюча} + Возврат "// НАЧАЛО #ИмяКлюча |ВЫБРАТЬ - | Таб.Ссылка КАК Ссылка - | {НеИзменяемыеРеквизиты} - | {ИзменяемыеРеквизиты} - |ПОМЕСТИТЬ {ИмяКлюча}_ИсходныеДанные + | Таб.Ссылка КАК Ссылка, + | &НеИзменяемыеРеквизиты, + | &ИзменяемыеРеквизиты + |ПОМЕСТИТЬ #ИмяКлюча_ИсходныеДанные |ИЗ - | {ТаблицаКлюча} КАК Таб + | #ТаблицаКлюча КАК Таб |ГДЕ - | ЛОЖЬ + | ЛОЖЬ" + " | - |{ЗначениеКлючей} + |#ЗначениеКлючей |; + |" + " |ВЫБРАТЬ - | Таб.Ссылка КАК Ссылка - | {НеИзменяемыеРеквизиты} - | {ЗначениеИзменяемыеРеквизиты} - |ПОМЕСТИТЬ {ИмяКлюча}_ЗначениеРеквизитовПослеЗамены + | Таб.Ссылка КАК Ссылка, + | &НеИзменяемыеРеквизиты, + | &ИзменяемыеРеквизиты + |ПОМЕСТИТЬ #ИмяКлюча_ЗначениеРеквизитовПослеЗамены |ИЗ - | {ИмяКлюча}_ИсходныеДанные КАК Таб - | {СоединениеЗначениеЗаменяемыхРеквизитов} + | #ИмяКлюча_ИсходныеДанные КАК Таб + | ЛЕВОЕ СОЕДИНЕНИЕ #СоединениеЗначениеЗаменяемыхРеквизитов ПО ИСТИНА |; |ВЫБРАТЬ | Таб.Ссылка КАК Ссылка, - | Замена.Ссылка КАК Замена - | {НеИзменяемыеРеквизиты} - | {ИзменяемыеРеквизиты} + | Замена.Ссылка КАК Замена, + | &НеИзменяемыеРеквизиты, + | &ИзменяемыеРеквизиты |ИЗ - | {ИмяКлюча}_ЗначениеРеквизитовПослеЗамены КАК Таб - | ЛЕВОЕ СОЕДИНЕНИЕ {ТаблицаКлюча} КАК Замена + | #ИмяКлюча_ЗначениеРеквизитовПослеЗамены КАК Таб + | ЛЕВОЕ СОЕДИНЕНИЕ #ТаблицаКлюча КАК Замена | ПО Таб.Ссылка <> Замена.Ссылка - | {СвязиПоКлючу} - |//КОНЕЦ {ИмяКлюча} + | И &СвязиПоКлючу + |//КОНЕЦ #ИмяКлюча |"; КонецФункции Процедура ВставитьВТекстЗапроса(ТекстЗапроса, ИмяПараметра, Текст) - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "{"+ИмяПараметра+"}", Текст); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ИмяПараметра, Текст); КонецПроцедуры @@ -797,7 +797,15 @@ ТаблицаЗамен = ТаблицыЗамен[КлючПоиска]; Если ТаблицаЗамен = Неопределено Тогда - ЗапросТаблицы = Новый Запрос("ВЫБРАТЬ Таб.Ссылка КАК Оригинал, Таб.Ссылка КАК Дубль ИЗ " + ИмяТаблицыКлючевогоРеквизита + " КАК Таб ГДЕ ЛОЖЬ"); + ТекстЗапроса = "ВЫБРАТЬ + | Таб.Ссылка КАК Оригинал, + | Таб.Ссылка КАК Дубль + |ИЗ + | #ИмяТаблицыКлючевогоРеквизита КАК Таб + |ГДЕ + | ЛОЖЬ"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяТаблицыКлючевогоРеквизита", ИмяТаблицыКлючевогоРеквизита); + ЗапросТаблицы = Новый Запрос(ТекстЗапроса); ТаблицаЗамен = ЗапросТаблицы.Выполнить().Выгрузить(); ТаблицыЗамен.Вставить(КлючПоиска, ТаблицаЗамен); КонецЕсли; diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl index 26d590ea5..83bac31d8 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублейКлиент/Module.bsl @@ -15,7 +15,7 @@ // - Массив из ЛюбаяСсылка // - СписокЗначений - список элементов к объединению. // Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". -// ДополнительныеПараметры - см. ПодключаемыеКомандыКлиентСервер.ПараметрыВыполненияКоманды +// ДополнительныеПараметры - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ОбъединитьВыделенные(Знач ОбъединяемыеЭлементы, ДополнительныеПараметры = Неопределено) Экспорт @@ -46,7 +46,7 @@ // - Массив // - СписокЗначений - список элементов, которые нужно заменить и удалить. // Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". -// ДополнительныеПараметры - см. ПодключаемыеКомандыКлиентСервер.ПараметрыВыполненияКоманды +// ДополнительныеПараметры - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ЗаменитьВыделенные(Знач ЗаменяемыеЭлементы, ДополнительныеПараметры = Неопределено) Экспорт @@ -80,7 +80,7 @@ // - Массив из ЛюбаяСсылка // - СписокЗначений - список элементов для анализа. // Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". -// ПараметрыОткрытия - Структура - необязательный. Параметры открытия формы. Состоит из необязательных полей. +// ПараметрыОткрытия - Структура - параметры открытия формы. Состоит из необязательных полей. // Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна, // соответствующих параметрам функции ОткрытьФорму. // @@ -120,14 +120,14 @@ #Область СлужебныеПроцедурыИФункции // Параметры: -// Элементы - ДанныеФормыКоллекция: -// * Ссылка - ЛюбаяСсылка +// Элементы - ДанныеФормыКоллекция: +// * Ссылка - ЛюбаяСсылка // - СписокЗначений из ЛюбаяСсылка // - ТаблицаФормы -// * Ссылка - ЛюбаяСсылка +// * Ссылка - ЛюбаяСсылка // - Массив из ЛюбаяСсылка // Возвращаемое значение: -// СписокЗначений, Массив из ЛюбаяСсылка, СписокЗначений +// СписокЗначений, Массив из ЛюбаяСсылка, СписокЗначений // Функция МассивСсылок(Знач Элементы) diff --git a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl index 3611eace1..bccc6e5ce 100644 --- a/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПоискИУдалениеДублейПереопределяемый/Module.bsl @@ -13,10 +13,10 @@ // и ВозможностьЗаменыЭлементов. // // Параметры: -// Объекты - Соответствие - объекты, в модулях менеджеров которых размещены экспортные процедуры: -// ** Ключ - Строка - полное имя объекта метаданных, подключенного к подсистеме "Поиск и удаление дублей". +// Объекты - Соответствие из КлючИЗначение - объекты, в модулях менеджеров которых размещены экспортные процедуры: +// * Ключ - Строка - полное имя объекта метаданных, подключенного к подсистеме "Поиск и удаление дублей". // Например, "Справочник.Контрагенты". -// ** Значение - Строка - имена экспортных процедур-обработчиков, определенных в модуле менеджера: +// * Значение - Строка - имена экспортных процедур-обработчиков, определенных в модуле менеджера: // "ПараметрыПоискаДублей", // "ПриПоискеДублей", // "ВозможностьЗаменыЭлементов". @@ -42,7 +42,7 @@ // см. ПоискИУдалениеДублейКлиент.ОбъединитьВыделенные и ПоискИУдалениеДублейКлиент.ЗаменитьВыделенные // // Параметры: -// Объекты - Массив из ОбъектМетаданных +// Объекты - Массив из ОбъектМетаданных // // Пример: // Объекты.Добавить(Метаданные.Справочники._ДемоНоменклатура); @@ -62,7 +62,9 @@ // Параметры: // ИмяОбъектаМетаданных - Строка - полное имя ссылочного объекта метаданных, замена элементов которого производится. // Например, "Справочник.Контрагенты". -// ПарыЗамен - Соответствие - Ключ - что будет заменено, значение - на что будет заменено. +// ПарыЗамен - Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - что будет заменено +// * Значение - ЛюбаяСсылка - на что будет заменено // ПараметрыЗамены - Структура - действие с заменяемыми элементами: // * СпособУдаления - Строка - может принимать значения: // "Непосредственно" - Если после замены ссылка нигде не используется, @@ -70,8 +72,9 @@ // "Пометка" - Если после замены ссылка не используется, то // она будет помечена на удаление. // При других значениях заменяемая ссылка не будет изменена. -// НедопустимыеЗамены - Соответствие - выходной параметр. Ключ - заменяемая ссылка, значение - строковое описание, -// почему замена недопустима. Если все замены допустимы, то возвращается пустое соответствие. +// НедопустимыеЗамены - Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - заменяемая ссылка +// * Значение - Строка - описание, почему замена недопустима. Если все замены допустимы, то возвращается пустое соответствие // Процедура ПриОпределенииВозможностиЗаменыЭлементов(Знач ИмяОбъектаМетаданных, Знач ПарыЗамен, Знач ПараметрыЗамены, НедопустимыеЗамены) Экспорт @@ -99,11 +102,11 @@ // По умолчанию, 80. // ** ДлинаНебольшихСтрок - Число - если длина строки меньше или равна заданной, то строка считается небольшой. // По умолчанию, 30. -// ** СловаИсключения - Массив Из Строка - список слов, которые следует пропускать при сравнении на подобие. +// ** СловаИсключения - Массив из Строка - список слов, которые следует пропускать при сравнении на подобие. // Например, для организаций и контрагентов это могут быть: ИП, ГУП, ООО, ОАО и т.д. // * КомпоновщикОтбора - КомпоновщикНастроекКомпоновкиДанных - инициализированный компоновщик для // предварительного отбора. Может быть изменен, например, для усиления отборов. -// * ОграниченияСравнения - Массив Из Структура - описания прикладных правил-ограничений: +// * ОграниченияСравнения - Массив из Структура - описания прикладных правил-ограничений: // ** Представление - Строка - текстовое описание правила-ограничения. // ** ДополнительныеПоля - Строка - список реквизитов через запятую, значения которых // необходимы для анализа в ПриПоискеДублей. diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl index 6057d231e..3ed579fb9 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -142,10 +142,8 @@ #Область ОбработчикиСобытийПодсистемКонфигурации -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -221,10 +219,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -554,7 +548,7 @@ Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '%1: %2'"), - МетаданныеОбъекта.ПредставлениеОбъекта, + ОбщегоНазначения.ПредставлениеОбъекта(МетаданныеОбъекта), Строка(Значение)); КонецЕсли; diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl index e1acf959d..9a5914e24 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl @@ -69,13 +69,13 @@ // // Возвращаемое значение: // Соответствие: -// ИспользоватьПрокси - использовать ли прокси-сервер. -// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. -// Сервер - адрес прокси-сервера. -// Порт - порт прокси-сервера. -// Пользователь - имя пользователя для авторизации на прокси-сервере. -// Пароль - пароль пользователя. +// ИспользоватьПрокси - использовать ли прокси-сервер. +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. +// Сервер - адрес прокси-сервера. +// Порт - порт прокси-сервера. +// Пользователь - имя пользователя для авторизации на прокси-сервере. +// Пароль - пароль пользователя. // Функция НастройкиПроксиНаКлиенте() Экспорт @@ -119,13 +119,13 @@ // // Возвращаемое значение: // Соответствие: -// ИспользоватьПрокси - использовать ли прокси-сервер. -// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. -// Сервер - адрес прокси-сервера. -// Порт - порт прокси-сервера. -// Пользователь - имя пользователя для авторизации на прокси-сервере. -// Пароль - пароль пользователя. +// ИспользоватьПрокси - использовать ли прокси-сервер. +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. +// Сервер - адрес прокси-сервера. +// Порт - порт прокси-сервера. +// Пользователь - имя пользователя для авторизации на прокси-сервере. +// Пароль - пароль пользователя. // Функция НастройкиПроксиНаСервере() Экспорт diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl index e5830542c..694f4c813 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl @@ -197,15 +197,15 @@ // // Параметры: // НастройкаПроксиСервера - Соответствие: -// ИспользоватьПрокси - использовать ли прокси-сервер. -// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. -// Сервер - адрес прокси-сервера. -// Порт - порт прокси-сервера. -// Пользователь - имя пользователя для авторизации на прокси-сервере. -// Пароль - пароль пользователя. -// ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. -// Протокол - строка - протокол для которого устанавливаются параметры прокси сервера, например "http", "https", +// ИспользоватьПрокси - использовать ли прокси-сервер. +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. +// Сервер - адрес прокси-сервера. +// Порт - порт прокси-сервера. +// Пользователь - имя пользователя для авторизации на прокси-сервере. +// Пароль - пароль пользователя. +// ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. +// Протокол - Строка - протокол для которого устанавливаются параметры прокси сервера, например "http", "https", // "ftp". // // Возвращаемое значение: diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl index 301eb1b5a..db86a1f3c 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl @@ -58,7 +58,7 @@ // Функция для получения файла из сети Интернет. // // Параметры: -// URL - строка - url файла в формате: +// URL - Строка - url файла в формате: // НастройкиПолучения - Структура: // * ПутьДляСохранения - Строка - путь на сервере (включая имя файла), для сохранения скачанного файла. // * Пользователь - Строка - пользователь от имени которого установлено соединение. @@ -82,9 +82,9 @@ // если не задано будет сгенерировано автоматически. // // Возвращаемое значение: -// структура -// успех - булево - успех или неудача операции -// строка - строка - в случае успеха либо строка-путь сохранения файла +// Структура: +// успех - Булево - успех или неудача операции +// Строка - строка - в случае успеха либо строка-путь сохранения файла // либо адрес во временном хранилище // в случае неуспеха сообщение об ошибке. // @@ -111,7 +111,7 @@ // Функция для получения файла из сети Интернет. // // Параметры: -// URL - строка - url файла в формате: [Протокол://]<Сервер>/<Путь к файлу на сервере>. +// URL - Строка - url файла в формате: [Протокол://]<Сервер>/<Путь к файлу на сервере>. // // НастройкаСоединения - Соответствие - // ЗащищенноеСоединение* - булево - соединение защищенное. @@ -139,9 +139,9 @@ // либо адрес во временном хранилище, если не задано будет сгенерировано автоматически. // // Возвращаемое значение: -// структура -// успех - булево - успех или неудача операции -// строка - строка - в случае успеха либо строка-путь сохранения файла +// Структура: +// успех - Булево - успех или неудача операции +// Строка - строка - в случае успеха либо строка-путь сохранения файла // либо адрес во временном хранилище // в случае неуспеха сообщение об ошибке. // @@ -494,10 +494,11 @@ // Функция, заполняющая структуру по параметрам. // // Параметры: -// УспехОперации - булево - успех или неуспех операции. -// СообщениеПуть - строка +// УспехОперации - Булево - успех или неуспех операции. +// СообщениеПуть - Строка // -// Возвращаемое значение - структура: +// Возвращаемое значение: +// Структура: // поле успех - булево // поле путь - строка. // @@ -798,14 +799,14 @@ // // Параметры: // НастройкаПроксиСервера - Соответствие: -// ИспользоватьПрокси - использовать ли прокси-сервер. -// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. -// Сервер - адрес прокси-сервера. -// Порт - порт прокси-сервера. -// Пользователь - имя пользователя для авторизации на прокси-сервере. -// Пароль - пароль пользователя. -// ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. +// ИспользоватьПрокси - использовать ли прокси-сервер. +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов. +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера. +// Сервер - адрес прокси-сервера. +// Порт - порт прокси-сервера. +// Пользователь - имя пользователя для авторизации на прокси-сервере. +// Пароль - пароль пользователя. +// ИспользоватьАутентификациюОС - Булево - признак использования аутентификации средствами операционной системы. // URLИлиПротокол - Строка - адрес ресурса или протокол, для которого устанавливаются параметры прокси сервера, // например "https://1c.ru", "http", "https", "ftp", "ftps". // diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl index 0e2683491..0b6b62728 100644 --- a/SSL/src/CommonModules/Пользователи/Module.bsl +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -274,6 +274,35 @@ КонецФункции +// Следует вызывать в начале процедур http-сервисов, веб-сервисов, com-соединений, +// если они используются для удаленного подключения обычных пользователей, +// чтобы обеспечить контроль ограничений на вход (по дате, по активности и т.д.), +// обновить дату последнего входа, а также сразу заполнить параметры сеанса +// АвторизованныйПользователь, ТекущийПользователь, ТекущийВнешнийПользователь. +// +// Процедура вызывается автоматически только при интерактивном входе, +// то есть когда ТекущийРежимЗапуска() <> Неопределено. +// +// Параметры: +// ВызыватьИсключение - Булево - вызывать исключение в случае ошибки авторизации, +// в противном случае возвращать текст ошибки. +// Возвращаемое значение: +// Структура: +// * ОшибкаАвторизации - Строка - текст ошибки, если заполнено. +// * ТребуетсяСменитьПароль - Булево - если Истина, тогда это ошибка устаревания пароля. +// +Функция АвторизоватьТекущегоПользователяПриВходе(ВызыватьИсключение = Истина) Экспорт + + Результат = ПользователиСлужебный.АвторизоватьТекущегоПользователяПриВходе(Истина); + + Если ВызыватьИсключение И ЗначениеЗаполнено(Результат.ОшибкаАвторизации) Тогда + ВызватьИсключение Результат.ОшибкаАвторизации; + КонецЕсли; + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые в работе элементов управляемых форм. @@ -838,6 +867,10 @@ Свойства.Вставить("ЗапрещеноИзменятьПароль", Ложь); Свойства.Вставить("АутентификацияОС", Ложь); Свойства.Вставить("ПользовательОС", ""); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Свойства.Вставить("ЗапрещеноВосстанавливатьПароль", Истина); + Свойства.Вставить("АдресЭлектроннойПочты", ""); + КонецЕсли; Свойства.Вставить("ОсновнойИнтерфейс", ?(Метаданные.ОсновнойИнтерфейс = Неопределено, "", Метаданные.ОсновнойИнтерфейс.Имя)); @@ -1401,7 +1434,7 @@ // - УникальныйИдентификатор - проверка только для заданного идентификатора. // // НайденныеИдентификаторы - Неопределено - при нахождении ошибок вызывается исключение. -// - Соответствие - при нахождении ошибок исключение не вызывается, +// - Соответствие из КлючИЗначение - при нахождении ошибок исключение не вызывается, // а вместо этого заполняется переданное соответствие: // * Ключ - неоднозначный идентификатор пользователя ИБ; // * Значение - массив пользователей и внешних пользователей. diff --git a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl index 46f0d6243..299015c24 100644 --- a/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ПользователиПереопределяемый/Module.bsl @@ -231,31 +231,31 @@ // системы взаимодействия. // // Параметры: -// ВыбраннаяФорма - Строка - имя открываемой формы. -// ПараметрыФормы - Структура - параметры формы при открытии, только Чтение: -// * ЗакрыватьПриВыборе - Булево - содержит признак того, что форму +// ВыбраннаяФорма - Строка - имя открываемой формы. +// ПараметрыФормы - Структура - параметры формы при открытии, только Чтение: +// * ЗакрыватьПриВыборе - Булево - содержит признак того, что форму // необходимо закрывать после осуществления выбора. // Если свойство имеет значение Ложь, можно использовать // форму для выбора нескольких позиций или элементов. -// * МножественныйВыбор - Булево - разрешает или запрещает выбор нескольких строк из списка. -// * ВыборУчастниковОбсуждения - Булево - если Истина, то формы вызывается как форма выбора участников обсуждения. +// * МножественныйВыбор - Булево - разрешает или запрещает выбор нескольких строк из списка. +// * ВыборУчастниковОбсуждения - Булево - если Истина, то формы вызывается как форма выбора участников обсуждения. // Форма должна возвращать массив идентификаторов пользователей системы // Взаимодействия. // -// * ЗаголовокКнопкиЗавершенияПодбора - Строка - заголовок кнопки завершения подбора. -// * СкрытьПользователейБезПользователяИБ - Булево - если Истина, то пользователи без идентификатора +// * ЗаголовокКнопкиЗавершенияПодбора - Строка - заголовок кнопки завершения подбора. +// * СкрытьПользователейБезПользователяИБ - Булево - если Истина, то пользователи без идентификатора // пользователя ИБ не должны отображаться в списке. -// * ВыборГруппПользователей - Булево - разрешить выбирать группы пользователей. +// * ВыборГруппПользователей - Булево - разрешить выбирать группы пользователей. // Если группы пользователей используются и параметр не поддерживается, // то для группы пользователей нельзя назначать права через форму подбора. -// * РасширенныйПодбор - Булево - если Истина, то доступен просмотр Групп пользователей. -// * ПараметрыРасширеннойФормыПодбора - Строка - адрес временного хранилища со структурой: -// ** СкрываемыеПользователи - Массив - пользователи, которые не отображаются в форме подбора. -// ** ВыборГруппВнешнихПользователей - Булево - разрешить выбирать группы внешних пользователей. -// ** ПодборГруппНевозможен - Булево -// ** ЗаголовокФормыПодбора - Строка - позволяет переопределять заголовок формы подбора. -// ** ВыбранныеПользователи - Массив - пользователи, которые должны отображаться в подобранных. -// ** ТекущаяСтрока - СправочникСсылка.ГруппыПользователей - строка, на которой будет выполнена позиционирование +// * РасширенныйПодбор - Булево - если Истина, то доступен просмотр Групп пользователей. +// * ПараметрыРасширеннойФормыПодбора - Строка - адрес временного хранилища со структурой: +// ** СкрываемыеПользователи - Массив - пользователи, которые не отображаются в форме подбора. +// ** ВыборГруппВнешнихПользователей - Булево - разрешить выбирать группы внешних пользователей. +// ** ПодборГруппНевозможен - Булево +// ** ЗаголовокФормыПодбора - Строка - позволяет переопределять заголовок формы подбора. +// ** ВыбранныеПользователи - Массив - пользователи, которые должны отображаться в подобранных. +// ** ТекущаяСтрока - СправочникСсылка.ГруппыПользователей - строка, на которой будет выполнена позиционирование // в динамическом списке групп пользователей // при открытии формы. // diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl index 440c7162e..c96d48dde 100644 --- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl @@ -11,6 +11,43 @@ /////////////////////////////////////////////////////////////////////////////// // Основные процедуры и функции. +// Вызывается при входе в систему. +// +// Параметры: +// РегистрироватьВЖурнале - Булево - если Истина, тогда записать ошибку в журнал регистрации. +// +// Возвращаемое значение: +// Структура: +// * ОшибкаАвторизации - Строка - текст ошибки, если заполнено. +// * ТребуетсяСменитьПароль - Булево - если Истина, тогда текст ошибки устаревания пароля. +// +Функция АвторизоватьТекущегоПользователяПриВходе(РегистрироватьВЖурнале) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ОшибкаАвторизации", ""); + Результат.Вставить("ТребуетсяСменитьПароль", Ложь); + + ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + ОтключитьНеактивныхИПросроченныхПользователей(Истина, ОшибкаАвторизации, РегистрироватьВЖурнале); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации); + КонецЕсли; + + Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда + Результат.ТребуетсяСменитьПароль = ТребуетсяСменитьПароль(ОшибкаАвторизации, + Истина, РегистрироватьВЖурнале); + КонецЕсли; + + Результат.ОшибкаАвторизации = ОшибкаАвторизации; + + Возврат Результат; + +КонецФункции + // Вызывается при начале работы системы, чтобы проверить возможность выполнения авторизации и // вызвать заполнение значений параметров сеанса ТекущийПользователь и ТекущийВнешнийПользователь. // Также вызывается при входе в область данных. @@ -32,7 +69,12 @@ ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); ЭтоВнешнийПользователь = ЗначениеЗаполнено(Справочники.ВнешниеПользователи.НайтиПоРеквизиту( "ИдентификаторПользователяИБ", ТекущийПользовательИБ.УникальныйИдентификатор)); - ПроверитьПраваПользователя(ТекущийПользовательИБ, "ПриЗапуске", ЭтоВнешнийПользователь); + + ТекстОшибки = ПроверитьПраваПользователя(ТекущийПользовательИБ, + "ПриЗапуске", ЭтоВнешнийПользователь, Не ПриНачалеРаботыСистемы, РегистрироватьВЖурнале); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + Возврат ТекстОшибки; + КонецЕсли; Если ПустаяСтрока(ТекущийПользовательИБ.Имя) Тогда // Авторизуется пользователь по умолчанию. @@ -53,17 +95,20 @@ Возврат РезультатУстановкиПараметровСеанса(РегистрироватьВЖурнале); КонецЕсли; - СтандартнаяОбработка = Истина; - ИнтеграцияПодсистемБСП.ПриАвторизацииНовогоПользователяИБ(ТекущийПользовательИБ, СтандартнаяОбработка); + НайденныйПользователь = Неопределено; + ПользовательПоИдентификаторуСуществует(ТекущийПользовательИБ.УникальныйИдентификатор,, НайденныйПользователь); - Если Не СтандартнаяОбработка Тогда - Возврат ""; + Если Не ЗначениеЗаполнено(НайденныйПользователь) Тогда + СтандартнаяОбработка = Истина; + ИнтеграцияПодсистемБСП.ПриАвторизацииНовогоПользователяИБ(ТекущийПользовательИБ, СтандартнаяОбработка); + + Если Не СтандартнаяОбработка Тогда + Возврат ""; + КонецЕсли; + ПользовательПоИдентификаторуСуществует(ТекущийПользовательИБ.УникальныйИдентификатор,, НайденныйПользователь); КонецЕсли; - НайденныйПользователь = Неопределено; - Если ПользовательПоИдентификаторуСуществует( - ТекущийПользовательИБ.УникальныйИдентификатор, , НайденныйПользователь) Тогда - + Если ЗначениеЗаполнено(НайденныйПользователь) Тогда // ПользовательИБ найден в справочнике. Если ПриНачалеРаботыСистемы И РолиАдминистратораДоступны() Тогда ИнтеграцияПодсистемБСП.ПриСозданииАдминистратора(НайденныйПользователь, @@ -169,7 +214,7 @@ НастройкиСостава = Новый НастройкиСоставаИнтерфейсаКлиентскогоПриложения; ГруппаСлева = Новый ГруппаНастройкиСоставаИнтерфейсаКлиентскогоПриложения; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияРежимаСовместимости(), "8.3.15.0") < 0 Тогда + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СтандартныеПодсистемыСервер.ВерсияРежимаСовместимости(), "8.3.15.0") < 0 Тогда ГруппаСлева.Добавить(Новый ЭлементНастройкиСоставаИнтерфейсаКлиентскогоПриложения("ПанельИнструментов")); КонецЕсли; @@ -232,12 +277,15 @@ // Только для вызова из процедуры ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы // общего модуля СтандартныеПодсистемыВызовСервера. // -Процедура ПроверитьПраваТекущегоПользователяПриВходе() Экспорт +// Возвращаемое значение: +// Строка - текст ошибки. +// +Функция ОшибкаПроверкиПравТекущегоПользователяПриВходе() Экспорт - ПроверитьПраваПользователя(ПользователиИнформационнойБазы.ТекущийПользователь(), - "ПриЗапуске", Пользователи.ЭтоСеансВнешнегоПользователя()); + Возврат ПроверитьПраваПользователя(ПользователиИнформационнойБазы.ТекущийПользователь(), + "ПриЗапуске", Пользователи.ЭтоСеансВнешнегоПользователя(), Ложь); -КонецПроцедуры +КонецФункции // Создает пользователя <Не указан>. // @@ -267,11 +315,131 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Восстановление паролей пользователей + +Процедура УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля) Экспорт + + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + НастройкиАутентификации = Вычислить("ДополнительныеНастройкиАутентификации"); + НастройкиАутентификации.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля); + КонецЕсли; + +КонецПроцедуры + +// Возвращает настройки восстановления пароля из информационной базы +// +// Возвращаемое значение: +// Структура: +// * АдресСервераSMTP - Строка +// * ПарольSMTP - Строка +// * ПользовательSMTP - Строка +// * ПортSMTP - Число +// * Заголовок - Строка +// * ТекстСообщенияHTML - Строка +// * ИмяОтправителя - Строка +// * ИспользоватьSSL - Булево +// * НавигационнаяСсылкаПомощи - Строка +// * ОтображатьГиперссылкуПомощи - Булево +// * СпособВосстановленияПароля - СпособВосстановленияПароляПользователяИнформационнойБазы +// * ДлинаКодаПодтверждения - Число +// * ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения - Число +// * МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения - Число +// * НавигационнаяСсылкаВосстановленияПароля - Строка +// +Функция НастройкиВосстановленияПароля() Экспорт + + НастройкиВосстановленияПароля = Неопределено; + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + НастройкиАутентификации = Вычислить("ДополнительныеНастройкиАутентификации"); + НастройкиВосстановленияПароля = НастройкиАутентификации.ПолучитьНастройкиВосстановленияПароля(); + КонецЕсли; + + Возврат НастройкиВосстановленияПароля; + +КонецФункции + +Функция СпособВосстановленияПароляПользователяИнформационнойБазы(СпособВосстановленияПароля) Экспорт + СпособВосстановленияПароляПользователя = Вычислить("СпособВосстановленияПароляПользователяИнформационнойБазы"); + Возврат СпособВосстановленияПароляПользователя[СпособВосстановленияПароля]; +КонецФункции + +// Возвращаемое значение: +// см. НастройкиВосстановленияПароля +// +Функция НовыеНастройкиВосстановленияПароля() Экспорт + + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + НастройкиВосстановленияПароля = Вычислить("Новый НастройкиВосстановленияПароля"); + Возврат НастройкиВосстановленияПароля; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Процедура ЗаполнитьПочтуДляВосстановленияПароляУПользователейВФоне(ДополнительныеПараметры, АдресВоВременномХранилище) Экспорт + + СписокПользователей = ПользователиДляВключенияВосстановленияПароля(); + Для каждого ПользовательСсылка Из СписокПользователей Цикл + ОбновитьПочтуДляВосстановленияПароля(ПользовательСсылка); + КонецЦикла; + + СписокПользователей = ВнешниеПользователиДляВключенияВосстановленияПароля(); + Для каждого ВнешнийПользовательСсылка Из СписокПользователей Цикл + + ОбъектАвторизации = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВнешнийПользовательСсылка, "ОбъектАвторизации"); + ОбновитьПочтуДляВосстановленияПароля(ВнешнийПользовательСсылка, ОбъектАвторизации); + + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Для работы интерфейса ролей в управляемой форме. // Только для внутреннего использования. // +// Параметры: +// Действие - Строка - НастроитьИнтерфейсРолейПриЧтенииНаСервере, +// НастроитьИнтерфейсРолейПриСозданииФормы, +// НастроитьИнтерфейсРолейПриЗагрузкеНастроек, +// ЗаполнитьРоли, +// ОбновитьДеревоРолей, +// ОбновитьСоставРолей, +// ТолькоВыбранныеРоли, +// УстановитьТолькоПросмотрРолей, +// ГруппировкаПоПодсистемам. +// +// Параметры - Структура: +// * ОсновнойПараметр - Неопределено +// - Булево +// - Строка +// - Массив +// - Соответствие +// +// * Форма - ФормаКлиентскогоПриложения: +// ** ПоказатьПодсистемыРолей - Булево +// ** Роли - ДанныеФормыДерево: +// *** ЭтоРоль - Булево +// *** Имя - Строка +// *** Синоним - Строка +// *** ЭтоНедоступнаяРоль - Булево +// *** ЭтоНесуществующаяРоль - Булево +// *** Пометка - Булево +// *** НомерКартинки - Число +// ** Элементы - ВсеЭлементыФормы: +// *** РолиУстановитьФлажки - КнопкаФормы +// *** РолиСнятьФлажки - КнопкаФормы +// *** РолиПоказатьТолькоВыбранныеРоли - КнопкаФормы +// *** РолиПоказатьПодсистемыРолей - КнопкаФормы +// +// * КоллекцияРолей - ТаблицаЗначений: +// ** Роль - Строка +// * НазначениеРолей - Строка +// * СкрытьРольПолныеПрава - Булево +// * ЗапретИзмененияАдминистративногоДоступа - Булево +// Процедура ОбработатьИнтерфейсРолей(Действие, Параметры) Экспорт Если Действие = "УстановитьТолькоПросмотрРолей" Тогда @@ -717,19 +885,19 @@ // Например, адрес электронной почты и телефон. // // Параметры: -// Пользователь - СправочникСсылка.Пользователь +// Пользователь - СправочникСсылка.Пользователи // // Возвращаемое значение: -// Структура: -// * Наименование - Строка -// * ИдентификаторПользователяИБ - Строка -// * Фотография - ДвоичныеДанные +// Структура: +// * Наименование - Строка +// * ИдентификаторПользователяИБ - Строка +// * Фотография - ДвоичныеДанные // - Неопределено -// * Недействителен - Строка -// * ПометкаУдаления - Строка -// * Телефон - Строка -// * АдресЭлектроннойПочты - Строка -// * Подразделение - Неопределено +// * Недействителен - Строка +// * ПометкаУдаления - Строка +// * Телефон - Строка +// * АдресЭлектроннойПочты - Строка +// * Подразделение - Неопределено // - ОпределяемыйТип.Подразделение // Функция ОписаниеПользователя(Пользователь) Экспорт @@ -826,25 +994,15 @@ РегистрироватьВЖурнале = Параметры.ПолученныеПараметрыКлиента <> Неопределено И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОшибкаАвторизации"); - ОшибкаАвторизации = АвторизоватьТекущегоПользователя(Истина, РегистрироватьВЖурнале); + Результат = АвторизоватьТекущегоПользователяПриВходе(РегистрироватьВЖурнале); - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - ОтключитьНеактивныхИПросроченныхПользователей(Истина, ОшибкаАвторизации, РегистрироватьВЖурнале); + Если Результат.ТребуетсяСменитьПароль Тогда + Параметры.Вставить("ТребуетсяСменитьПароль"); + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); КонецЕсли; - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - ПроверитьВходВПрограммуРазрешен(ОшибкаАвторизации); - КонецЕсли; - - Если Не ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - Если ТребуетсяСменитьПароль(ОшибкаАвторизации, Истина, РегистрироватьВЖурнале) Тогда - Параметры.Вставить("ТребуетсяСменитьПароль"); - СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); - КонецЕсли; - КонецЕсли; - - Если ЗначениеЗаполнено(ОшибкаАвторизации) Тогда - Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); + Если ЗначениеЗаполнено(Результат.ОшибкаАвторизации) Тогда + Параметры.Вставить("ОшибкаАвторизации", Результат.ОшибкаАвторизации); Отказ = Истина; КонецЕсли; @@ -1074,13 +1232,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - ТаблицаЗначений: -// * Версия - Строка -// * Процедура - Строка -// * РежимВыполнения - Строка -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1088,11 +1239,6 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "ПользователиСлужебный.ОбновитьПредопределенныеВидыКонтактнойИнформацииПользователей"; - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "ПользователиСлужебный.ЗаполнитьНазначениеГруппВнешнихПользователей"; - Если ОбщегоНазначения.РазделениеВключено() Тогда Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.4.1.1"; @@ -1119,6 +1265,75 @@ Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "ПользователиСлужебный.ЗаполнитьНаименованиеПредопределенныхГруппПользователей"; + Если Не ОбщегоНазначения.РазделениеВключено() + И ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + + // Пользователи + Обработчик = Обработчики.Добавить(); + Обработчик.Процедура = "Справочники.Пользователи.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.Версия = "3.1.4.25"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("d553f38f-196b-4fb7-ac8e-34ffb7025ab5"); + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.Пользователи.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.Комментарий = НСтр("ru = 'Заполнение электронной почты для восстановления паролей из контактной информации пользователей.'"); + Обработчик.ЧитаемыеОбъекты = "Справочник.Пользователи"; + Обработчик.ИзменяемыеОбъекты = "Справочник.Пользователи"; + Обработчик.БлокируемыеОбъекты = "Справочник.Пользователи"; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Обсуждения") Тогда + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + + ПриоритетыВыполнения = Обработчик.ПриоритетыВыполнения; // ТаблицаЗначений + НоваяСтрока = ПриоритетыВыполнения.Добавить(); + НоваяСтрока.Процедура = "ОбсужденияСлужебный.ЗаблокироватьНедействительныхПользователейВСистемеВзаимодействий"; // АПК:277-выкл - выполнен условный вызов + НоваяСтрока.Порядок = "После"; + КонецЕсли; + + // Внешние пользователи + ТипыВнешнихПользователей = Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.Типы(); + Если ТипыВнешнихПользователей[0] <> Тип("Строка") + И ТипыВнешнихПользователей[0] <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.Процедура = "Справочники.ВнешниеПользователи.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + Обработчик.Версия = "3.1.4.25"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Идентификатор = Новый УникальныйИдентификатор("002f8ac6-dfe6-4d9f-be48-ce3c331aea82"); + Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.ВнешниеПользователи.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; + Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; + Обработчик.Комментарий = НСтр("ru = 'Заполнение электронной почты для восстановления паролей из контактной информации внешних пользователей.'"); + + Читаемые = Новый Массив; + Для Каждого ТипВнешнегоПользователя Из ТипыВнешнихПользователей Цикл + + Если ТипВнешнегоПользователя = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Продолжить; + КонецЕсли; + + Читаемые.Добавить(Метаданные.НайтиПоТипу(ТипВнешнегоПользователя).ПолноеИмя()); + КонецЦикла; + Обработчик.ЧитаемыеОбъекты = СтрСоединить(Читаемые, ","); + + Обработчик.ИзменяемыеОбъекты = "Справочник.ВнешниеПользователи"; + Обработчик.БлокируемыеОбъекты = "Справочник.ВнешниеПользователи"; + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Объекты - Массив +// +Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт + + Объекты.Добавить(Метаданные.Справочники.ГруппыВнешнихПользователей); + Объекты.Добавить(Метаданные.Справочники.ГруппыПользователей); + КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииПараметровРаботыКлиента. @@ -1130,14 +1345,10 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// Массив - Массив из Строка -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить(Метаданные.РегистрыСведений.СоставыГруппПользователей.ПолноеИмя()); - Массив.Добавить(Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектАвторизации.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.СоставыГруппПользователей.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВнешниеПользователи.Реквизиты.ОбъектАвторизации.ПолноеИмя()); КонецПроцедуры @@ -1176,10 +1387,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - ТаблицаЗначений +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1291,10 +1500,6 @@ // Обработчики событий подсистемы ПодключаемыеКоманды. // См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. -// -// Параметры: -// Объекты - Массив из ОбъектМетаданных -// Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.Пользователи); @@ -1839,8 +2044,7 @@ // Для форм элементов справочников Пользователи и ВнешниеПользователи. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОбъектов: +// Форма - ФормаКлиентскогоПриложения: // * Объект - СправочникОбъект.Пользователи // - СправочникОбъект.ВнешниеПользователи // @@ -1888,7 +2092,6 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения -// - РасширениеУправляемойФормыДляОбъектов // ТекущийОбъект - СправочникОбъект.Пользователи // - СправочникОбъект.ВнешниеПользователи // @@ -2564,29 +2767,6 @@ ИнтеграцияПодсистемБСП.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); - Если Не ПараметрыОбработки.Свойство("Действие") Тогда - Возврат; - КонецЕсли; - - Если УровеньДоступа.НетДоступа Тогда - ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; - КонецЕсли; - - Если ОписаниеПользователяИБ.Действие = "Удалить" Тогда - - Если Не УровеньДоступа.ИзменениеРазрешенияНаВход Тогда - ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; - КонецЕсли; - - ИначеЕсли Не УровеньДоступа.УправлениеСписком Тогда // Действие = "Записать" - - Если Не УровеньДоступа.ИзменениеТекущего - Или Не ПараметрыОбработки.СтарыйПользовательИБТекущий Тогда - - ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; - КонецЕсли; - КонецЕсли; - УстановитьПривилегированныйРежим(Истина); Если ОписаниеПользователяИБ.Действие = "Записать" @@ -2624,6 +2804,36 @@ Если Не УровеньДоступа.ПолныеПрава Тогда ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; КонецЕсли; + + Если Не ПараметрыОбработки.Свойство("Действие") Тогда + ПользовательОбъект.ИдентификаторПользователяИБ = ОписаниеПользователяИБ.УникальныйИдентификатор; + // Обновление значения реквизита контролируемого при записи. + ПараметрыОбработки.АвтоРеквизиты.ИдентификаторПользователяИБ = + ПользовательОбъект.ИдентификаторПользователяИБ; + КонецЕсли; + КонецЕсли; + + Если Не ПараметрыОбработки.Свойство("Действие") Тогда + Возврат; + КонецЕсли; + + Если УровеньДоступа.НетДоступа Тогда + ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; + КонецЕсли; + + Если ОписаниеПользователяИБ.Действие = "Удалить" Тогда + + Если Не УровеньДоступа.ИзменениеРазрешенияНаВход Тогда + ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; + КонецЕсли; + + ИначеЕсли Не УровеньДоступа.УправлениеСписком Тогда // Действие = "Записать" + + Если Не УровеньДоступа.ИзменениеТекущего + Или Не ПараметрыОбработки.СтарыйПользовательИБТекущий Тогда + + ВызватьИсключение ПараметрыОбработки.ТекстСообщенияНедостаточноПрав; + КонецЕсли; КонецЕсли; Если ОписаниеПользователяИБ.Действие = "Записать" Тогда @@ -2643,6 +2853,9 @@ Если УровеньДоступа.ИзменениеТекущего Тогда ДопустимыеСвойства.Вставить("Пароль"); ДопустимыеСвойства.Вставить("Язык"); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); + КонецЕсли; КонецЕсли; Если УровеньДоступа.УправлениеСписком Тогда @@ -2651,6 +2864,10 @@ ДопустимыеСвойства.Вставить("ЗапрещеноИзменятьПароль"); ДопустимыеСвойства.Вставить("Язык"); ДопустимыеСвойства.Вставить("РежимЗапуска"); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + ДопустимыеСвойства.Вставить("АдресЭлектроннойПочты"); + ДопустимыеСвойства.Вставить("ЗапрещеноВосстанавливатьПароль"); + КонецЕсли; КонецЕсли; Если УровеньДоступа.НастройкиДляВхода Тогда @@ -3050,6 +3267,23 @@ КонецЕсли; + Если ОписаниеПользователяИБ.Свойство("АдресЭлектроннойПочты") + И ОписаниеПользователяИБ.Свойство("ЗапрещеноВосстанавливатьПароль") Тогда + + Если Не ОписаниеПользователяИБ.ЗапрещеноВосстанавливатьПароль + И ПустаяСтрока(ОписаниеПользователяИБ.АдресЭлектроннойПочты) Тогда + + ОбщегоНазначения.СообщитьПользователю( + НСтр("ru = 'Не заполнена электронная почта для восстановления пароля.'"), + , + "КонтактнаяИнформация", + , + Отказ); + + КонецЕсли; + + КонецЕсли; + Возврат НЕ Отказ; КонецФункции @@ -3063,17 +3297,21 @@ // Параметры: // ГруппаПользователей - СправочникСсылка.ГруппыПользователей. // -// Пользователь - Неопределено - для всех пользователей. -// - Массив значений СправочникСсылка.Пользователи - для указанных пользователей. -// - СправочникСсылка.Пользователи - для указанного пользователя. +// Пользователь - Неопределено - для всех пользователей. +// - Массив из СправочникСсылка.Пользователи - для указанных пользователей. +// - СправочникСсылка.Пользователи - для указанного пользователя. // // УчастникиИзменений - Неопределено - никаких действий. -// - Массив Из возвращаемое значение - заполняет массив пользователями -// для которых есть изменения. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.Пользователи - заполняет соответствие +// пользователями для которых есть изменения. +// * Значение - Неопределено // // ИзмененныеГруппы - Неопределено - никаких действий. -// - Массив Из возвращаемое значение - заполняет массив группами пользователей -// для которых есть изменения. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыПользователей - заполняет соответствие +// группами пользователей для которых есть изменения. +// * Значение - Неопределено // Процедура ОбновитьСоставыГруппПользователей(Знач ГруппаПользователей, Знач Пользователь = Неопределено, @@ -3139,11 +3377,19 @@ // - СправочникСсылка.ГруппыПользователей, // - СправочникСсылка.ГруппыВнешнихПользователей. // -// УчастникиИзменений - Массив Из возвращаемое значение - заполняет массив пользователями или -// внешними пользователями, для которых есть изменения. +// УчастникиИзменений - Неопределено - никаких действий. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи - заполняет соответствие +// пользователями для которых есть изменения. +// * Значение - Неопределено // -// ИзмененныеГруппы - Массив Из возвращаемое значение - заполняет массив группами пользователей или -// группами внешних пользователей, для которых есть изменения. +// ИзмененныеГруппы - Неопределено - никаких действий. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыПользователей +// - СправочникСсылка.ГруппыВнешнихПользователей - заполняет соответствие +// группами пользователей для которых есть изменения. +// * Значение - Неопределено // Процедура ОбновитьИспользуемостьСоставовГруппПользователей(Знач ПользовательИлиГруппа, Знач УчастникиИзменений, @@ -3266,17 +3512,21 @@ // автоматические группы внешних пользователей по типам объектов авторизации. // // ВнешнийПользователь - Неопределено - для всех внешних пользователей. -// - Массив значений СправочникСсылка.ВнешниеПользователи - для указанных +// - Массив из СправочникСсылка.ВнешниеПользователи - для указанных // внешних пользователей. // - СправочникСсылка.ВнешниеПользователи - для указанного внешнего пользователя. // -// УчастникиИзменений - Неопределено - никаких действий. -// - Массив Из возвращаемое значение - заполняет массив внешними -// пользователями для которых есть изменения. +// УчастникиИзменений - Неопределено - никаких действий. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ВнешниеПользователи - заполняет соответствие +// внешними пользователями для которых есть изменения. +// * Значение - Неопределено // // ИзмененныеГруппы - Неопределено - никаких действий. -// - Массив Из возвращаемое значение - заполняет массив группами внешних -// пользователей для которых есть изменения. +// - Соответствие из КлючИЗначение: +// * Ключ - СправочникСсылка.ГруппыВнешнихПользователей - заполняет соответствие +// группами внешних пользователей для которых есть изменения. +// * Значение - Неопределено // Процедура ОбновитьСоставыГруппВнешнихПользователей(Знач ГруппаВнешнихПользователей, Знач ВнешнийПользователь = Неопределено, @@ -3871,11 +4121,11 @@ // Параметры: // ГруппыПриемник - СправочникСсылка.ГруппыПользователей, группа, в которую // добавляется пользователь. -// ПользовательСсылка - СправочникСсылка.Пользователь - пользователь, которого необходимо +// ПользовательСсылка - СправочникСсылка.Пользователи - пользователь, которого необходимо // добавить в группу. // // Возвращаемое значение: -// Булево - Ложь, если добавление пользователя в группу невозможно. +// Булево - Ложь, если добавление пользователя в группу невозможно. // Функция ВозможноПеремещениеПользователя(ГруппаПриемник, ПользовательСсылка) Экспорт @@ -4101,6 +4351,265 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Восстановление паролей пользователей + +Функция ДоступнаНастройкаВосстановленияПароля(УровеньДоступа) Экспорт + + Если ОбщегоНазначения.РазделениеВключено() Тогда + Возврат Ложь; + КонецЕсли; + + Если Не УровеньДоступа.ИзменениеТекущего + И Не УровеньДоступа.УправлениеСписком Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей(); + +КонецФункции + +// Параметры: +// УровеньДоступа - Структура +// Объект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// +// Возвращаемое значение: +// Булево +// +Функция ИнтерактивноЗапрашиватьВводПароля(УровеньДоступа, Объект) Экспорт + + Если Пользователи.ЭтоПолноправныйПользователь() + Или УровеньДоступа.УправлениеСписком + Или НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда + Возврат Ложь; + ИначеЕсли ЗначениеЗаполнено(Объект.ИдентификаторПользователяИБ) + И УровеньДоступа.ИзменениеТекущего Тогда + + УстановитьПривилегированныйРежим(Истина); + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Объект.ИдентификаторПользователяИБ); + УстановитьПривилегированныйРежим(Ложь); + + Если ПользовательИБ <> Неопределено Тогда + Возврат ПользовательИБ.ПарольУстановлен; + КонецЕсли; + + КонецЕсли; + + Возврат Истина; + +КонецФункции + +// Параметры: +// УровеньДоступа - Структура +// Объект - СправочникОбъект.Пользователи +// - СправочникОбъект.ВнешниеПользователи +// +// Возвращаемое значение: +// Булево +// +Функция ДоступноРедактированиеПочтыДляВосстановленияПароля(УровеньДоступа, Объект) Экспорт + + Если Пользователи.ЭтоПолноправныйПользователь() + Или УровеньДоступа.ИзменениеТекущего + Или Не ЗначениеЗаполнено(Объект.Ссылка) + Или (УровеньДоступа.УправлениеСписком И Объект.Подготовлен) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ПользователиДляВключенияВосстановленияПароля() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Возврат Новый Массив; + КонецЕсли; + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПользователиКонтактнаяИнформация.Ссылка КАК Ссылка + |ИЗ + | Справочник.Пользователи.КонтактнаяИнформация КАК ПользователиКонтактнаяИнформация + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи + | ПО ПользователиКонтактнаяИнформация.Ссылка = Пользователи.Ссылка + |ГДЕ + | ПользователиКонтактнаяИнформация.Вид = &ВидКонтактнойИнформации + | И Пользователи.Недействителен = ЛОЖЬ + | И Пользователи.Служебный = ЛОЖЬ"; + + Запрос.УстановитьПараметр("ВидКонтактнойИнформации", + МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя")); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + Возврат РезультатЗапроса.ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +Функция ВнешниеПользователиДляВключенияВосстановленияПароля() Экспорт + + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Возврат Новый Массив; + КонецЕсли; + + ТипыВнешнихПользователей = Метаданные.ОпределяемыеТипы.ВнешнийПользователь.Тип.Типы(); + + Если ТипыВнешнихПользователей.Количество() = 0 Тогда + Возврат Новый Массив; + КонецЕсли; + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + ШаблонЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВнешниеПользователи.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + | ЛЕВОЕ СОЕДИНЕНИЕ #КонтактнаяИнформация КАК КонтактнаяИнформацияВнешнегоПользователя + | ПО (ВнешниеПользователи.ОбъектАвторизации = КонтактнаяИнформацияВнешнегоПользователя.Ссылка) + |ГДЕ + | ВнешниеПользователи.Недействителен = ЛОЖЬ + | И КонтактнаяИнформацияВнешнегоПользователя.Тип = &ТипКонтактнойИнформации"; + + НаборЗапросов = Новый Массив; + + Для каждого ТипВнешнегоПользователя Из ТипыВнешнихПользователей Цикл + + Если Не МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(ТипВнешнегоПользователя) Тогда + Продолжить; + КонецЕсли; + + ИмяТаблицы = Метаданные.НайтиПоТипу(ТипВнешнегоПользователя).ПолноеИмя() + ".КонтактнаяИнформация"; + НаборЗапросов.Добавить(СтрЗаменить(ШаблонЗапроса, "#КонтактнаяИнформация", ИмяТаблицы)); + + КонецЦикла; + + Если НаборЗапросов.Количество() = 0 Тогда + Возврат Новый Массив; + КонецЕсли; + + ТекстЗапроса = СтрСоединить(НаборЗапросов, Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС); + + Запрос = Новый Запрос(ТекстЗапроса); + + Запрос.Параметры.Вставить("ТипКонтактнойИнформации", + МодульУправлениеКонтактнойИнформацией.ТипКонтактнойИнформацииПоНаименованию("АдресЭлектроннойПочты")); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + Возврат РезультатЗапроса.ВыгрузитьКолонку("Ссылка"); + +КонецФункции + +Функция ОбновитьПочтуДляВосстановленияПароля(ПользовательСсылка, ОбъектАвторизации = Неопределено) Экспорт + + Результат = "ОбновлениеНеТребуется"; + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "ИдентификаторПользователяИБ"); + + ПользовательИБ = Пользователи.СвойстваПользователяИБ(ИдентификаторПользователяИБ); + Если ПользовательИБ = Неопределено Или ЗначениеЗаполнено(ПользовательИБ.АдресЭлектроннойПочты) Тогда + Возврат Результат; + КонецЕсли; + + Если ОбъектАвторизации = Неопределено Тогда + + ВладелецКИ = ПользовательСсылка; + ТипИлиВидЭлектроннойПочты = МодульУправлениеКонтактнойИнформацией.ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + ПолноеИмяОбъектаМетаданных = Метаданные.Справочники.Пользователи.ПолноеИмя(); + + Иначе + + Если Не МодульУправлениеКонтактнойИнформацией.СодержитКонтактнуюИнформацию(ОбъектАвторизации) Тогда + Возврат Результат; + КонецЕсли; + ВладелецКИ = ОбъектАвторизации; + ТипИлиВидЭлектроннойПочты = МодульУправлениеКонтактнойИнформацией.ТипКонтактнойИнформацииПоНаименованию("АдресЭлектроннойПочты"); + ПолноеИмяОбъектаМетаданных = ОбъектАвторизации.Метаданные().ПолноеИмя(); + + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъектаМетаданных); + ЭлементБлокировки.УстановитьЗначение("Ссылка", ВладелецКИ); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; + + НачатьТранзакцию(); + Попытка + + Блокировка.Заблокировать(); + + КонтактнаяИнформацияПользователя = МодульУправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(ВладелецКИ, + ТипИлиВидЭлектроннойПочты, ТекущаяДатаСеанса(), Ложь); + + Если КонтактнаяИнформацияПользователя.Количество() > 0 Тогда + + СтрокаСПочтой = КонтактнаяИнформацияПользователя[0]; + + ПочтаДляВосстановленияПароля = ""; + Если ЗначениеЗаполнено(СтрокаСПочтой.Значение) Тогда + ПочтаДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.АдресЭлектроннойПочты(СтрокаСПочтой.Значение); + Если Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ПочтаДляВосстановленияПароля) Тогда + ПочтаДляВосстановленияПароля = ""; + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(ПочтаДляВосстановленияПароля) И ЗначениеЗаполнено(СтрокаСПочтой.ЗначенияПолей) Тогда + ПочтаДляВосстановленияПароля = МодульУправлениеКонтактнойИнформацией.АдресЭлектроннойПочты(СтрокаСПочтой.ЗначенияПолей); + Если Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ПочтаДляВосстановленияПароля) Тогда + ПочтаДляВосстановленияПароля = ""; + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(ПочтаДляВосстановленияПароля) И ЗначениеЗаполнено(СтрокаСПочтой.Представление) Тогда + ПочтаДляВосстановленияПароля = СтрокаСПочтой.Представление; + КонецЕсли; + + Если ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ПочтаДляВосстановленияПароля) Тогда + + ПользовательИБ.АдресЭлектроннойПочты = ПочтаДляВосстановленияПароля; + ПользовательИБ.ЗапрещеноВосстанавливатьПароль = Ложь; + Пользователи.УстановитьСвойстваПользователяИБ(ИдентификаторПользователяИБ, ПользовательИБ); + + КонецЕсли; + + КонецЕсли; + + Результат = "Обновлен"; + ЗафиксироватьТранзакцию(); + + Исключение + ОтменитьТранзакцию(); + + // Если не удалось обработать пользователя, повторяем попытку снова. + Результат = "Ошибка"; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось обработать пользователя %1 по причине: %2'"), + ПользовательСсылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение, + Метаданные.Справочники.Пользователи, ПользовательСсылка, ТекстСообщения); + КонецПопытки; + + Возврат Результат; + +КонецФункции + +Функция ПоляВосстановленияПаролей() Экспорт + + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Тогда + Возврат ",ЗапрещеноВосстанавливатьПароль,АдресЭлектроннойПочты"; + КонецЕсли; + + Возврат ""; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Универсальные процедуры и функции. @@ -4112,7 +4621,7 @@ // Таблица2 - ТаблицаЗначений // // Возвращаемое значение: -// Массив значений, которые есть только в колонке только одной из таблиц. +// Массив - значения, которые есть только в колонке только одной из таблиц. // Функция РазличияЗначенийКолонки(ИмяКолонки, Таблица1, Таблица2) Экспорт @@ -4211,7 +4720,8 @@ Процедура ДобавитьПоляПользователейГруппы(Настройки) ДобавляемыеПоля = СтрРазделить("Ссылка, НомерКартинки", ", ", Ложь); - ВыбранныеПоля = Настройки.Структура[0].Выбор; + НастройкиСтруктура = Настройки.Структура[0]; // ГруппировкаКомпоновкиДанных + ВыбранныеПоля = НастройкиСтруктура.Выбор; Для Каждого ДобавляемоеПоле Из ДобавляемыеПоля Цикл @@ -4271,44 +4781,6 @@ КонецПроцедуры -// Вызывается при начальном заполнении. -Процедура ЗаполнитьНазначениеГруппВнешнихПользователей() Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ГруппыВнешнихПользователей.Ссылка КАК Ссылка - |ИЗ - | Справочник.ГруппыВнешнихПользователей КАК ГруппыВнешнихПользователей - |ГДЕ - | (ГруппыВнешнихПользователей.Предопределенный - | ИЛИ НЕ ГруппыВнешнихПользователей.Ссылка В - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыВнешнихПользователей.Ссылка - | ИЗ - | Справочник.ГруппыВнешнихПользователей.Назначение КАК ГруппыВнешнихПользователейНазначение))"; - - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - - Пока Выборка.Следующий() Цикл - - ГруппаОбъект = Выборка.Ссылка.ПолучитьОбъект(); // СправочникСсылка.ГруппыВнешнихПользователей - - Если ГруппаОбъект.Предопределенный Тогда - ПустыеСсылки = ПользователиСлужебныйПовтИсп.ПустыеСсылкиТиповОбъектовАвторизации(); - Для Каждого ПустаяСсылка Из ПустыеСсылки Цикл - НоваяСтрока = ГруппаОбъект.Назначение.Добавить(); - НоваяСтрока.ТипПользователей = ПустаяСсылка; - КонецЦикла; - КонецЕсли; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ГруппаОбъект); - - КонецЦикла; - -КонецПроцедуры - // Вызывается при переходе на новую версию конфигурации 2.3.2.30, 3.0.2.192. Процедура ПеренестиНастройкиДлиныИСложностиПаролейКонфигуратора() Экспорт @@ -4461,6 +4933,7 @@ // ** НазваниеНастройки - Строка - название, которое будет отображаться в дереве настроек. // ** КартинкаНастройки - Картинка - картинка, которая будет отображаться в дереве настроек. // ** СписокНастроек - СписокЗначений - список полученных настроек. +// - см. НовоеОписаниеНастройки // Процедура ПриПолученииПрочихНастроекПользователя(СведенияОПользователе, Настройки) Экспорт @@ -4483,6 +4956,17 @@ КонецПроцедуры +// Возвращаемое значение: +// ТаблицаЗначений: +// * Объект - Строка +// * Идентификатор - Строка +// +Функция НовоеОписаниеНастройки() Экспорт + + Возврат Новый Структура; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -4547,17 +5031,17 @@ Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1 | ВнешниеПользователи.Ссылка КАК Ссылка, - | ВнешниеПользователи.Недействителен КАК Недействителен + | ВнешниеПользователи.Наименование КАК Наименование, + | ВнешниеПользователи.Недействителен КАК Недействителен, + | ВнешниеПользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ |ИЗ | Справочник.ВнешниеПользователи КАК ВнешниеПользователи |ГДЕ | ВнешниеПользователи.ОбъектАвторизации = &СсылкаНаОбъектАвторизации - | И (ВнешниеПользователи.Наименование <> &НовоеПредставлениеОбъектаАвторизации - | ИЛИ ВнешниеПользователи.Недействителен = ЛОЖЬ - | И &ПометкаУдаленияОбъектаАвторизации)"); + | И (ВнешниеПользователи.Недействителен = ЛОЖЬ + | ИЛИ &ПометкаУдаленияОбъектаАвторизации)"); Запрос.УстановитьПараметр("СсылкаНаОбъектАвторизации", СсылкаНаОбъектАвторизации); - Запрос.УстановитьПараметр("НовоеПредставлениеОбъектаАвторизации", Строка(СсылкаНаОбъектАвторизации)); Запрос.УстановитьПараметр("ПометкаУдаленияОбъектаАвторизации", ПометкаУдаленияОбъектаАвторизации); НачатьТранзакцию(); @@ -4568,21 +5052,47 @@ Выборка = РезультатЗапроса.Выбрать(); Выборка.Следующий(); - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнешниеПользователи"); - ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); - Блокировка.Заблокировать(); - - ВнешнийПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ВнешнийПользовательОбъект.Наименование = Строка(СсылкаНаОбъектАвторизации); - Если ПометкаУдаленияОбъектаАвторизации И ВнешнийПользовательОбъект.Недействителен = Ложь Тогда - ВнешнийПользовательОбъект.Недействителен = Истина; - Если Пользователи.ВходВПрограммуРазрешен(ВнешнийПользовательОбъект.ИдентификаторПользователяИБ) Тогда - ВнешнийПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", - Новый Структура("Действие, ВходВПрограммуРазрешен", "Записать", Ложь)); + Если ПользователиСлужебныйКлиентСервер.ВерсияПредприятияПоддерживаетВосстановлениеПаролей() + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + + Если ЗначениеЗаполнено(Выборка.ИдентификаторПользователяИБ) Тогда + + ПользователяИБ = Пользователи.СвойстваПользователяИБ(Выборка.ИдентификаторПользователяИБ); + Если ПользователяИБ <> Неопределено Тогда + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + АдресЭлектроннойПочты = МодульУправлениеКонтактнойИнформацией.НовыйАдресПочтыДляВосстановленияПароля( + СсылкаНаОбъектАвторизации, ПользователяИБ.АдресЭлектроннойПочты); + Если АдресЭлектроннойПочты <> Неопределено Тогда + ПользователяИБ.АдресЭлектроннойПочты = АдресЭлектроннойПочты; + Пользователи.УстановитьСвойстваПользователяИБ(Выборка.ИдентификаторПользователяИБ, ПользователяИБ); + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; - ВнешнийПользовательОбъект.Записать(); + + Если Строка(СсылкаНаОбъектАвторизации) <> Выборка.Наименование Тогда + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ВнешниеПользователи"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка); + Блокировка.Заблокировать(); + + ВнешнийПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ВнешнийПользовательОбъект.Наименование = Строка(СсылкаНаОбъектАвторизации); + Если ПометкаУдаленияОбъектаАвторизации И ВнешнийПользовательОбъект.Недействителен = Ложь Тогда + ВнешнийПользовательОбъект.Недействителен = Истина; + Если Пользователи.ВходВПрограммуРазрешен(ВнешнийПользовательОбъект.ИдентификаторПользователяИБ) Тогда + ВнешнийПользовательОбъект.ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", + Новый Структура("Действие, ВходВПрограммуРазрешен", "Записать", Ложь)); + КонецЕсли; + КонецЕсли; + ВнешнийПользовательОбъект.Записать(); + КонецЕсли; + КонецЕсли; ЗафиксироватьТранзакцию(); @@ -4917,7 +5427,7 @@ Если РегистрироватьВЖурнале Тогда ЗаписьЖурналаРегистрации( - НСтр("ru = 'Пользователи.Ошибка входа в программу'", ОбщегоНазначения.КодОсновногоЯзыка()), + ИмяСобытияОшибкаВходаВПрограммуДляЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставление); КонецЕсли; @@ -4925,6 +5435,12 @@ КонецФункции +Функция ИмяСобытияОшибкаВходаВПрограммуДляЖурналаРегистрации() + + Возврат НСтр("ru = 'Пользователи.Ошибка входа в программу'", ОбщегоНазначения.КодОсновногоЯзыка()); + +КонецФункции + // Используется в процедурах ОбновитьСоставыГруппПользователей, // ОбновитьСоставыГруппВнешнихПользователей. // @@ -5488,16 +6004,23 @@ // ПользовательИБ - ПользовательИнформационнойБазы - проверяемый пользователь. // РежимПроверки - Строка - ПриЗаписи или ПриЗапуске. // ЭтоВнешнийПользователь - Булево - проверять права для внешнего пользователя. +// ВызыватьИсключение - Булево - вызвать исключение вместо возврата текста ошибки. +// РегистрироватьВЖурнале - Булево - записать ошибку в журнал регистрации, +// когда ВызыватьИсключение указано Ложь. // -Процедура ПроверитьПраваПользователя(ПользовательИБ, РежимПроверки, ЭтоВнешнийПользователь) +// Возвращаемое значение: +// Строка - текст ошибки, когда ВызыватьИсключение указано Ложь. +// +Функция ПроверитьПраваПользователя(ПользовательИБ, РежимПроверки, ЭтоВнешнийПользователь, + ВызыватьИсключение = Истина, РегистрироватьВЖурнале = Истина) РазделениеВключено = ОбщегоНазначения.РазделениеВключено(); Если РазделениеВключено И ПользовательИБ.РазделениеДанных.Количество() = 0 Тогда - Возврат; // Не нужно проверять неразделенных пользователей в модели сервиса. + Возврат ""; // Не нужно проверять неразделенных пользователей в модели сервиса. КонецЕсли; Если Не РазделениеВключено И РежимПроверки = "ПриЗапуске" И Не ЭтоВнешнийПользователь Тогда - Возврат; // Не нужно проверять права пользователей при запуске в локальном режиме. + Возврат ""; // Не нужно проверять права пользователей при запуске в локальном режиме. КонецЕсли; @@ -5562,51 +6085,59 @@ ДобавляемыеНедоступныеРоли = СокрЛП(ДобавляемыеНедоступныеРоли); Если Не ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда - Возврат; + Возврат ""; КонецЕсли; - ИмяСобытия = НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", - ОбщегоНазначения.КодОсновногоЯзыка()); - Если РежимПроверки = "ПриЗапуске" Тогда - Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 Тогда - ТекстРегистрацииВхода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка входа пользователя %1 с недоступной ролью: - |%2.'"), - ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); - Иначе - ТекстРегистрацииВхода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка входа пользователя %1 с недоступными ролями: - |%2.'"), - ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); + Если ВызыватьИсключение Или РегистрироватьВЖурнале Тогда + Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 Тогда + ТекстРегистрацииВхода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка входа пользователя %1 с недоступной ролью: + |%2.'"), + ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); + Иначе + ТекстРегистрацииВхода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка входа пользователя %1 с недоступными ролями: + |%2.'"), + ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); + КонецЕсли; + ЗаписьЖурналаРегистрации(ИмяСобытияОшибкаВходаВПрограммуДляЖурналаРегистрации(), + УровеньЖурналаРегистрации.Ошибка, , ПользовательИБ, ТекстРегистрацииВхода); КонецЕсли; - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , ПользовательИБ, - ТекстРегистрацииВхода); ТекстСообщенияВхода = НСтр("ru = 'Невозможно выполнить вход из-за наличия недоступных ролей. |Обратитесь к администратору.'"); - ВызватьИсключение ТекстСообщенияВхода; + + Если ВызыватьИсключение Тогда + ВызватьИсключение ТекстСообщенияВхода; + Иначе + Возврат ТекстСообщенияВхода; + КонецЕсли; КонецЕсли; - Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда - ТекстРегистрацииДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка назначить пользователю %1 недоступную роль: - |%2.'"), - ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); - - ИначеЕсли СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) > 1 Тогда - ТекстРегистрацииДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Попытка назначить пользователю %1 недоступные роли: - |%2.'"), - ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); - Иначе - ТекстРегистрацииДобавления = ""; + Если ВызыватьИсключение Или РегистрироватьВЖурнале Тогда + Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда + ТекстРегистрацииДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка назначить пользователю %1 недоступную роль: + |%2.'"), + ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); + + ИначеЕсли СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) > 1 Тогда + ТекстРегистрацииДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка назначить пользователю %1 недоступные роли: + |%2.'"), + ПользовательИБ.ПолноеИмя, ДобавляемыеНедоступныеРоли); + Иначе + ТекстРегистрацииДобавления = ""; + КонецЕсли; + ИмяСобытия = НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", + ОбщегоНазначения.КодОсновногоЯзыка()); + + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , ПользовательИБ, + ТекстРегистрацииДобавления); КонецЕсли; - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , ПользовательИБ, - ТекстРегистрацииДобавления); - Если СтрЧислоСтрок(ДобавляемыеНедоступныеРоли) = 1 И ЗначениеЗаполнено(ДобавляемыеНедоступныеРоли) Тогда ТекстСообщенияДобавления = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Пользователю ""%1"" невозможно назначить недоступную роль: @@ -5622,9 +6153,13 @@ ТекстСообщенияДобавления = ""; КонецЕсли; - ВызватьИсключение ТекстСообщенияДобавления; + Если ВызыватьИсключение Тогда + ВызватьИсключение ТекстСообщенияДобавления; + Иначе + Возврат ТекстСообщенияДобавления; + КонецЕсли; -КонецПроцедуры +КонецФункции Функция СписокНастроек(ИмяПользователяИБ, МенеджерНастроек) @@ -5695,7 +6230,7 @@ СведенияОПользователеПриемнике.Вставить("ИмяПользователяИнформационнойБазы", ИмяПользователяПриемник); // Получение прочих настроек. - ПрочиеНастройкиПользователей = Новый Структура; + ПрочиеНастройкиПользователей = Новый Структура; // см. ПриПолученииПрочихНастроекПользователя.Настройки ПриПолученииПрочихНастроекПользователя(СведенияОПользователеИсточнике, ПрочиеНастройкиПользователей); Ключи = Новый СписокЗначений; @@ -5704,7 +6239,7 @@ Для Каждого ПрочаяНастройка Из ПрочиеНастройкиПользователей Цикл ПрочиеНастройкиСтруктура = Новый Структура; Если ПрочаяНастройка.Ключ = "НастройкаБыстрогоДоступа" Тогда - СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; + СписокНастроек = ПрочаяНастройка.Значение.СписокНастроек; // См. НовоеОписаниеНастройки Для Каждого Элемент Из СписокНастроек Цикл Ключи.Добавить(Элемент.Объект, Элемент.Идентификатор); КонецЦикла; @@ -5941,45 +6476,6 @@ КонецФункции -// Возвращает версию режима совместимости в формате нумерации редакций и версий, например, 8.3.15.0. -// -// Возвращаемое значение: -// Строка - версия режима совместимости в формате нумерации редакций и версий. -// -Функция ВерсияРежимаСовместимости() - - Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда - - Информация = Новый СистемнаяИнформация; - Возврат Информация.ВерсияПриложения; - - КонецЕсли; - - ОписаниеРежимаСовместимости = СтрРазделить(Метаданные.РежимСовместимости, "_"); - Символов = СтрДлина(ОписаниеРежимаСовместимости[0]); - - НомерРедакции = ""; - - Для НомерСимвола = 1 По Символов Цикл - - ТекущийСимвол = Сред(ОписаниеРежимаСовместимости[0], НомерСимвола, 1); - - Если СтрНайти("0123456789", ТекущийСимвол) > 0 Тогда - НомерРедакции = НомерРедакции + ТекущийСимвол; - КонецЕсли; - - КонецЦикла; - - ОписаниеРежимаСовместимости.Установить(0, НомерРедакции); - - Для Индекс = ОписаниеРежимаСовместимости.Количество() По 3 Цикл - ОписаниеРежимаСовместимости.Добавить("0"); - КонецЦикла; - - Возврат СтрСоединить(ОписаниеРежимаСовместимости, "."); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Процедуры используемые при обмене данными. @@ -6989,16 +7485,7 @@ // Заполняет коллекцию ролей. // // Параметры: -// Параметры - Структура: -// * ОсновнойПараметр - Неопределено -// - Булево -// - Строка -// - Массив -// - Соответствие -// * Форма - ФормаКлиентскогоПриложения -// * КоллекцияРолей - ТаблицаЗначений: -// ** Роль - Строка -// * НазначениеРолей - Строка +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры // Процедура ЗаполнитьРоли(Параметры) @@ -7043,9 +7530,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура НастроитьИнтерфейсРолейПриСозданииФормы(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; // Условное оформление недоступных ролей. ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить(); @@ -7085,9 +7575,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура НастроитьИнтерфейсРолейПриЧтенииНаСервере(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Элементы = Форма.Элементы; // Установка начальных значений перед загрузкой данных из настроек на сервере @@ -7104,10 +7597,13 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура НастроитьИнтерфейсРолейПриЗагрузкеНастроек(Параметры) Настройки = Параметры.ОсновнойПараметр; - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Элементы = Форма.Элементы; ПоказатьПодсистемыРолей = Форма.ПоказатьПодсистемыРолей; @@ -7126,9 +7622,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура УстановитьТолькоПросмотрРолей(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Элементы = Форма.Элементы; ТолькоПросмотрРолей = Параметры.ОсновнойПараметр; @@ -7149,9 +7648,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура ТолькоВыбранныеРоли(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Форма.Элементы.РолиПоказатьТолькоВыбранныеРоли.Пометка = НЕ Форма.Элементы.РолиПоказатьТолькоВыбранныеРоли.Пометка; @@ -7160,9 +7662,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура ГруппировкаПоПодсистемам(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Форма.ПоказатьПодсистемыРолей = НЕ Параметры.Форма.ПоказатьПодсистемыРолей; Форма.Элементы.РолиПоказатьПодсистемыРолей.Пометка = Параметры.Форма.ПоказатьПодсистемыРолей; @@ -7171,9 +7676,12 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура ОбновитьДеревоРолей(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Элементы = Форма.Элементы; Роли = Форма.Роли; НазначениеРолей = Параметры.НазначениеРолей; @@ -7270,6 +7778,17 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// ДеревоРолей - ДеревоЗначений: +// * ЭтоРоль - Булево +// * Имя - Строка - имя роли или подсистемы. +// * Синоним - Строка - синоним роли или подсистемы. +// * ЭтоНедоступнаяРоль - Булево +// * ЭтоНесуществующаяРоль - Булево +// * Пометка - Булево +// * НомерКартинки - Число +// Процедура ДобавитьИменаНесуществующихИНедоступныхРолей(Параметры, ДеревоРолей) КоллекцияРолей = Параметры.КоллекцияРолей; @@ -7380,9 +7899,12 @@ КонецФункции +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Процедура ОбновитьСоставРолей(Параметры) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; Роли = Форма.Роли; ПоказатьТолькоВыбранныеРоли = Форма.Элементы.РолиПоказатьТолькоВыбранныеРоли.Пометка; @@ -7461,6 +7983,11 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Роль - Строка +// Добавить - Булево +// Процедура ДобавитьУдалитьРоль(Параметры, Знач Роль, Знач Добавить) НайденныеРоли = Параметры.КоллекцияРолей.НайтиСтроки(Новый Структура("Роль", Роль)); @@ -7480,12 +8007,9 @@ // Изменяет состав ролей. // // Параметры: -// Параметры - Структура -// Коллекция - ДанныеФормыЭлементДерева: -// * Пометка - Булево -// * Имя - Строка -// * Синоним - Строка -// Добавить - Булево +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Коллекция - см. ОбработатьИнтерфейсРолей.Параметры.Форма.Элементы.Роли +// Добавить - Булево // Процедура ДобавитьУдалитьРолиПодсистемы(Параметры, Знач Коллекция, Знач Добавить) @@ -7499,9 +8023,13 @@ КонецПроцедуры +// Параметры: +// Параметры - см. ОбработатьИнтерфейсРолей.Параметры +// Коллекция - см. ОбработатьИнтерфейсРолей.Параметры.Форма.Элементы.Роли +// Процедура ОбновитьПометкуВыбранныхРолей(Параметры, Знач Коллекция) - Форма = Параметры.Форма; // ФормаКлиентскогоПриложения + Форма = Параметры.Форма; ПоказатьТолькоВыбранныеРоли = Форма.Элементы.РолиПоказатьТолькоВыбранныеРоли.Пометка; @@ -7584,4 +8112,4 @@ КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl index 39995bd00..c81f24c0b 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl @@ -271,7 +271,7 @@ // Вызывается при авторизации нового пользователя информационной базы. // // Параметры: -// ПользовательИБ - ПользовательИнформационнойБазы, текущий пользователь информационной базы, +// ПользовательИБ - ПользовательИнформационнойБазы - текущий пользователь информационной базы, // СтандартнаяОбработка - Булево - значение может быть установлено внутри обработчика, в этом случае // стандартная обработка авторизации нового пользователя ИБ выполняться не будет. // @@ -292,7 +292,7 @@ Попытка Блокировка = Новый БлокировкаДанных(); - БлокировкаСправочника = Блокировка.Добавить("Справочник.Пользователи"); + Блокировка.Добавить("Справочник.Пользователи"); Блокировка.Заблокировать(); Если Не ПользователиСлужебный.ПользовательПоИдентификаторуСуществует(ТекущийПользовательИБ.УникальныйИдентификатор) Тогда @@ -542,7 +542,7 @@ // ссылок в файлах выгрузки. // // Параметры: -// Типы - Массив Из ОбъектМетаданных. +// Типы - Массив из ОбъектМетаданных // Процедура ПриЗаполненииТиповТребующихАннотациюСсылокПриВыгрузке(Типы) Экспорт @@ -557,9 +557,9 @@ // ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется // дополнить эту таблицу значений информацией о регистрируемых произвольных // обработчиках выгрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных, при выгрузке данных которого должен +// ОбъектМетаданных - ОбъектМетаданных - при выгрузке данных которого должен // вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный +// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный // обработчик выгрузки данных. Набор экспортных процедур, которые должны // быть реализованы в обработчике, зависит от установки значений следующих // колонок таблицы значений, @@ -579,7 +579,7 @@ // СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве // значения параметра Сериализатор, а не полученных с помощью свойства глобального // контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных, перед выгрузкой данных которого +// ОбъектМетаданных - ОбъектМетаданных - перед выгрузкой данных которого // был вызван обработчик, // Отказ - Булево - если в процедуре ПередВыгрузкойТипа() установить значение // данного параметра равным Истина - выгрузка объектов, соответствующих @@ -601,17 +601,27 @@ // СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве // значения параметра Сериализатор, а не полученных с помощью свойства глобального // контекста СериализаторXDTO, -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - +// Объект - КонстантаМенеджерЗначения.* +// - СправочникОбъект.* +// - ДокументОбъект.* +// - БизнесПроцессОбъект.* +// - ЗадачаОбъект.* +// - ПланСчетовОбъект.* +// - ПланОбменаОбъект.* +// - ПланВидовХарактеристикОбъект.* +// - ПланВидовРасчетаОбъект.* +// - РегистрСведенийНаборЗаписей.* +// - РегистрНакопленияНаборЗаписей.* +// - РегистрБухгалтерииНаборЗаписей.* +// - РегистрРасчетаНаборЗаписей.* +// - ПоследовательностьНаборЗаписей.* +// - ПерерасчетНаборЗаписей.* - // объект данных информационной базы, перед выгрузкой которого был вызван обработчик. // Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра // Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при // этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но // не будут зафиксированы в информационной базе -// Артефакты - Массив Из ОбъектXDTO - набор дополнительной информации, логически неразрывно +// Артефакты - Массив из ОбъектXDTO - набор дополнительной информации, логически неразрывно // связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны // сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный // в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом, @@ -636,7 +646,7 @@ // СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве // значения параметра Сериализатор, а не полученных с помощью свойства глобального // контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных, после выгрузки данных которого +// ОбъектМетаданных - ОбъектМетаданных - после выгрузки данных которого // был вызван обработчик. // Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт @@ -652,9 +662,9 @@ // ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется // дополнить эту таблицу значений информацией о регистрируемых произвольных // обработчиках загрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных, при загрузке данных которого должен +// ОбъектМетаданных - ОбъектМетаданных - при загрузке данных которого должен // вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный +// Обработчик - ОбщийМодуль - общий модуль, в котором реализован произвольный // обработчик загрузки данных. Набор экспортных процедур, которые должны // быть реализованы в обработчике, зависит от установки значений следующих // колонок таблицы значений, @@ -668,7 +678,7 @@ // Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер // контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, перед сопоставлением ссылок которого +// ОбъектМетаданных - ОбъектМетаданных - перед сопоставлением ссылок которого // был вызван обработчик, // СтандартнаяОбработка - Булево - если процедуре ПередСопоставлениемСсылок() // установить значение данного параметра равным Ложь, вместо стандартного @@ -683,14 +693,14 @@ // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, // ТаблицаИсходныхСсылок - ТаблицаЗначений - содержащая информацию о ссылках, // выгруженных из исходной ИБ. Колонки: -// ИсходнаяСсылка - ЛюбаяСсылка, ссылка объекта исходной ИБ, которую требуется +// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта исходной ИБ, которую требуется // сопоставить c ссылкой в текущей ИБ, // Остальные колонки равным полям естественного ключа объекта, которые в // процессе выгрузки данных были переданы в функцию // Обработка.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы.ТребуетсяСопоставитьСсылкуПриЗагрузке() // Возвращаемое значение функции СопоставитьСсылки() - ТаблицаЗначений, колонки: -// ИсходнаяСсылка - ЛюбаяСсылка, ссылка объекта, выгруженная из исходной ИБ, -// Ссылка - ЛюбаяСсылка, сопоставленная исходной ссылка в текущей ИБ. +// ИсходнаяСсылка - ЛюбаяСсылка - ссылка объекта, выгруженная из исходной ИБ, +// Ссылка - ЛюбаяСсылка - сопоставленная исходной ссылка в текущей ИБ. // Отказ - Булево - если в процедуре ПередСопоставлениемСсылок() установить значение // данного параметра равным Истина - сопоставление ссылок, соответствующих // текущему объекту метаданных, выполняться не будет. @@ -702,7 +712,7 @@ // Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер // контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, перед загрузкой всех данных которого +// ОбъектМетаданных - ОбъектМетаданных - перед загрузкой всех данных которого // был вызван обработчик, // Отказ - Булево - если в процедуре ПередЗагрузкойТипа() установить значение данного // параметра равным Истина - загрузка всех объектов данных соответствующих текущему @@ -715,15 +725,25 @@ // Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер // контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - +// Объект - КонстантаМенеджерЗначения.* +// - СправочникОбъект.* +// - ДокументОбъект.* +// - БизнесПроцессОбъект.* +// - ЗадачаОбъект.* +// - ПланСчетовОбъект.* +// - ПланОбменаОбъект.* +// - ПланВидовХарактеристикОбъект.* +// - ПланВидовРасчетаОбъект.* +// - РегистрСведенийНаборЗаписей.* +// - РегистрНакопленияНаборЗаписей.* +// - РегистрБухгалтерииНаборЗаписей.* +// - РегистрРасчетаНаборЗаписей.* +// - ПоследовательностьНаборЗаписей.* +// - ПерерасчетНаборЗаписей.* - // объект данных информационной базы, перед загрузкой которого был вызван обработчик. // Значение, переданное в процедуру ПередЗагрузкойОбъекта() в качестве значения параметра // Объект может быть модифицировано внутри процедуры обработчика ПередЗагрузкойОбъекта(). -// Артефакты - Массив Из ОбъектXDTO - дополнительные данные, логически неразрывно связанные +// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные // с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах // ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре // ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, @@ -740,13 +760,23 @@ // Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер // контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - +// Объект - КонстантаМенеджерЗначения.* +// - СправочникОбъект.* +// - ДокументОбъект.* +// - БизнесПроцессОбъект.* +// - ЗадачаОбъект.* +// - ПланСчетовОбъект.* +// - ПланОбменаОбъект.* +// - ПланВидовХарактеристикОбъект.* +// - ПланВидовРасчетаОбъект.* +// - РегистрСведенийНаборЗаписей.* +// - РегистрНакопленияНаборЗаписей.* +// - РегистрБухгалтерииНаборЗаписей.* +// - РегистрРасчетаНаборЗаписей.* +// - ПоследовательностьНаборЗаписей.* +// - ПерерасчетНаборЗаписей.* - // объект данных информационной базы, после загрузки которого был вызван обработчик. -// Артефакты - Массив Из ОбъектXDTO - дополнительные данные, логически неразрывно связанные +// Артефакты - Массив из ОбъектXDTO - дополнительные данные, логически неразрывно связанные // с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах // ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре // ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, @@ -761,7 +791,7 @@ // Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер // контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, после загрузки всех объектов которого +// ОбъектМетаданных - ОбъектМетаданных - после загрузки всех объектов которого // был вызван обработчик. // Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт @@ -779,7 +809,7 @@ // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, // Сериализация - ОбъектXDTO - ОбъектXDTO {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}InfoBaseUser, // сериализация пользователя информационной базы, -// ПользовательИБ - ПользовательИнформационнойБазы, десериализованный из выгрузки, +// ПользовательИБ - ПользовательИнформационнойБазы - десериализованный из выгрузки, // Отказ - Булево - при установке значения данного параметры внутри этой процедуры в // значение Ложь загрузка пользователя информационной базы будет пропущена. // @@ -807,7 +837,7 @@ // к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, // Сериализация - ОбъектXDTO - ОбъектXDTO {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}InfoBaseUser, // сериализация пользователя информационной базы, -// ПользовательИБ - ПользовательИнформационнойБазы, десериализованный из выгрузки. +// ПользовательИБ - ПользовательИнформационнойБазы - десериализованный из выгрузки. // Процедура ПослеЗагрузкиПользователяИнформационнойБазы(Контейнер, Сериализация, ПользовательИБ) Экспорт @@ -1111,9 +1141,9 @@ НачатьТранзакцию(); Попытка - ВызываемыйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияПриложениямиИнтерфейс"); + МодульСообщенияУправленияПриложениямиИнтерфейс = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияПриложениямиИнтерфейс"); Сообщение = МодульСообщенияВМоделиСервиса.НовоеСообщение( - ВызываемыйМодуль.СообщениеАннулироватьДоступПользователя()); + МодульСообщенияУправленияПриложениямиИнтерфейс.СообщениеАннулироватьДоступПользователя()); Сообщение.Body.Zone = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Сообщение.Body.UserServiceID = ПользовательОбъект.ИдентификаторПользователяСервиса; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl index 33432207b..de16c3fd2 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 b117e4884..13b4c1bf3 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl @@ -131,8 +131,8 @@ Если ПараметрыКлиента.Свойство("ОшибкаАвторизации") Тогда Параметры.ПолученныеПараметрыКлиента.Вставить("ОшибкаАвторизации"); Параметры.Отказ = Истина; - Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( - "ИнтерактивнаяОбработкаПриОшибкеАвторизации", ЭтотОбъект); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ПоказатьПредупреждениеИПродолжить", + СтандартныеПодсистемыКлиент, ПараметрыКлиента.ОшибкаАвторизации); Возврат; КонецЕсли; @@ -201,16 +201,6 @@ КонецПроцедуры -// Предупреждает пользователя об ошибке авторизации. -Процедура ИнтерактивнаяОбработкаПриОшибкеАвторизации(Параметры, Контекст) Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске(); - - СтандартныеПодсистемыКлиент.ПоказатьПредупреждениеИПродолжить( - Параметры, ПараметрыКлиента.ОшибкаАвторизации); - -КонецПроцедуры - // Предлагает пользователю сменить пароль или завершить работу. Процедура ИнтерактивнаяОбработкаПриСменеПароляПриЗапуске(Параметры, Контекст) Экспорт @@ -311,7 +301,7 @@ Если Пользователь <> ТекущийПользователь Тогда ТекстПредупреждения = НСтр("ru = 'Для просмотра настроек другого пользователя необходимо - |запустить программу от его имени и открыть нужный отчет или форму.'"); + |запустить программу от его имени и открыть нужную настройку.'"); ПоказатьПредупреждение(,ТекстПредупреждения); Возврат; КонецЕсли; @@ -376,7 +366,7 @@ КонецЦикла; - ПоказатьПредупреждение(,НСтр("ru = 'Данную настройку невозможно просмотреть.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Просмотр данной настройки не предусмотрен.'")); Возврат; ИначеЕсли ЭлементДереваЗначений.Имя = "ПрочиеНастройки" Тогда @@ -387,7 +377,7 @@ Возврат; КонецЕсли; - ПоказатьПредупреждение(,НСтр("ru = 'Данную настройку невозможно просмотреть.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Просмотр данной настройки не предусмотрен.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl index 174bda666..1a6aad47f 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиентСервер/Module.bsl @@ -32,6 +32,25 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Восстановление паролей пользователей + +Функция ВерсияПредприятияПоддерживаетВосстановлениеПаролей() Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация(); + Поддерживает = + (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.15.2106") > 0 + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.16.0") < 0) + Или (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.16.1790") > 0 + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.17.0") < 0) + Или (ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.17.1822") > 0 + И ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.18.0") < 0) + Или ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.18.1200") > 0; + + Возврат Поддерживает; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -136,16 +155,8 @@ // Для форма элементов справочников Пользователи и ВнешниеПользователи. // // Параметры: -// Форма - ФормаКлиентскогоПриложения: -// * Объект - ДанныеФормыСтруктура: -// ** Ссылка - СправочникОбъект.Пользователи -// - СправочникОбъект.ВнешниеПользователи -// * Элементы - ВсеЭлементыФормы: -// ** НадписьНаличиеПароля - ДекорацияФормы -// - РасширениеДекорацииФормыДляНадписи -// ** ПотребоватьСменуПароляПриВходе - ПолеФормы -// - РасширениеПоляФормыДляПоляФлажка -// ** СменитьПароль - КнопкаФормы +// Форма - см. Справочник.Пользователи.Форма.ФормаЭлемента +// - см. Справочник.ВнешниеПользователи.Форма.ФормаЭлемента // ПарольУстановлен - Булево // АвторизованныйПользователь - СправочникСсылка.Пользователи // - СправочникСсылка.ВнешниеПользователи diff --git a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl index 04a8e3f83..a80edccea 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl @@ -46,7 +46,7 @@ // Истина - для модели сервиса (включая роли неразделенных пользователей). // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. // @@ -94,7 +94,7 @@ // ДляВнешнихПользователей - Булево - если истина, значит для внешних пользователей. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. // @@ -126,16 +126,16 @@ // // Возвращаемое значение: // ФиксированнаяСтруктура: -// * ТолькоДляАдминистраторовСистемы - ФиксированноеСоответствие: +// * ТолькоДляАдминистраторовСистемы - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. -// * ТолькоДляПользователейСистемы - ФиксированноеСоответствие: +// * ТолькоДляПользователейСистемы - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. -// * ТолькоДляВнешнихПользователей - ФиксированноеСоответствие: +// * ТолькоДляВнешнихПользователей - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. -// * СовместноДляПользователейИВнешнихПользователей - ФиксированноеСоответствие: +// * СовместноДляПользователейИВнешнихПользователей - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя роли. // * Значение - Булево - Истина. // @@ -336,7 +336,7 @@ // // Возвращаемое значение: // ФиксированныйМассив - со значениями: -// * Значение - Ссылка - пустая ссылка типа объекта авторизации. +// * Значение - ЛюбаяСсылка - пустая ссылка типа объекта авторизации. // Функция ПустыеСсылкиТиповОбъектовАвторизации() Экспорт diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl index 39f722079..82619281e 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Префиксация объектов". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Выполняет действия по изменению префикса информационной базы @@ -85,15 +80,16 @@ ПолноеИмяТаблицы = Ссылка.Метаданные().ПолноеИмя(); ТекстЗапроса = " |ВЫБРАТЬ - | ШапкаОбъекта.Дата КАК Дата, - | ЕСТЬNULL(ШапкаОбъекта.[ИмяРеквизитаОрганизация].Префикс, """") КАК ПрефиксОрганизацииДоИзменения + | ШапкаОбъекта.Дата КАК Дата, + | ЕСТЬNULL(ШапкаОбъекта.ИмяРеквизитаОрганизация.Префикс, """") КАК ПрефиксОрганизацииДоИзменения |ИЗ - | " + ПолноеИмяТаблицы + " КАК ШапкаОбъекта + | &ИмяТаблицы КАК ШапкаОбъекта |ГДЕ | ШапкаОбъекта.Ссылка = &Ссылка |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаОрганизация]", ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ПолноеИмяТаблицы)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ПолноеИмяТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяРеквизитаОрганизация", ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ПолноеИмяТаблицы)); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Ссылка); @@ -128,14 +124,15 @@ ПолноеИмяТаблицы = Ссылка.Метаданные().ПолноеИмя(); ТекстЗапроса = " |ВЫБРАТЬ - | ЕСТЬNULL(ШапкаОбъекта.[ИмяРеквизитаОрганизация].Префикс, """") КАК ПрефиксОрганизацииДоИзменения + | ЕСТЬNULL(ШапкаОбъекта.ИмяРеквизитаОрганизация.Префикс, """") КАК ПрефиксОрганизацииДоИзменения |ИЗ - | " + ПолноеИмяТаблицы + " КАК ШапкаОбъекта + | &ИмяТаблицы КАК ШапкаОбъекта |ГДЕ | ШапкаОбъекта.Ссылка = &Ссылка |"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяРеквизитаОрганизация]", ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ПолноеИмяТаблицы)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицы", ПолноеИмяТаблицы); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ИмяРеквизитаОрганизация", ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ПолноеИмяТаблицы)); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Ссылка); diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl index ee5827fb6..044f4f09f 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl @@ -239,23 +239,25 @@ МетаданныеОбъекта = Объект.Метаданные(); - ТекстЗапроса = " - |ВЫБРАТЬ + ТекстЗапроса = + "ВЫБРАТЬ | ШапкаОбъекта.Дата КАК Дата |ИЗ - | " + МетаданныеОбъекта.ПолноеИмя() + " КАК ШапкаОбъекта + | &ИмяТаблицыМетаданных КАК ШапкаОбъекта |ГДЕ - | ШапкаОбъекта.Ссылка = &Ссылка - |"; + | ШапкаОбъекта.Ссылка = &Ссылка"; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяТаблицыМетаданных", МетаданныеОбъекта.ПолноеИмя()); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка); - Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Если Не ПрефиксацияОбъектовСлужебный.ДатыОбъектаОдногоПериода(Выборка.Дата, Объект.Дата, Объект.Ссылка) Тогда + Объект.Номер = ""; + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl index c16f9c7f6..e8e813211 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежиме/Module.bsl @@ -24,10 +24,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеКаталогаФайловойСистемы(Знач Адрес, Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -58,10 +58,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеКаталогаВременныхФайлов(Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -80,10 +80,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеКаталогаПрограммы(Знач ЧтениеДанных = Ложь, Знач ЗаписьДанных = Ложь, Знач Описание = "") Экспорт @@ -104,10 +104,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаСозданиеCOMКласса(Знач ProgID, Знач CLSID, Знач ИмяКомпьютера = "", Знач Описание = "") Экспорт @@ -133,10 +133,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеВнешнейКомпоненты(Знач ИмяМакета, Знач Описание = "") Экспорт @@ -159,10 +159,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеВнешнегоМодуля(Знач Имя, Знач КонтрольнаяСумма, Знач Описание = "") Экспорт @@ -186,10 +186,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеПриложенияОперационнойСистемы(Знач ШаблонСтрокиЗапуска, Знач Описание = "") Экспорт @@ -248,10 +248,10 @@ // // Возвращаемое значение: // ОбъектXDTO - внутреннее описание запрашиваемого разрешения. -// Предназначен только для передачи в качестве параметра в функции. -// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), -// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и -// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). +// Предназначен только для передачи в качестве параметра в функции. +// РаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(), +// РаботаВБезопасномРежиме.ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов() и +// РаботаВБезопасномРежиме.ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(). // Функция РазрешениеНаИспользованиеПривилегированногоРежима(Знач Описание = "") Экспорт @@ -286,8 +286,8 @@ // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. +// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // Функция ЗапросНаИспользованиеВнешнихРесурсов(Знач НовыеРазрешения, Знач Владелец = Неопределено, Знач РежимЗамещения = Истина) Экспорт @@ -314,8 +314,8 @@ // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. +// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // Функция ЗапросНаОтменуРазрешенийИспользованияВнешнихРесурсов(Знач Владелец, Знач ОтменяемыеРазрешения) Экспорт @@ -340,8 +340,8 @@ // // Возвращаемое значение: // УникальныйИдентификатор - ссылка на записанный в ИБ запрос разрешений. После создания -// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. -// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). +// всех запросов на изменение разрешений требуется применить запрошенные изменения с помощью вызова процедуры. +// РаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(). // Функция ЗапросНаОчисткуРазрешенийИспользованияВнешнихРесурсов(Знач Владелец) Экспорт @@ -414,7 +414,7 @@ // ИмяМакета - Строка - имя макета конфигурации, в составе которого поставляется комплект внешней компоненты. // // Возвращаемое значение: -// ФиксированноеСоответствие - контрольные суммы файлов: +// ФиксированноеСоответствие из КлючИЗначение - контрольные суммы файлов: // * Ключ - Строка - имя файла, // * Значение - Строка - контрольная сумма. // diff --git a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl index 57a38c6a3..ad26c5a4b 100644 --- a/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаВБезопасномРежимеСлужебный/Module.bsl @@ -41,7 +41,7 @@ // Возвращает режим подключения внешнего модуля. // // Параметры: -// ВнешнийМодуль - ЛюбаяСсылка, ссылка, соответствующая внешнему модулю, для которого запрашиваются +// ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // режим подключения. // // Возвращаемое значение: @@ -78,12 +78,13 @@ // // Параметры: // ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются разрешения, -// НовыеРазрешения - Массив Из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям +// НовыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям // запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые // в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(). // При запросе разрешений для внешних модулей добавление разрешений всегда выполняется в режиме замещения. // -// Возвращаемое значение - Массив Из УникальныйИдентификатор - идентификаторы созданных запросов. +// Возвращаемое значение: +// Массив из УникальныйИдентификатор - идентификаторы созданных запросов. // Функция ЗапросРазрешенийДляВнешнегоМодуля(Знач ПрограммныйМодуль, Знач НовыеРазрешения = Неопределено) Экспорт @@ -172,7 +173,7 @@ // (см. ТаблицыРазрешений()). // // Возвращаемое значение: -// ТабличныйДокумент - , представление разрешений на использование внешних ресурсов. +// ТабличныйДокумент - представление разрешений на использование внешних ресурсов. // Функция ПредставлениеРазрешенийНаИспользованиеВнешнихРесурсов(Знач ТипПрограммногоМодуля, Знач ИдентификаторПрограммногоМодуля, Знач ТипВладельца, Знач ИдентификаторВладельца, Знач Разрешения) Экспорт @@ -256,7 +257,8 @@ // ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // разрешения. (Неопределено при запросе разрешений для конфигурации, а не для внешних модулей). // -// Возвращаемое значение - УникальныйИдентификатор - идентификатор созданного запроса. +// Возвращаемое значение: +// УникальныйИдентификатор - идентификатор созданного запроса. // Функция ЗапросСозданияПрофиляБезопасности(Знач ПрограммныйМодуль) @@ -311,7 +313,8 @@ // Параметры: // ИмяМакета - Строка - имя макета конфигурации, в составе которого поставляется комплект внешней компоненты. // -// Возвращаемое значение - ФиксированноеСоответствие: +// Возвращаемое значение: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя файла, // * Значение - Строка - контрольная сумма. // @@ -415,7 +418,7 @@ // Формирует ссылку из данных, хранящихся в регистрах разрешений. // // Параметры: -// Тип - СправочникСсылка.ИдентификаторОбъектаМетаданных, +// Тип - СправочникСсылка.ИдентификаторыОбъектовМетаданных // Идентификатор - УникальныйИдентификатор - уникальный идентификатор ссылки. // // Возвращаемое значение: @@ -449,16 +452,17 @@ // Владелец - ЛюбаяСсылка - владелец разрешений на использование внешних ресурсов. // (Неопределено при запросе разрешений для конфигурации, а не для объектов конфигурации), // РежимЗамещения - Булево - режим замещения ранее предоставленных для владельца разрешений, -// ДобавляемыеРазрешения - Массив Из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям +// ДобавляемыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям // запрашиваемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые // в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(), -// УдаляемыеРазрешения - Массив Из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям +// УдаляемыеРазрешения - Массив из ОбъектXDTO - массив ОбъектовXDTO, соответствующих внутренним описаниям // отменяемых разрешений на доступ к внешним ресурсам. Предполагается, что все ОбъектыXDTO, передаваемые // в качестве параметра, сформированы с помощью вызова функций РаботаВБезопасномРежиме.Разрешение*(), // ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // разрешения. (Неопределено при запросе разрешений для конфигурации, а не для внешних модулей). // -// Возвращаемое значение - УникальныйИдентификатор - идентификатор созданного запроса. +// Возвращаемое значение: +// УникальныйИдентификатор - идентификатор созданного запроса. // Функция ЗапросИзмененияРазрешений(Знач Владелец, Знач РежимЗамещения, Знач ДобавляемыеРазрешения = Неопределено, Знач УдаляемыеРазрешения = Неопределено, Знач ПрограммныйМодуль = Неопределено) Экспорт @@ -493,7 +497,8 @@ // ВнешнийМодуль - ЛюбаяСсылка - ссылка, соответствующая внешнему модулю, для которого запрашиваются // разрешения. (Неопределено при запросе разрешений для конфигурации, а не для внешних модулей). // -// Возвращаемое значение - УникальныйИдентификатор - идентификатор созданного запроса. +// Возвращаемое значение: +// УникальныйИдентификатор - идентификатор созданного запроса. // Функция ЗапросУдаленияПрофиляБезопасности(Знач ПрограммныйМодуль) Экспорт @@ -527,7 +532,7 @@ // для текущей информационной базы. // // Возвращаемое значение: -// Массив Из УникальныйИдентификатор - идентификаторы запросов для обновления разрешений +// Массив из УникальныйИдентификатор - идентификаторы запросов для обновления разрешений // конфигурации до требуемых в настоящий момент. // Функция ЗапросыОбновленияРазрешенийКонфигурации(Знач ВключаяЗапросСозданияПрофиляИБ = Истина) Экспорт @@ -635,7 +640,7 @@ // Возвращает массив менеджеров справочников, которые являются контейнерами внешних модулей. // // Возвращаемое значение: -// Массив(СправочникМенеджер). +// Массив из СправочникМенеджер // Функция МенеджерыВнешнихМодулей() diff --git a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl index ba4ed9767..d1d8998fb 100644 --- a/SSL/src/CommonModules/РаботаСАдресами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресами/Module.bsl @@ -75,8 +75,9 @@ Регион = СокрЛП(Адрес.Area + " " + Адрес.AreaType); - Если ЭтоГородФедеральногоЗначения(Регион) Тогда - Возврат Регион; + Если ЭтоГородФедеральногоЗначения(Регион) + Или СтрСравнить(Адрес.AddressType, УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес()) = 0 Тогда + Возврат Регион; КонецЕсли; Город = СокрЛП(Адрес.City + " " + Адрес.CityType); @@ -302,7 +303,7 @@ // функцию следует вызвать в фоновом задании. // // Параметры: -// Адреса - Соответствие: +// Адреса - Соответствие из КлючИЗначение: // * Ключ - Число - уникальный идентификатор адреса; // * Значение - Строка - проверяемый адрес во внутреннем формате JSON. // В целях обратной совместимости допускается передача адреса в виде XML, @@ -316,7 +317,7 @@ // в представление актуального адреса. По умолчанию, Ложь. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Число - уникальный идентификатор адреса; // * Значение - Структура: // * АдресПроверен - Булево - признак, что адрес был проверен в классификаторе или через веб-сервис. @@ -675,7 +676,7 @@ // Возвращает общепринятые сокращения адресных объектов. // // Возвращаемое значение: -// Соответствие - список общепринятых сокращений: +// Соответствие из КлючИЗначение - список общепринятых сокращений: // * Ключ - Строка - полное наименование адресного объекта. Например, "Дом", "Квартира" // * Значение - Строка - сокращенное наименование адресного объекта. Например, "Д.", "Кв." // @@ -1185,19 +1186,27 @@ // См. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов. // // Параметры: -// Классификаторы - см. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов.Классификаторы -// ОписаниеКлассификатора - Строка +// Классификаторы - см. РаботаСКлассификаторамиПереопределяемый.ПриДобавленииКлассификаторов.Классификаторы // -Процедура ПриДобавленииКлассификаторов(Классификаторы, ОписаниеКлассификатора) Экспорт +Процедура ПриДобавленииКлассификаторов(Классификаторы) Экспорт - ОписаниеКлассификатора.Идентификатор = ИдентификаторКлассификатора(); - ОписаниеКлассификатора.Наименование = НСтр("ru = 'Общероссийский классификатор стран мира'"); - ОписаниеКлассификатора.ОбновлятьАвтоматически = Истина; - ОписаниеКлассификатора.ОбщиеДанные = Истина; - ОписаниеКлассификатора.СохранятьФайлВКэш = Истина; - ОписаниеКлассификатора.ОбработкаРазделенныхДанных = Ложь; + Описание = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.РаботаСКлассификаторами") Тогда + МодульРаботаСКлассификаторами = ОбщегоНазначения.ОбщийМодуль("РаботаСКлассификаторами"); + Описание = МодульРаботаСКлассификаторами.ОписаниеКлассификатора(); + КонецЕсли; + Если Описание = Неопределено Тогда + Возврат; + КонецЕсли; + + Описание.Идентификатор = ИдентификаторКлассификатора(); + Описание.Наименование = НСтр("ru = 'Общероссийский классификатор стран мира'"); + Описание.ОбновлятьАвтоматически = Истина; + Описание.ОбщиеДанные = Истина; + Описание.СохранятьФайлВКэш = Истина; + Описание.ОбработкаРазделенныхДанных = Ложь; - Классификаторы.Добавить(ОписаниеКлассификатора); + Классификаторы.Добавить(Описание); КонецПроцедуры @@ -1220,6 +1229,9 @@ #Область СлужебныеПроцедурыИФункции +// Параметры: +// СписокВыбора - СписокЗначений +// Процедура ЗаполнитьМаскиНомераТелефона(СписокВыбора) Экспорт СписокВыбора.Добавить("+7(999) 999-99-99", СтроковыеФункции.ФорматированнаяСтрока(НСтр("ru='+7(999) 999-99-99, (Пример: +7(910) 123-23-23)'"))); @@ -1248,12 +1260,12 @@ // Возвращаемое значение: // Массив из Структура: // * Код - Строка -// * Наименование - Строка -// * Тип - Строка -// * Порядок - Строка -// * КодФИАС - Строка -// * Сокращение - Строка -// * Ключ - Строка +// * Наименование - Строка +// * Тип - Строка +// * Порядок - Строка +// * КодФИАС - Строка +// * Сокращение - Строка +// * Ключ - Строка // Функция ТипыОбъектовАдресацииАдресаРФ() Экспорт @@ -1403,7 +1415,7 @@ // Изменяет в адресе часто используемые сокращения // // Параметры: -// ДанныеАнализа - см. УправлениеКонтактнойИнформациейСлужебный.ЧастиАдреса +// ДанныеАнализа - см. УправлениеКонтактнойИнформациейСлужебный.ЧастиАдреса // Процедура ОбработкаЧастыхСокращенийВАдресах(Знач ДанныеАнализа) Экспорт @@ -2069,7 +2081,7 @@ Возврат АдресРФ.СвРайМО; КонецЕсли; - АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Свойства().Получить("СвРайМО").Тип ); + АдресРФ.СвРайМО = ФабрикаXDTO.Создать( АдресРФ.Свойства().Получить("СвРайМО").Тип); Возврат АдресРФ.СвРайМО; КонецФункции @@ -2267,6 +2279,7 @@ УровеньИдентификатора = ?(ЧастьАдреса.Значение.Уровень < 10, ЧастьАдреса.Значение.Уровень * 10, ЧастьАдреса.Значение.Уровень); Если ЗначениеЗаполнено(ИдентификаторТекущегоУровня) И МаксимальныйУровеньИдентификатора < УровеньИдентификатора Тогда ИдентификаторАдресногоОбъекта = ИдентификаторТекущегоУровня; + МаксимальныйУровеньИдентификатора = УровеньИдентификатора; КонецЕсли; КонецЦикла; @@ -2407,7 +2420,7 @@ КонецФункции // Возвращаемое значение: -// Соответствие из Структура - где: +// Соответствие из Структура: // * Ключ - Строка // * Значение - Структура: // ** Имя - Строка @@ -2790,7 +2803,7 @@ // // Параметры: // СоответствиеПолей - СписокЗначений - соответствия полей. -// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. +// БезПустыхПолей - Булево - флаг сохранения полей с пустыми значениями. // // Возвращаемое значение: // Строка - результат, преобразованный из списка. @@ -2833,7 +2846,7 @@ // // Параметры: // СтруктураЗначенийПолей - Структура -// БезПустыхПолей - Булево - необязательный флаг сохранения полей с пустыми значениями. +// БезПустыхПолей - Булево - флаг сохранения полей с пустыми значениями. // // Возвращаемое значение: // Строка - результат преобразования из структуры. @@ -4092,7 +4105,7 @@ Продолжить; КонецЕсли; - Для каждого СтрокаВидаКИ Из СтрокаТаблицы.Значение Цикл + Для каждого СтрокаВидаКИ Из СтрокаТаблицы.Значение Цикл // СправочникСсылка.ВидыКонтактнойИнформации СвойстваВида = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаВидаКИ.Вид, "ВключатьСтрануВПредставление, ХранитьИсториюИзменений, Ссылка"); diff --git a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl index f97684b9c..78442a591 100644 --- a/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСАдресамиКлиентСервер/Module.bsl @@ -476,7 +476,7 @@ Если ТипАдреса = УправлениеКонтактнойИнформациейКлиентСервер.ИностранныйАдрес() Тогда - Уровни.Добавить("City"); + Уровни.Добавить("Area"); Иначе @@ -570,10 +570,8 @@ СписокЗаполненныхУровней = Новый Массив; - НаименованиеСтраны = ""; Если ВключатьСтрануВПредставление И Адрес.Свойство("Country") И НЕ ПустаяСтрока(Адрес.Country) Тогда СписокЗаполненныхУровней.Добавить(Адрес.Country); - НаименованиеСтраны = Адрес.Country; КонецЕсли; Если Адрес.Свойство("ZipCode") И НЕ ПустаяСтрока(Адрес.ZipCode) Тогда diff --git a/SSL/src/CommonModules/РаботаСБанками/Module.bsl b/SSL/src/CommonModules/РаботаСБанками/Module.bsl index 36e91f188..dee49cea1 100644 --- a/SSL/src/CommonModules/РаботаСБанками/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанками/Module.bsl @@ -170,7 +170,6 @@ #КонецОбласти - #Область СлужебныйПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -208,7 +207,9 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт ИмяОбработки = "ЗагрузкаКлассификатораБанков"; diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl index 5370948b8..a943b218a 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -73,15 +73,19 @@ // СуммаЧислом - Число - сумма, которую надо представить прописью. // Валюта - СправочникСсылка.Валюты - валюта, в которой нужно представить сумму. // БезДробнойЧасти - Булево - указать Истина, если требуется получить сумму без дробной части (без копеек). +// КодЯзыка - Строка - язык, на котором требуется получить сумму прописью. +// Состоит из кода языка по ISO 639-1 и, опционально, кода страны по ISO 3166-1, разделенных +// символом подчеркивания. Примеры: "en", "en_US", "en_GB", "ru", "ru_RU". +// Значение по умолчанию - язык конфигурации. // // Возвращаемое значение: // Строка - сумма прописью. // -Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти = Ложь) Экспорт +Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти = Ложь, Знач КодЯзыка = Неопределено) Экспорт Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда - Результат = Обработки["ЗагрузкаКурсовВалют"].СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти); - Иначе + Результат = Обработки["ЗагрузкаКурсовВалют"].СформироватьСуммуПрописью(СуммаЧислом, Валюта, БезДробнойЧасти, КодЯзыка); + Иначе Результат = ""; КонецЕсли; Возврат Результат; @@ -136,7 +140,9 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт ОбъектМетаданных = Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют"); @@ -225,17 +231,13 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.КурсыВалют.ПолноеИмя()); КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если ОбщегоНазначения.РазделениеВключено() Тогда @@ -360,17 +362,6 @@ КонецФункции -// Возвращает информацию о курсе валюты на основе ссылки на валюту. -// Данные возвращаются в виде структуры. -// -// Параметры: -// ВыбраннаяВалюта - Справочник.Валюты / Ссылка - ссылка на валюту, информацию -// о курсе которой необходимо получить. -// -// Возвращаемое значение: -// ДанныеКурса - структура - содержащая информацию о последней доступной -// записи курса. -// Функция ЗаполнитьДанныеКурсаДляВалюты(ВыбраннаяВалюта) Экспорт ДанныеКурса = Новый Структура("ДатаКурса, Курс, Кратность"); @@ -393,13 +384,6 @@ КонецФункции -// Возвращает таблицу значений - валюты, зависящие от переданной -// в качестве параметра. -// Возвращаемое значение -// ТаблицаЗначений -// колонка "Ссылка" - СправочникСсылка.Валюты -// колонка "Наценка" - число. -// Функция СписокЗависимыхВалют(ВалютаБазовая, ДополнительныеСвойства = Неопределено) Экспорт Кэшировать = (ТипЗнч(ДополнительныеСвойства) = Тип("Структура")); @@ -456,8 +440,6 @@ Процедура ОбновитьКурсВалюты(Параметры, АдресРезультата) Экспорт ЗависимаяВалюта = Параметры.Валюта; - СпособУстановкиКурса = ЗависимаяВалюта.СпособУстановкиКурса; - СписокВалют = Параметры.Валюта.ИспользуемыеВалютыПриРасчетеКурса; ТекстЗапроса = diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl index e9d9a413d..cea9c06b2 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютСлужебный/Module.bsl @@ -254,7 +254,7 @@ // // Параметры: // ТаблицаКурсов - ТаблицаЗначений - с колонками Код, Дата, Кратность, Курс. -// Файл - Строка или ЗаписьТекста. +// Файл - Строка, ЗаписьТекста // Процедура ЗаписатьТаблицуКурсов(Знач ТаблицаКурсов, Знач Файл) @@ -291,7 +291,7 @@ // ИскатьДубликаты - Булево - сворачивает записи с одинаковой датой. // // Возвращаемое значение -// ТаблицаЗначений - с колонками Код, Дата, Кратность, Курс. +// ТаблицаЗначений - с колонками Код, Дата, Кратность, Курс. // Функция ПрочитатьТаблицуКурсов(Знач ПутьКФайлу, Знач ИскатьДубликаты = Ложь) @@ -335,7 +335,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Descriptor. -// ПутьКФайлу - строка - полное имя извлеченного файла. +// ПутьКФайлу - Строка - полное имя извлеченного файла. // Процедура ОбработатьПоставляемыеКурсы(Знач Дескриптор, Знач ПутьКФайлу) @@ -379,7 +379,7 @@ // // Параметры: // Дескриптор - ОбъектXDTO Descriptor. -// ПутьКФайлу - строка - полное имя извлеченного файла. +// ПутьКФайлу - Строка - полное имя извлеченного файла. // Процедура ОбработатьПоставляемыеКурсыЗаДень(Знач Дескриптор, Знач ПутьКФайлу) @@ -460,7 +460,7 @@ // Копирует курсы во все ОД // // Параметры: -// ДатаКурсов - Дата или Неопределено - курсы добавляются за указанную дату либо за все время. +// ДатаКурсов - Дата, Неопределено - курсы добавляются за указанную дату либо за все время. // ТаблицаКурсов - ТаблицаЗначений с курсами. // ОбластиДляОбновления - массив со списком кодов областей. // ИдентификаторФайла - УникальныйИдентификатор файла обрабатываемых курсов. @@ -748,4 +748,66 @@ КонецПроцедуры +Функция ФормыВводаПрописей() Экспорт + + КоллекцииФорм = Новый Массив; + КоллекцииФорм.Добавить(Метаданные.ОбщиеФормы); + КоллекцииФорм.Добавить(Метаданные.Справочники.Валюты.Формы); + Если Метаданные.Обработки.Найти("ЗагрузкаКурсовВалют") <> Неопределено Тогда + КоллекцииФорм.Добавить(Метаданные.Обработки["ЗагрузкаКурсовВалют"].Формы); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ДопустимыеКодыЯзыков = МодульУправлениеПечатьюМультиязычность.ДоступныеЯзыки(); + Иначе + ДопустимыеКодыЯзыков = СтандартныеПодсистемыСервер.ЯзыкиКонфигурации(); + КонецЕсли; + + НайденныеФормы = Новый Соответствие; + Для Каждого КодЯзыка Из ДопустимыеКодыЯзыков Цикл + НайденныеФормы.Вставить(КодЯзыка, ""); + КонецЦикла; + + Результат = Новый СписокЗначений; + + Для Каждого КоллекцияФорм Из КоллекцииФорм Цикл + Для Каждого Форма Из КоллекцияФорм Цикл + ЧастиИмени = СтрРазделить(Форма.Имя, "_", Истина); + Суффикс = ЧастиИмени[ЧастиИмени.ВГраница()]; + Если НайденныеФормы[Суффикс] <> Неопределено Тогда + НайденныеФормы[Суффикс] = Форма.ПолноеИмя(); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ДобавитьФормуПараметрыПрописиВалютыНаДругихЯзыках = Ложь; + + Для Каждого КодЯзыка Из ДопустимыеКодыЯзыков Цикл + Если ЗначениеЗаполнено(НайденныеФормы[КодЯзыка]) Тогда + Результат.Добавить(КодЯзыка, НайденныеФормы[КодЯзыка]); + Иначе + ДобавитьФормуПараметрыПрописиВалютыНаДругихЯзыках = Истина; + КонецЕсли; + КонецЦикла; + + Если ДобавитьФормуПараметрыПрописиВалютыНаДругихЯзыках Тогда + Результат.Добавить("", "ПараметрыПрописиВалютыНаДругихЯзыках"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ПредставлениеЯзыка(КодЯзыка) Экспорт + + Представление = ПредставлениеКодаЛокализации(КодЯзыка); + ЧастиСтроки = СтрРазделить(Представление, " ", Истина); + ЧастиСтроки[0] = ТРег(ЧастиСтроки[0]); + Представление = СтрСоединить(ЧастиСтроки, " "); + + Возврат Представление; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl index bbc88acaa..827398cbe 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl @@ -18,7 +18,7 @@ // // Возвращаемое значение: // Структура - результат отправки письма: -// * ОшибочныеПолучатели - Соответствие - адреса получателей с ошибками: +// * ОшибочныеПолучатели - Соответствие из КлючИЗначение - адреса получателей с ошибками: // ** Ключ - Строка - адрес получателя; // ** Значение - Строка - текст ошибки. // * ИдентификаторПисьмаSMTP - Строка - уникальный идентификатор письма, присвоенный при отправке по протоколу SMTP. @@ -38,14 +38,14 @@ // Параметры: // УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - почтовый ящик, с которого необходимо // выполнить отправку. -// Письма - Массив - коллекция почтовых сообщений. Элемент коллекции - ИнтернетПочтовоеСообщение. +// Письма - Массив из ИнтернетПочтовоеСообщение - коллекция почтовых сообщений. Элемент коллекции - ИнтернетПочтовоеСообщение. // ТекстОшибки - Строка - сообщение об ошибке в случае, когда удалось отправить не все письма. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - ИнтернетПочтовоеСообщение - отправляемое письмо; // * Значение - Структура - результат отправки письма: -// ** ОшибочныеПолучатели - Соответствие - адреса получателей с ошибками: +// ** ОшибочныеПолучатели - Соответствие из КлючИЗначение - адреса получателей с ошибками: // *** Ключ - Строка - адрес получателя; // *** Значение - Строка - текст ошибки. // ** ИдентификаторПисьмаSMTP - Строка - уникальный идентификатор письма, присвоенный при отправке по протоколу SMTP. diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl index d828fca1c..cd0c22f06 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -203,12 +203,12 @@ ВыполнитьОбработкуОповещения(ОбработчикРезультата, Ложь); КонецПроцедуры -Функция ПроверитьНастройкиУчетнойЗаписи(УчетнаяЗапись) Экспорт +Процедура ПроверитьНастройкиУчетнойЗаписи(УчетнаяЗапись) Экспорт Параметры = Новый Структура("УчетнаяЗапись", УчетнаяЗапись); ОткрытьФорму("Справочник.УчетныеЗаписиЭлектроннойПочты.Форма.ПроверкаНастроекУчетнойЗаписи", Параметры); -КонецФункции +КонецПроцедуры Процедура ПолеПароляНачалоВыбора(Элемент, Реквизит, СтандартнаяОбработка) Экспорт diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl index d90d433e4..42568392d 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиПереопределяемый/Module.bsl @@ -34,8 +34,8 @@ // * Представление - Строка - представление адресата. // // * Копии - Массив - коллекция структур адресов: -// * Адрес - строка - почтовый адрес (должно быть обязательно заполнено). -// * Представление - строка - имя адресата. +// * Адрес - Строка - почтовый адрес (должно быть обязательно заполнено). +// * Представление - Строка - имя адресата. // // - Строка - интернет-адреса получателей письма, разделитель - ";". // @@ -45,11 +45,11 @@ // * Тема - Строка - (обязательный) тема почтового сообщения. // * Тело - Строка - (обязательный) текст почтового сообщения (простой текст в кодировке win-1251). // * Важность - ВажностьИнтернетПочтовогоСообщения. -// * Вложения - Соответствие: +// * Вложения - Соответствие из КлючИЗначение: // * ключ - Строка - наименование вложения // * значение - ДвоичныеДанные // - АдресВоВременномХранилище - данные вложения; -// - Структура - содержащая следующие свойства: +// - Структура: // * ДвоичныеДанные - ДвоичныеДанные - двоичные данные вложения. // * Идентификатор - Строка - идентификатор вложения, используется для хранения картинок, // отображаемых в теле письма. diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl index 533feac27..4d2519e0d 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиСлужебный/Module.bsl @@ -113,7 +113,7 @@ НачатьТранзакцию(); Попытка Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Справочник.УчетныеЗаписиЭлектроннойПочты"); + Блокировка.Добавить("Справочник.УчетныеЗаписиЭлектроннойПочты"); Блокировка.Заблокировать(); УчетнаяЗаписьЭтойБазы = Неопределено; @@ -135,7 +135,7 @@ КонецЕсли; Если УчетнаяЗаписьЭтойБазы <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(УчетнаяЗаписьЭтойБазы, УчетнаяЗаписьКорреспондента,,"ИмяПредопределенныхДанных, Родитель, Владелец, Ссылка"); + ЗаполнитьЗначенияСвойств(УчетнаяЗаписьЭтойБазы, УчетнаяЗаписьКорреспондента,, "ИмяПредопределенныхДанных, Родитель, Владелец, Ссылка"); Иначе УчетнаяЗаписьЭтойБазы = УчетнаяЗаписьКорреспондента; КонецЕсли; @@ -171,6 +171,141 @@ КонецФункции +// Возвращает настройки учетной записи подключения к почтовому серверу для отправки почты. +// Если не удалось получить учетную запись по ссылке, то будет возвращена пустая структура. +// +// Параметры: +// УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись. +// +// Возвращаемое значение: +// Структура: +// * АдресСервераSMTP - Строка +// * ПортSMTP - Число - порт STMP, по умолчанию 25. +// * ПарольSMTP - Строка - пароля для сервера STMP +// * ИспользоватьSSL - Булево - по умолчанию Ложь. +// * ПользовательSMTP - Строка +// * ИмяОтправителя - Строка +// +Функция НастройкиУчетнойЗаписиДляОтправкиПочта(УчетнаяЗапись) Экспорт + + Результат = Новый Структура; + Результат.Вставить("АдресСервераSMTP", ""); + Результат.Вставить("ПортSMTP", 25); + Результат.Вставить("ПарольSMTP", ""); + Результат.Вставить("ИспользоватьSSL", Ложь); + Результат.Вставить("ПользовательSMTP", ""); + Результат.Вставить("ИмяОтправителя", ""); + + ТекстЗапроса = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ + | УчетныеЗаписиЭлектроннойПочты.СерверИсходящейПочты КАК АдресСервераSMTP, + | УчетныеЗаписиЭлектроннойПочты.ПортСервераИсходящейПочты КАК ПортSMTP, + | УчетныеЗаписиЭлектроннойПочты.ИспользоватьЗащищенноеСоединениеДляИсходящейПочты КАК ИспользоватьSSL, + | УчетныеЗаписиЭлектроннойПочты.Пользователь КАК ПользовательSMTP, + | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя КАК ИмяОтправителя + |ИЗ + | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты + |ГДЕ + | УчетныеЗаписиЭлектроннойПочты.Ссылка = &Ссылка"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", УчетнаяЗапись); + РезультатЗапроса = Запрос.Выполнить(); + + Если РезультатЗапроса.Пустой() Тогда + Возврат Результат; + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + + Если Выборка.Следующий() Тогда + + УстановитьПривилегированныйРежим(Истина); + ПарольSMTP = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчетнаяЗапись, "ПарольSMTP"); + УстановитьПривилегированныйРежим(Ложь); + + ЗаполнитьЗначенияСвойств(Результат, Выборка); + Результат.ПарольSMTP = ПарольSMTP; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Восстановление пароля + +Процедура ОбновитьНастройкиСервераВосстановленияПочты(Ссылка) Экспорт + + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда + Возврат; + КонецЕсли; + + НастройкиУчетнойЗаписи = НастройкиУчетнойЗаписиДляВосстановленияПароля(); + Если Не НастройкиУчетнойЗаписи.Используется + Или НастройкиУчетнойЗаписи.УчетнаяЗаписьПочты <> Ссылка Тогда + Возврат; + КонецЕсли; + + НастройкиВосстановленияПароля = ПользователиСлужебный.НастройкиВосстановленияПароля(); + Если НастройкиВосстановленияПароля = Неопределено Тогда + Возврат; + КонецЕсли; + + ВнешнийПочтовыйСервер = ПользователиСлужебный.СпособВосстановленияПароляПользователяИнформационнойБазы("ОтправкаКодаПодтвержденияПоЗаданнымПараметрам"); + Если НастройкиВосстановленияПароля.СпособВосстановленияПароля <> ВнешнийПочтовыйСервер Тогда + Возврат; + КонецЕсли; + + НастройкиУчетнойЗаписиДляОтправкиПочта = НастройкиУчетнойЗаписиДляОтправкиПочта(Ссылка); + ЗаполнитьЗначенияСвойств(НастройкиВосстановленияПароля, НастройкиУчетнойЗаписиДляОтправкиПочта); + + ПользователиСлужебный.УстановитьНастройкиВосстановленияПароля(НастройкиВосстановленияПароля); + +КонецПроцедуры + +Процедура СохранитьНастройкиУчетнойЗаписиДляВосстановленияПароля(Настройки) Экспорт + + Если ТипЗнч(Настройки) <> Тип("Структура") Тогда + ВызватьИсключение НСтр("ru='Неверный тип настроек учетной записи для восстановления пароля'"); + КонецЕсли; + + СведенияОбУчетнойЗаписи = ОписаниеНастроекУчетнойЗаписиДляВосстановленияПароля(); + ЗаполнитьЗначенияСвойств(СведенияОбУчетнойЗаписи, Настройки); + + Константы.УчетнаяЗаписьДляВосстановленияПароля.Установить(Новый ХранилищеЗначения(СведенияОбУчетнойЗаписи)); + +КонецПроцедуры + +Функция НастройкиУчетнойЗаписиДляВосстановленияПароля() Экспорт + + СведенияОбУчетнойЗаписи = ОписаниеНастроекУчетнойЗаписиДляВосстановленияПароля(); + + УстановитьПривилегированныйРежим(Истина); + ДанныеИзКонстанты = Константы.УчетнаяЗаписьДляВосстановленияПароля.Получить(); + Если ТипЗнч(ДанныеИзКонстанты) = Тип("ХранилищеЗначения") Тогда + + СведенияОбУчетнойЗаписиДляВосстановленияПароля = ДанныеИзКонстанты.Получить(); + Если ТипЗнч(СведенияОбУчетнойЗаписиДляВосстановленияПароля) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(СведенияОбУчетнойЗаписи, СведенияОбУчетнойЗаписиДляВосстановленияПароля); + КонецЕсли; + + КонецЕсли; + + Возврат СведенияОбУчетнойЗаписи; + +КонецФункции + +Функция ОписаниеНастроекУчетнойЗаписиДляВосстановленияПароля() Экспорт + + СведенияОбУчетнойЗаписи = Новый Структура(); + СведенияОбУчетнойЗаписи.Вставить("УчетнаяЗаписьПочты", Неопределено); + СведенияОбУчетнойЗаписи.Вставить("Используется", Ложь); + + Возврат СведенияОбУчетнойЗаписи; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. @@ -180,10 +315,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если ОбщегоНазначения.РазделениеВключено() @@ -248,7 +379,7 @@ МодульВзаимодействия.ПриПолученииЧитаемыхОбъектовОбработчикаОбновленияУчетныхЗаписейЭлектроннойПочты(ЧитаемыеОбъекты); МодульВзаимодействия.ПриПолученииИзменяемыхОбъектовОбработчикаОбновленияУчетныхЗаписейЭлектроннойПочты(ИзменяемыеОбъекты); КонецЕсли; - + Обработчик.ЧитаемыеОбъекты = СтрСоединить(ЧитаемыеОбъекты, ","); Обработчик.ИзменяемыеОбъекты = СтрСоединить(ИзменяемыеОбъекты, ","); @@ -313,6 +444,10 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Объекты - Массив из ОбъектМетаданных +// Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты); @@ -514,7 +649,7 @@ Исключение Попытка Соединение.Отключиться(); - Исключение + Исключение // АПК:280 // Обработка и журналирование исключения не требуется, т.к. // в вызывающий код передается исходное исключение, которое будет там обработано. КонецПопытки; @@ -648,7 +783,7 @@ // храниться сообщения с почтового сервера. // // Параметры: -// Колонки - строка - список полей письма, через запятую, которые должны +// Колонки - Строка - список полей письма, через запятую, которые должны // быть записаны в таблицу. Параметр меняет тип на массив. // Возвращаемое значение // ТаблицаЗначений - пустая таблица значений с колонками. @@ -757,7 +892,7 @@ | УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки"; Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); + Выборка = Запрос.Выполнить().Выбрать(); // АПК:1328 блокировка данных не требуется при выполнении начальной настройки узла РИБ. Пока Выборка.Следующий() Цикл УчетнаяЗапись = Выборка.Ссылка.ПолучитьОбъект(); УчетнаяЗапись.ИспользоватьДляОтправки = Ложь; @@ -844,7 +979,7 @@ ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла); КонецЕсли; - ПолноеИмяФайла = УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); + ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяВременногоКаталога) + ИмяФайла); ТабличныйДокумент.Записать(ПолноеИмяФайла, ТипФайла); Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда @@ -901,23 +1036,6 @@ КонецЕсли; КонецФункции -Функция УникальноеИмяФайла(ИмяФайла) - - Файл = Новый Файл(ИмяФайла); - ИмяБезРасширения = Файл.ИмяБезРасширения; - Расширение = Файл.Расширение; - ИмяКаталога = Файл.Путь; - - Счетчик = 1; - Пока Файл.Существует() Цикл - Счетчик = Счетчик + 1; - Файл = Новый Файл(ИмяКаталога + ИмяБезРасширения + " (" + Счетчик + ")" + Расширение); - КонецЦикла; - - Возврат Файл.ПолноеИмя; - -КонецФункции - Процедура ВставитьКартинкиВHTML(ИмяФайлаHTML) ТекстовыйДокумент = Новый ТекстовыйДокумент(); @@ -1228,7 +1346,8 @@ КонецФункции -// См. РаботаСПочтовымиСообщениями.ОтправитьПисьма. +// См. РаботаСПочтовымиСообщениями.ОтправитьПисьма +// Функция ОтправитьПисьма(УчетнаяЗапись, Письма, ТекстИсключения = Неопределено) Экспорт РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ИмяПользователя,АдресЭлектроннойПочты,ОтправлятьСкрытыеКопииПисемНаЭтотАдрес,ИспользоватьДляПолучения"); @@ -1330,7 +1449,7 @@ Исключение Попытка Соединение.Отключиться(); - Исключение + Исключение // АПК:280 // Обработка и журналирование исключения не требуется, т.к. // в вызывающий код передается исходное исключение, которое будет там обработано. КонецПопытки; @@ -1563,4 +1682,4 @@ КонецФункции -#КонецОбласти +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl index 4073cc994..01b27b143 100644 --- a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Возвращает двоичные данные файла. @@ -40,11 +35,17 @@ ПрисоединенныйФайл, Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип); ФайлОбъект = РаботаСФайламиСлужебный.ФайлОбъект(ПрисоединенныйФайл); - Если ФайлОбъект = Неопределено - И Не ВызыватьИсключение Тогда + Если (ФайлОбъект = Неопределено Или ФайлОбъект.ЭтоГруппа) И Не ВызыватьИсключение Тогда Возврат Неопределено; КонецЕсли; + ОбщегоНазначенияКлиентСервер.Проверить(ФайлОбъект <> Неопределено, + НСтр("ru = 'Недопустимое значение параметра ПрисоединенныйФайл'"), "РаботаСФайлами.ДвоичныеДанныеФайла"); + ОбщегоНазначенияКлиентСервер.Проверить(Не ФайлОбъект.ЭтоГруппа, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра ПрисоединенныйФайл (папка файлов ""%1"")'"), + ОбщегоНазначения.ПредметСтрокой(ПрисоединенныйФайл)), "РаботаСФайлами.ДвоичныеДанныеФайла"); + УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); @@ -60,7 +61,7 @@ НСтр("ru = 'Двоичные данные файла отсутствуют в регистре ДвоичныеДанныеФайлов. |Файл: ""%1"".'"), ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл)); - + ЗаписьЖурналаРегистрации(НСтр("ru = 'Файлы.Открытие файла'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники[ПрисоединенныйФайл.Метаданные().Имя], @@ -87,7 +88,7 @@ // Возвращает сведения о файле. Используется в различных командах работы с файлами // и как значение параметра ДанныеФайла в других процедурах и функциях. -// +// // Параметры: // ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. // ДополнительныеПараметры - см. РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла. @@ -140,14 +141,14 @@ // Пример: // Открытие нескольких файлов. // ПараметрыДанныхФайла = РаботаСФайламиКлиентСервер.ПараметрыДанныхФайла(); -// ПараметрыДанныхФайла.ИдентификаторФормы = УникальныйИдентификатор; // см. примечание ниже +// ПараметрыДанныхФайла.ИдентификаторФормы = УникальныйИдентификатор; // Пока Выборка.Следующий() Цикл // МассивДанныхФайлов.Добавить(РаботаСФайлами.ДанныеФайла(Выборка.Файл, ПараметрыДанныхФайла)); // КонецЦикла; -// -// Примечание. Установка идентификатора формы предотвращает преждевременную очистку временного хранилища из-за -// возможных серверных вызовов при открытии файлов (например, если файл зашифрован или когда открывается форма -// текстового или табличного редактора). +// +// В этом примере установка идентификатора формы в параметре ДополнительныеПараметры предотвращает преждевременную +// очистку временного хранилища из-за возможных серверных вызовов при открытии файлов (например, +// если файл зашифрован или когда открывается форма текстового или табличного редактора). // Функция ДанныеФайла(Знач ПрисоединенныйФайл, Знач ДополнительныеПараметры = Неопределено, @@ -330,7 +331,7 @@ // свойство не указано или не заполнено, тогда будет // установлена текущая дата сеанса. // * Расширение - Строка - новое расширение файла. -// * Редактирует - Ссылка - новый пользователь, редактирующий файл. +// * Редактирует - ЛюбаяСсылка - новый пользователь, редактирующий файл. // * Кодировка - Строка - кодировка, в которой сохранен файл. // Список поддерживаемых кодировок см. в справке к методу // глобального контекста "ПолучитьДвоичныеДанныеИзСтроки". @@ -442,14 +443,15 @@ КонецФункции -// Обработчик события ПередЗаписью объектов-владельцев файлов. -// Определен только для объектов Документ. +// Обработчик события ПередЗаписью объектов-владельцев файлов, +// помечает присоединенные файлы на удаление при пометке объекта-владельца. +// Подходит только для документов. // // Параметры: -// Источник - ДокументОбъект - стандартный параметр события ПередЗаписью. -// Отказ - Булево - стандартный параметр события ПередЗаписью. -// РежимЗаписи - РежимЗаписиДокумента - стандартный параметр события ПередЗаписью. -// РежимПроведения - РежимПроведенияДокумента - стандартный параметр события ПередЗаписью. +// Источник - ДокументОбъект - документ с присоединенными файлами. +// Отказ - Булево - стандартный параметр обработчика ПередЗаписью. +// РежимЗаписи - РежимЗаписиДокумента - стандартный параметр обработчика ПередЗаписью. +// РежимПроведения - РежимПроведенияДокумента - стандартный параметр обработчика ПередЗаписью. // Процедура УстановитьПометкуУдаленияФайловДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт @@ -463,13 +465,13 @@ КонецПроцедуры -// Обработчик события ПередЗаписью объектов-владельцев файлов. -// Определен для объектов, кроме Документ. +// Обработчик события ПередЗаписью объектов-владельцев файлов, +// помечает присоединенные файлы на удаление при пометке объекта-владельца. +// Подходит для ссылочных объектов, кроме документов. // // Параметры: -// Источник - Объект - стандартный параметр события ПередЗаписью, например, СправочникОбъект. -// Исключение - ДокументОбъект. -// Отказ - Булево - стандартный параметр события ПередЗаписью. +// Источник - ОпределяемыйТип.ВладелецПрисоединенныхФайловОбъект - объект с присоединенными файлами. +// Отказ - Булево - стандартный параметр обработчика ПередЗаписью. // Процедура УстановитьПометкуУдаленияФайловПередЗаписью(Источник, Отказ) Экспорт @@ -560,7 +562,7 @@ ВызватьИсключение НСтр("ru = 'Не задано значение параметра ПараметрыФайла.ВладелецФайлов в РаботаСФайлами.ДобавитьФайл.'"); КонецЕсли; - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище); // ДвоичныеДанные ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("РаботаСФайлами.ДобавитьФайл", "АдресФайлаВоВременномХранилище", ДвоичныеДанные, Тип("ДвоичныеДанные")); @@ -884,7 +886,7 @@ // с помощью обработки группового изменения реквизитов. // // Возвращаемое значение: -// Массив Из Строка +// Массив из Строка // Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт @@ -909,7 +911,7 @@ // ИмяСправочника - Строка - если требуется конвертация в указанное хранилище. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - СправочникСсылка.Файлы - перенесенный файл, который помечен на удаление после переноса. // * Значение - ОпределяемыйТип.ПрисоединенныйФайл - созданный файл. // @@ -984,13 +986,13 @@ КонецФункции -// Обработчик события ПриЗаписиНаСервере управляемой формы владельца файла. +// Обработчик события ПриЗаписиНаСервере формы владельца файла. // // Параметры: -// Отказ - Булево - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// ТекущийОбъект - Объект - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// ПараметрыЗаписи - Структура - стандартный параметр события ПриЗаписиНаСервере управляемой формы. -// Параметры - ДанныеФормыСтруктура - свойство Параметры управляемой формы. +// Отказ - Булево - стандартный параметр события формы. +// ТекущийОбъект - ОпределяемыйТип.ВладелецПрисоединенныхФайловОбъект - стандартный параметр события формы. +// ПараметрыЗаписи - Структура - стандартный параметр события формы. +// Параметры - ДанныеФормыСтруктура - свойство формы Параметры. // Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи, Параметры) Экспорт @@ -1002,7 +1004,7 @@ КонецПроцедуры -// Размещает гиперссылки и поля присоединенных файлов на управляемой форме. +// Размещает на форме гиперссылки и поля присоединенных файлов. // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма для подключения. @@ -1366,7 +1368,7 @@ // который может являться владельцем присоединенных файлов. // // Возвращаемое значение: -// Массив Из ОпределяемыйТип.ВладелецФайлов +// Массив из ОпределяемыйТип.ВладелецФайлов // Функция СсылкиНаОбъектыСФайлами(Знач ИмяТаблицыВладельцевФайлов) Экспорт @@ -1421,8 +1423,8 @@ // Источник и Получатель должны быть объектами одного типа. // // Параметры: -// Источник - Ссылка - объект, имеющий присоединенные файлы для копирования. -// Получатель - Ссылка - объект, к которому копируются присоединенные файлы. +// Источник - ЛюбаяСсылка - объект, имеющий присоединенные файлы для копирования. +// Получатель - ЛюбаяСсылка - объект, к которому копируются присоединенные файлы. // Процедура СкопироватьПрисоединенныеФайлы(Знач Источник, Знач Получатель) Экспорт @@ -1501,7 +1503,7 @@ // (элемента справочника, ПВХ, документа и т.п.). // // Параметры: -// ВладелецФайлов - Ссылка - ссылка на объект, для которого выполняется конвертация. +// ВладелецФайлов - ЛюбаяСсылка - ссылка на объект, для которого выполняется конвертация. // ИмяСправочника - Строка - если требуется конвертация в указанное хранилище. // Процедура ИзменитьСправочникХраненияФайлов(Знач ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт @@ -2084,7 +2086,7 @@ // Помечает на удаление связанные файлы. // // Параметры: -// Источник - Объект - владелец присоединенного файла, кроме ДокументОбъект. +// Источник - ОпределяемыйТип.ВладелецПрисоединенныхФайловОбъект - владелец присоединенного файла, кроме ДокументОбъект. // Отказ - Булево - признак отказа от записи. // Процедура УстановитьПометкуУдаленияПрисоединенныхФайлов(Источник, Отказ) Экспорт @@ -2312,7 +2314,7 @@ РеквизитРазмещения = Форма[ПолныйПутьКДанным[0]]; Для Счетчик = 1 По ПолныйПутьКДанным.ВГраница() Цикл - РеквизитРазмещения = РеквизитРазмещения[ПолныйПутьКДанным[Счетчик]]; + РеквизитРазмещения = РеквизитРазмещения[ПолныйПутьКДанным[Счетчик]]; // ОпределяемыйТип.ПрисоединенныйФайл КонецЦикла; ДобавляемыйЭлемент.ДобавлятьФайлы = ДобавляемыйЭлемент.ДобавлятьФайлы И ДоступноДобавление; @@ -2513,7 +2515,7 @@ КонецЕсли; Сканировать = Форма.Команды.Добавить("УправлениеПрисоединеннымиФайламиСканировать_" + НомерЭлемента); - Сканировать.Заголовок = НСтр("ru = '" + ?(ОбщегоНазначения.ЭтоМобильныйКлиент(), "Сфотографировать", "Сканировать")+ "...'"); + Сканировать.Заголовок = ?(ОбщегоНазначения.ЭтоМобильныйКлиент(), НСтр("ru = 'Сфотографировать...'"), НСтр("ru = 'Сканировать...'")); ЗаполнитьЗначенияСвойств(Сканировать, СвойстваКомандыФормы); Если ДобавляемыйЭлемент.ПоказыватьКоманднуюПанель Тогда diff --git a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl index 58b206bb1..bea0d4d7b 100644 --- a/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиВТомахСлужебный/Module.bsl @@ -615,7 +615,6 @@ КонецЕсли; Запрос = Новый Запрос; - ВсеИменаСправочников = Новый Соответствие; ТипыПрисоединенныхФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); Запрос = Новый Запрос; @@ -822,8 +821,8 @@ // Помещает двоичные данные файла из тома в служебный реквизит ФайлХранилище. // // Параметры: -// ЭлементДанных - СправочникОбъект.ВерсииФайлов -// - ОпределяемыйТип.ПрисоединенныйФайл +// ЭлементДанных - СправочникОбъект.ВерсииФайлов +// - ОпределяемыйТип.ПрисоединенныйФайл // Процедура ПоместитьФайлВРеквизитСправочника(ЭлементДанных) Экспорт @@ -1020,7 +1019,7 @@ ТипыФайлов = Метаданные.ОпределяемыеТипы.ПрисоединенныйФайл.Тип.Типы(); Запрос = Новый Запрос; - ПустойТекстЗапроса = Истина; + ПервыйТекстЗапроса = Истина; Для Каждого СправочникФайлов Из ТипыФайлов Цикл МетаданныеСправочника = Метаданные.НайтиПоТипу(СправочникФайлов); @@ -1029,40 +1028,46 @@ ФрагментЗапроса = "ВЫБРАТЬ | СправочникПрисоединенныеФайлы.Ссылка, - | СправочникПрисоединенныеФайлы.%1 " + ?(ПустойТекстЗапроса, "КАК ВладелецФайла","") + ", + | &ВладелецФайла КАК ВладелецФайла, | СправочникПрисоединенныеФайлы.Расширение, | СправочникПрисоединенныеФайлы.Наименование, | СправочникПрисоединенныеФайлы.Том, - | СправочникПрисоединенныеФайлы.%2 " + ?(ПустойТекстЗапроса, "КАК Отредактировал","") + ", - | СправочникПрисоединенныеФайлы.ДатаМодификацииУниверсальная " + ?(ПустойТекстЗапроса, "КАК ДатаМодификацииФайла","") + ", + | &Отредактировал КАК Отредактировал, + | СправочникПрисоединенныеФайлы.ДатаМодификацииУниверсальная КАК ДатаМодификацииФайла, | СправочникПрисоединенныеФайлы.ПутьКФайлу, | СправочникПрисоединенныеФайлы.ПометкаУдаления |ИЗ - | Справочник." + МетаданныеСправочника.Имя + " КАК СправочникПрисоединенныеФайлы + | &СправочникПрисоединенныеФайлы КАК СправочникПрисоединенныеФайлы |ГДЕ | СправочникПрисоединенныеФайлы.Том = &Том - | И СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске)"; + | И СправочникПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске) + | И &УсловиеТекущаяВерсия"; - ФрагментЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ФрагментЗапроса, - ?(ЭтоСправочникВерсий, "Владелец.ВладелецФайла", "ВладелецФайла"), - ?(ЭтоСправочникВерсий, "Автор", "Изменил")); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&ВладелецФайла", + "СправочникПрисоединенныеФайлы." + ?(ЭтоСправочникВерсий, "Владелец.ВладелецФайла", "ВладелецФайла")); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&Отредактировал", + "СправочникПрисоединенныеФайлы." + ?(ЭтоСправочникВерсий, "Автор", "Изменил")); + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&СправочникПрисоединенныеФайлы", + "Справочник." + МетаданныеСправочника.Имя); Если Не ЭтоСправочникВерсий И ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеСправочника) Тогда СправочникВерсийФайлов = Метаданные.НайтиПоТипу( МетаданныеСправочника.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); - ФрагментЗапроса = ФрагментЗапроса + " - | И СправочникПрисоединенныеФайлы.ТекущаяВерсия = ЗНАЧЕНИЕ(Справочник." - + СправочникВерсийФайлов.Имя + ".ПустаяСсылка)"; + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&УсловиеТекущаяВерсия", + "СправочникПрисоединенныеФайлы.ТекущаяВерсия = ЗНАЧЕНИЕ(Справочник." + + СправочникВерсийФайлов.Имя + ".ПустаяСсылка)"); + Иначе + ФрагментЗапроса = СтрЗаменить(ФрагментЗапроса, "&УсловиеТекущаяВерсия", "ИСТИНА"); КонецЕсли; - Запрос.Текст = Запрос.Текст + ?(ПустойТекстЗапроса,"", " + Запрос.Текст = Запрос.Текст + ?(ПервыйТекстЗапроса,"", " |ОБЪЕДИНИТЬ ВСЕ |") + ФрагментЗапроса; - ПустойТекстЗапроса = Ложь; + ПервыйТекстЗапроса = Ложь; КонецЦикла; @@ -1218,8 +1223,10 @@ ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОбъектМетаданных", ПолноеИмя); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеВладельца", - ?(ПолноеИмя = "Справочник.ВерсииФайлов", "ПРЕДСТАВЛЕНИЕССЫЛКИ(ОбъектМетаданных.Владелец) ", "Неопределено ")); + + // @query-part-2 + ПолеВладельца = ?(ПолноеИмя = "Справочник.ВерсииФайлов", "ПРЕДСТАВЛЕНИЕССЫЛКИ(ОбъектМетаданных.Владелец) ","Неопределено "); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолеВладельца", ПолеВладельца); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Справочники.ТомаХраненияФайлов.ПустаяСсылка()); @@ -1288,10 +1295,6 @@ #Область ОбновлениеИнформационнойБазы // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl index 391e972e8..00acb480b 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс //////////////////////////////////////////////////////////////////////////////// @@ -104,8 +99,8 @@ // ФормаВладелец - ФормаКлиентскогоПриложения - форма, из которой вызвано создание файла. // РежимСоздания - Неопределено // - Число - режим создания файла: -// - Неопределено - показать диалог выбора режима создания файла. -// - Число - создать файл указанным способом: +// - Неопределено - показать диалог выбора режима создания файла. +// - Число - создать файл указанным способом: // * 1 - из шаблона (копированием другого файла); // * 2 - с диска (из файловой системы клиента); // * 3 - со сканера. @@ -465,10 +460,20 @@ КонецПроцедуры -// См. РаботаСФайлами.ДанныеФайла. // Возвращает структурированную информацию о файле. Используется в различных командах работы с файлами // и как значение параметра ДанныеФайла других процедур и функций. // +// Параметры: +// ФайлСсылка - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на элемент справочника с файлом. +// ИдентификаторФормы - УникальныйИдентификатор - уникальный идентификатор формы, во временное хранилище +// которой надо поместить файл и вернуть адрес в свойстве СсылкаНаДвоичныеДанныеФайла. +// ПолучатьСсылкуНаДвоичныеДанные - Булево - если передать Ложь, то ссылка на двоичные данные в СсылкаНаДвоичныеДанныеФайла +// не будет получена, что существенно ускорит выполнение для больших двоичных данных. +// ДляРедактирования - Булево - если указать Истина, то файл будет захвачен для редактирования. +// +// Возвращаемое значение: +// см. РаботаСФайлами.ДанныеФайла +// Функция ДанныеФайла(Знач ФайлСсылка, Знач ИдентификаторФормы = Неопределено, Знач ПолучатьСсылкуНаДвоичныеДанные = Истина, @@ -500,7 +505,7 @@ // которой будет помещен файл. // // ДополнительныеПараметры - Неопределено - использовать значения по умолчанию. -// - Структура - с необязательными свойствами: +// - Структура - с необязательными свойствами: // * ДляРедактирования - Булево - начальное значение Ложь. Если Истина, // тогда файл будет захвачен для редактирования. // * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения, @@ -525,7 +530,7 @@ // во временное хранилище которой надо поместить данные и вернуть новый адрес. // // ДополнительныеПараметры - Неопределено - использовать значения по умолчанию. -// - Структура - с необязательными свойствами: +// - Структура - с необязательными свойствами: // * ПолноеИмяФайла - Строка - если заполнено, то указанный файл будет помещен в рабочий каталог // пользователя, а затем в хранилище файлов. // * ДанныеФайла - Структура - свойства файла, которые можно передать для ускорения, diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентПереопределяемый/Module.bsl index 8936591d8..0a4f9d1dd 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентПереопределяемый/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Вызывается при ошибке захвате файла. diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl index d33f7d35e..e280ef81d 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиентСервер/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Инициализирует структуру параметров для получения данных файла. См. РаботаСФайлами.ДанныеФайла. diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl index bd41dd961..8c033e9c7 100644 --- a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область ПрограммныйИнтерфейс // Переопределение настроек присоединенных файлов. diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl index d9cfacae9..c1f3b4d09 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl @@ -9,10 +9,6 @@ #Область СлужебныйПрограммныйИнтерфейс // См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. -// -// Параметры: -// Объекты - см. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.Объекты -// Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.Файлы); @@ -41,12 +37,27 @@ Процедура ВыгрузитьФайл(Знач ОбъектФайла, Знач ИмяНовогоФайла) Экспорт Если ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + РаботаСФайламиВТомахСлужебный.СкопироватьФайл(ОбъектФайла.Ссылка, ИмяНовогоФайла); Иначе ДвоичныеДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(ОбъектФайла.Ссылка); - ДвоичныеДанныеФайла.Записать(ИмяНовогоФайла); + + Попытка + + ДвоичныеДанныеФайла.Записать(ИмяНовогоФайла); + + Исключение + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Двоичные данные файла %1 были удалены. Возможно, файл очищен как ненужный или удален антивирусной программой. + |Обратитесь к администратору.'"), Строка(ОбъектФайла.Ссылка)); + + ВызватьИсключение СообщениеОбОшибке; + + КонецПопытки; + КонецЕсли; @@ -57,25 +68,14 @@ Процедура ЗагрузитьФайл(Знач ОбъектФайла, Знач ПутьКФайлу) Экспорт ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); - Если ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - - Если ТипЗнч(ОбъектФайла.Ссылка) = Тип("СправочникСсылка.ВерсииФайлов") Тогда - НомерВерсии = ОбъектФайла.НомерВерсии; - Иначе - НомерВерсии = ""; - КонецЕсли; - РаботаСФайламиВТомахСлужебный.ДобавитьФайл(ОбъектФайла, ДвоичныеДанные, , Истина); - Иначе - ОбъектФайла.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); ОбъектФайла.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); ОбъектФайла.ПутьКФайлу = ""; ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; - КонецЕсли; КонецПроцедуры @@ -230,6 +230,14 @@ КонецФункции // Возвращает Истина, если файл с таким расширением можно загружать. +// +// Параметры: +// РасширениеФайла - Строка +// ВызыватьИсключение - Булево +// +// Возвращаемое значение: +// Булево +// Функция ПроверитьРасширениеФайлаДляЗагрузки(РасширениеФайла, ВызыватьИсключение = Истина) Экспорт ОбщиеНастройки = РаботаСФайламиСлужебныйПовтИсп.НастройкиРаботыСФайлами().ОбщиеНастройки; @@ -260,7 +268,7 @@ // Возвращает массив справочников, выступающих в роли владельцев файлов. // // Возвращаемое значение: -// Массив(ОбъектМетаданных). +// Массив из ОбъектМетаданных // Функция СправочникиФайлов() Экспорт @@ -302,7 +310,7 @@ // двоичных данных файлов в информационной базе. // // Возвращаемое значение: -// Массив(ОбъектМетаданных). +// Массив из ОбъектМетаданных // Функция ОбъектыХраненияФайловИнформационнойБазе() Экспорт @@ -314,7 +322,11 @@ // Возвращает расширение файла. // -// Объект - СправочникОбъект. +// Параметры: +// Объект - ОпределяемыйТип.ПрисоединенныйФайлОбъект +// +// Возвращаемое значение: +// Строка // Функция РасширениеФайла(Объект) Экспорт @@ -330,6 +342,9 @@ // ТаблицаВладельцевФайлов - Строка - полное имя объекта метаданных, // который может владеть присоединенными файлами. // +// Возвращаемое значение: +// Массив +// Функция СсылкиНаОбъектыСФайлами(Знач ТаблицаВладельцевФайлов) Экспорт Запрос = Новый Запрос; @@ -359,7 +374,7 @@ // Параметры: // Папка - СправочникСсылка.ПапкиФайлов // - СправочникСсылка.Файлы - папка файлов. -// - СправочникСсылка - владелец файлов. +// - СправочникСсылка - владелец файлов. // // Места использования: // РассылкаОтчетов.ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию(). @@ -500,7 +515,7 @@ // для указанного владельца. // // Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ВладелецФайлов - ЛюбаяСсылка - объект, к которому добавляется файл. // Функция ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение = Ложь) Экспорт @@ -661,27 +676,38 @@ Функция ФайлОбъект(Знач ПрисоединенныйФайл) Экспорт ФайлОбъект = Неопределено; - МетаданныеОбъектаФайла = Метаданные.НайтиПоТипу(ТипЗнч(ПрисоединенныйФайл)); // Это справочник файлов. Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", МетаданныеОбъектаФайла) Тогда // С возможностью хранить версии. - Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла) И ЗначениеЗаполнено(ПрисоединенныйФайл.ТекущаяВерсия) Тогда - ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл.ТекущаяВерсия, - "Ссылка, ТипХраненияФайла, Наименование,Расширение,Том,ПутьКФайлу"); - ФайлОбъект.Вставить("ВладелецФайла", ПрисоединенныйФайл.ВладелецФайла); + ЕстьТекущаяВерсия = Ложь; + Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ТекущаяВерсия", МетаданныеОбъектаФайла) Тогда + ТекущаяВерсия = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл, "ТекущаяВерсия"); + ЕстьТекущаяВерсия = ЗначениеЗаполнено(ТекущаяВерсия); + КонецЕсли; + Если ЕстьТекущаяВерсия Тогда + ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущаяВерсия, + "Ссылка,ТипХраненияФайла,Наименование,Расширение,Том,ПутьКФайлу"); + ФайлОбъект.Вставить("ВладелецФайла", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл, "ВладелецФайла")); // Без возможности хранить версии. Иначе ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, - "Ссылка, ТипХраненияФайла,ВладелецФайла,Наименование,Расширение,Том,ПутьКФайлу"); + "Ссылка,ТипХраненияФайла,ВладелецФайла,Наименование,Расширение,Том,ПутьКФайлу"); КонецЕсли; + ЭтоГруппа = Ложь; + Если МетаданныеОбъектаФайла.Иерархический Тогда + ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл, "ЭтоГруппа"); + КонецЕсли; + ФайлОбъект.Вставить("ЭтоГруппа", ЭтоГруппа); // Это справочник версий файлов. ИначеЕсли ОбщегоНазначения.ЕстьРеквизитОбъекта("РодительскаяВерсия", МетаданныеОбъектаФайла) Тогда ФайлОбъект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, - "Ссылка, ТипХраненияФайла,Наименование,Расширение,Том,ПутьКФайлу"); + "Ссылка,ТипХраненияФайла,Наименование,Расширение,Том,ПутьКФайлу"); ФайлОбъект.Вставить("ВладелецФайла", - ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл.Владелец, "ВладелецФайла")); + ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПрисоединенныйФайл, "Владелец"), "ВладелецФайла")); + ФайлОбъект.Вставить("ЭтоГруппа", Ложь); КонецЕсли; Возврат ФайлОбъект; @@ -735,9 +761,8 @@ ВсеСправочники = Справочники.ТипВсеСсылки(); ВсеДокументы = Документы.ТипВсеСсылки(); - ТекстЗапроса = - "ВЫБРАТЬ - | " + ТипОбъекта.Имя + ".Ссылка,"; + ТекстЗапроса = СтрЗаменить("ВЫБРАТЬ &ИмяТипаОбъекта", "&ИмяТипаОбъекта", ТипОбъекта.Имя + ".Ссылка,"); + Если ВсеСправочники.СодержитТип(ТипЗнч(ТипОбъекта.ЗначениеПустойСсылки)) Тогда Справочник = Метаданные.Справочники[ТипОбъекта.Имя]; Для Каждого Реквизит Из Справочник.Реквизиты Цикл @@ -881,15 +906,14 @@ СправочникВерсийФайлов = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Справочник.Реквизиты.ТекущаяВерсия.Тип.Типы()[0]); ПолноеИмяСправочникаВерсийФайлов = СправочникВерсийФайлов.ПолноеИмя; - - ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ") + " - | + + ЧастьТекстаЗапроса = " |ВЫБРАТЬ | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла) КАК ВладелецФайла, | СУММА(ЕСТЬNULL(ВерсииФайлов.Размер, Файлы.Размер) / 1024 / 1024) КАК ОбъемВсего |ИЗ - | Справочник." + Справочник.Имя + " КАК Файлы - | ЛЕВОЕ СОЕДИНЕНИЕ "+ ПолноеИмяСправочникаВерсийФайлов + " КАК ВерсииФайлов + | #ИмяСправочника КАК Файлы + | ЛЕВОЕ СОЕДИНЕНИЕ #ПолноеИмяСправочникаВерсийФайлов КАК ВерсииФайлов | ПО Файлы.Ссылка = ВерсииФайлов.Владелец |ГДЕ | НЕ Файлы.ПометкаУдаления @@ -897,7 +921,13 @@ | |СГРУППИРОВАТЬ ПО | ТИПЗНАЧЕНИЯ(Файлы.ВладелецФайла)"; - + + ЧастьТекстаЗапроса = СтрЗаменить(ЧастьТекстаЗапроса, "#ИмяСправочника", "Справочник." + Справочник.Имя); + ЧастьТекстаЗапроса = СтрЗаменить(ЧастьТекстаЗапроса, "#ПолноеИмяСправочникаВерсийФайлов", + ПолноеИмяСправочникаВерсийФайлов); + + ТекстЗапроса = ТекстЗапроса + ?(ПустаяСтрока(ТекстЗапроса),"", " ОБЪЕДИНИТЬ ВСЕ ") + ЧастьТекстаЗапроса; + Если ДобавитьПсевдонимПоля Тогда ДобавитьПсевдонимПоля = Ложь; КонецЕсли; @@ -932,7 +962,7 @@ // Если томов хранения файлов нет, тогда хранение в ИБ. // // Возвращаемое значение: -// ПеречисленияСсылка.ТипыХраненияФайлов. +// ПеречислениеСсылка.ТипыХраненияФайлов // Функция ТипХраненияФайлов() Экспорт @@ -1189,7 +1219,7 @@ // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. // Зашифровать - Булево - зашифровать файл, если Истина - иначе расшифровать. -// МассивДанныхДляЗанесенияВБазу - массив структур. +// МассивДанныхДляЗанесенияВБазу - Массив из Структура // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. // ИмяРабочегоКаталога - Строка - рабочий каталог. // МассивФайловВРабочемКаталогеДляУдаления - Массив - файлы, которые надо удалить из регистра. @@ -1716,7 +1746,17 @@ КонецФункции -// Создать файловый начальный образ на сервере. +// Процедура - Создать файловый начальный образ на сервере +// +// Параметры: +// Параметры - Структура: +// * ИмяКаталога - Строка +// * Язык - Строка +// * ПутьКАрхивуСФайламиТомов - Строка +// * ЕстьФайлыВТомах- Булево +// * ИмяКаталогаФайлов - Строка +// * ПолноеИмяФайловойБазы - Строка +// АдресХранилища - УникальныйИдентификатор // Процедура СоздатьФайловыйНачальныйОбразНаСервере(Параметры, АдресХранилища) Экспорт @@ -2088,22 +2128,16 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// Массив - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить(Метаданные.РегистрыСведений.ФайлыВРабочемКаталоге.ПолноеИмя()); - Массив.Добавить(Метаданные.РегистрыСведений.СведенияОФайлах.ПолноеИмя()); - Массив.Добавить("Справочник.Файлы.Реквизиты.ТекущаяВерсия"); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ФайлыВРабочемКаталоге.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.СведенияОФайлах.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить("Справочник.Файлы.Реквизиты.ТекущаяВерсия"); КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел.Обработчики +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -2157,8 +2191,9 @@ КонецПроцедуры // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +// // Параметры: -// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки +// Зависимости- см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); @@ -2189,10 +2224,6 @@ КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов. -// -// Параметры: -// ВозможныеПрава - см. УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов.ВозможныеПрава -// Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт //////////////////////////////////////////////////////////// @@ -2298,10 +2329,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -2571,10 +2598,6 @@ КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке. -// -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке.Типы -// Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт // В процессе выгрузки данных ссылки на справочник ТомаХраненияФайлов очищаются, @@ -2614,11 +2637,7 @@ КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -2628,10 +2647,6 @@ КонецПроцедуры // См. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств. -// -// Параметры: -// Наборы - см. УправлениеСвойствамиПереопределяемый.ПриПолученииПредопределенныхНаборовСвойств.Наборы -// Процедура ПриПолученииПредопределенныхНаборовСвойств(Наборы) Экспорт Набор = Наборы.Строки.Добавить(); Набор.Имя = "Справочник_ПапкиФайлов"; @@ -2668,8 +2683,8 @@ // См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек // // Параметры: -// Объекты - Массив -// +// Объекты - Массив из ОбъектМетаданных +// Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.ПапкиФайлов); @@ -2700,6 +2715,14 @@ КонецФункции // Возвращает навигационную ссылку на файл (на реквизит или во временное хранилище). +// +// Параметры: +// ФайлСсылка - ОпределяемыйТип.ПрисоединенныйФайл +// УникальныйИдентификатор - УникальныйИдентификатор +// +// Возвращаемое значение: +// см. РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия +// Функция НавигационнойСсылкиФайла(ФайлСсылка, УникальныйИдентификатор) Экспорт Если ЭтоЭлементРаботаСФайлами(ФайлСсылка) Тогда @@ -3026,13 +3049,6 @@ // По обмену пришел элемент с хранением в базе - но в базе приемнике принято хранить в томах. // Из служебного реквизита файл размещаем на томе и меняем ТипХраненияФайла на ВТомахНаДиске. ТипМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(ЭлементДанных)); - Если ОбщегоНазначения.ЕстьРеквизитОбъекта("ВладелецФайла", ТипМетаданных) Тогда - // Это справочник файлов. - НомерВерсии = ""; - Иначе - // Это справочник версий файлов. - НомерВерсии = ЭлементДанных.НомерВерсии; - КонецЕсли; Если ДвоичныеДанные = Неопределено Тогда @@ -3089,7 +3105,7 @@ // Записывает двоичные данные файла в информационную базу. // // Параметры: -// ПрисоединенныйФайл - ссылка на присоединенный файл. +// ПрисоединенныйФайл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на присоединенный файл. // ДвоичныеДанные - ДвоичныеДанные - которые требуется записать. // Процедура ЗаписатьФайлВИнформационнуюБазу(Знач ПрисоединенныйФайл, Знач ДвоичныеДанные) Экспорт @@ -3191,7 +3207,7 @@ // если их более одного. // // Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ВладелецФайлов - ЛюбаяСсылка - объект, к которому добавляется файл. // ИмяСправочника - Строка - если заполнено, то выполняется проверка // наличия справочника среди справочников владельца для хранения файлов. // Если не заполнено, возвращает имя основного справочника. @@ -3200,6 +3216,9 @@ // ИмяПараметра - Строка - имя требуемого параметра для определения имени справочника. // ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено). // +// Возвращаемое значение: +// Строка - имя справочника +// Функция ИмяСправочникаХраненияФайлов(ВладелецФайлов, ИмяСправочника = "", ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт @@ -3272,8 +3291,13 @@ // для указанного владельца. // // Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ВладелецФайлов - ЛюбаяСсылка - объект, к которому добавляется файл. // +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка +// * Значение - Булево +// Функция ИменаСправочниковХраненияВерсийФайлов(ВладелецФайлов, НеВызыватьИсключение = Ложь) Если ТипЗнч(ВладелецФайлов) = Тип("Тип") Тогда @@ -3341,7 +3365,7 @@ // если их более одного. // // Параметры: -// ВладелецФайлов - Ссылка - объект, к которому добавляется файл. +// ВладелецФайлов - ЛюбаяСсылка - объект, к которому добавляется файл. // ИмяСправочника - Строка - если заполнено, то выполняется проверка // наличия справочника среди справочников владельца для хранения файлов. // Если не заполнено, возвращает имя основного справочника. @@ -3350,6 +3374,9 @@ // ИмяПараметра - Строка - имя требуемого параметра для определения имени справочника. // ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено). // +// Возвращаемое значение: +// Строка - имя справочника +// Функция ИмяСправочникаХраненияВерсийФайлов(ВладелецФайлов, ИмяСправочника = "", ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт @@ -3458,8 +3485,10 @@ // Сравнивает 2 элемента отбора компоновки данных. // Параметры: -// Элемент1 - элемент условного оформления списка. -// Элемент2 - элемент условного оформления списка. +// Элемент1 - ЭлементОтбораКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных - элемент условного оформления списка. +// Элемент2 - ЭлементОтбораКомпоновкиДанных +// - ГруппаЭлементовОтбораКомпоновкиДанных - элемент условного оформления списка. // // Возвращаемое значение: // Булево - результат сравнения. @@ -3505,10 +3534,10 @@ // Формирует отчет для файлов с ошибками. // // Параметры: -// МассивИменФайловСОшибками - массив строк путей к файлам. +// МассивИменФайловСОшибками - Массив из Строка - пути к файлам. // // Возвращаемое значение: -// ТабличныйДокумент с отчетом. +// ТабличныйДокумент // Функция ИмпортФайловСформироватьОтчет(МассивИменФайловСОшибками) Экспорт @@ -3847,7 +3876,7 @@ // Добавляет элементы отбора компоновки данных в динамические списки файлов. // // Параметры: -// Список - динамический список, в который будут добавлены отборы. +// Список - ДинамическийСписок - динамический список, в который будут добавлены отборы. // Процедура ДобавитьОтборыВСписокФайлов(Список) Экспорт @@ -3862,7 +3891,7 @@ // Внешним пользователям доступна только общая информация о файле и его характеристиках. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма, для которой изменяется видимость элементов. +// Форма - ФормаКлиентскогоПриложения - форма, для которой изменяется видимость элементов. // ЭтоФормаСписка - Булево - признак того, что процедура вызывается из формы списка. // Процедура ИзменитьФормуДляВнешнегоПользователя(Форма, Знач ЭтоФормаСписка = Ложь) Экспорт @@ -4626,10 +4655,6 @@ Версия.ПутьКФайлу = ""; Версия.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); Иначе - ФайлЗашифрован = Ложь; - Если СведенияОФайле.Зашифрован <> Неопределено Тогда - ФайлЗашифрован = СведенияОФайле.Зашифрован; - КонецЕсли; РаботаСФайламиВТомахСлужебный.ДобавитьФайл(Версия, ДвоичныеДанные); КонецЕсли; @@ -4682,7 +4707,7 @@ // АдресВременногоХранилищаТекста - Строка - содержит адрес во временном хранилище, где находятся двоичные данные с // файлом текста или ХранилищеЗначения - непосредственно содержит двоичные // данные с файлом текста. -// УникальныйИдентификатор - уникальный идентификатор формы. +// УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ОбновитьВерсиюВФайле(ФайлСсылка, Версия, @@ -4841,9 +4866,6 @@ МетаданныеСправочника = ОбъектЗначение.Метаданные(); // ОбъектМетаданныхСправочник Контекст.ИмяСправочника = МетаданныеСправочника.Имя; - ЗаголовокОшибки = НСтр("ru = 'Ошибка при настройке формы элемента присоединенных файлов.'"); - ОкончаниеОшибки = НСтр("ru = 'В этом случае настройка формы элемента невозможна.'"); - ВозможностьСоздаватьВерсииФайлов = ТипЗнч(ОбъектЗначение.Ссылка) = Тип("СправочникСсылка.Файлы"); Контекст.ВозможностьСоздаватьВерсииФайлов = ВозможностьСоздаватьВерсииФайлов; @@ -5228,7 +5250,7 @@ КонецФункции // Параметры: -// Результат - Массив +// Результат - Массив из см. ОписаниеФайла // Процедура СформироватьСписокФайловДляОтправкиПоПочте(Результат, ФайлВложение, ИдентификаторФормы) Экспорт @@ -5269,7 +5291,7 @@ #Область ОчисткаНенужныхФайлов // Параметры: -// НастройкаОчистки - СтрокаТаблицыЗначений - колонки: +// НастройкаОчистки - СтрокаТаблицыЗначений: // * ВладелецФайла - ОпределяемыйТип.ПрисоединенныйФайл // * ИдентификаторВладельца - СправочникСсылка.ИдентификаторыОбъектовМетаданных // * ЭтоНастройкаДляЭлементаСправочника - Булево @@ -6627,6 +6649,7 @@ КонецПроцедуры + // Загружает с сервера webdav новые папки и файлы, которых еще нет в базе, и отражает их в таблице файлов. Процедура ЗагрузитьНовыеПрисоединенныеФайлы(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) @@ -6867,6 +6890,7 @@ КонецПроцедуры + Процедура ЗаполнитьДанныеИзОблачногоСервиса(СтрокиДереваФайлов, ТаблицаФайлов, ПараметрыСинхронизации, ОбъектВладелец = Неопределено) Для каждого СтрокаДереваФайлов Из СтрокиДереваФайлов Цикл @@ -7071,17 +7095,22 @@ ТаблицаФайлов.Индексы.Добавить("ФайлСсылка"); ТаблицаФайлов.Сортировать("Уровень, РодительСортировка, ЭтоПапка УБЫВ"); - ОбходТаблицыФайлов(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера); + Если Не СинхронизироватьФайлы(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера) Тогда + СинхронизацияВыполнена = Ложь; + КонецЕсли; ТаблицаФайлов.Сортировать("Уровень УБЫВ, РодительСортировка, ЭтоПапка УБЫВ"); - ОбходТаблицыФайлов(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера, Истина); + Если Не СинхронизироватьФайлы(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера, Истина) Тогда + СинхронизацияВыполнена = Ложь; + КонецЕсли; ЗаписатьРезультатСинхронизации(ПараметрыСинхронизации.УчетнаяЗапись, СинхронизацияВыполнена); КонецПроцедуры -Процедура ОбходТаблицыФайлов(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера, ЭтоУдалениеФайлов = Ложь) +Функция СинхронизироватьФайлы(ТаблицаФайлов, ПараметрыСинхронизации, АдресСервера, ЭтоУдалениеФайлов = Ложь) + СинхронизацияВыполнена = Истина; Для Каждого СтрокаТаблицы Из ТаблицаФайлов Цикл Если СтрокаТаблицы.Обработан Тогда @@ -7147,8 +7176,9 @@ КонецПопытки; КонецЦикла; + Возврат СинхронизацияВыполнена; -КонецПроцедуры +КонецФункции Процедура ЗаписатьРезультатСинхронизации(УчетнаяЗапись, Знач СинхронизацияВыполнена) @@ -8027,10 +8057,12 @@ КонецЕсли; КонецЕсли; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 1", ?( - ПолучитьВсеФайлы, + + СтрокаЗамены = ?(ПолучитьВсеФайлы, "", - "ПЕРВЫЕ " + Формат(ЧислоФайловВВыборке, "ЧГ=; ЧН="))); + "ПЕРВЫЕ " + Формат(ЧислоФайловВВыборке, "ЧГ=; ЧН=")); // @query-part-1 + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 1", СтрокаЗамены); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяСправочника", "Справочник." + ИмяСправочника); @@ -8447,10 +8479,10 @@ // при использовании ограничения для папки или файла. // // Параметры: -// Право - имя права. +// Право - Строка - имя права. // ВладелецПрав - СправочникСсылка.ПапкиФайлов // - СправочникСсылка.Файлы -// <ссылка на владельца>. +// - ОпределяемыйТип.ВладелецПрисоединенныхФайлов // Функция ЕстьПраво(Право, ВладелецПрав) Экспорт @@ -8585,7 +8617,7 @@ // Удаляет запись в регистре ХранимыеФайлыВерсий. // // Параметры: -// Файл - ссылка на файл. +// Файл - ОпределяемыйТип.ПрисоединенныйФайл - ссылка на файл. // Процедура УдалитьЗаписьИзРегистраДвоичныеДанныеФайлов(Файл) Экспорт @@ -8877,12 +8909,13 @@ | ТЧЭлектронныеПодписи.ПодписьВерна КАК ПодписьВерна, | ТЧЭлектронныеПодписи.ДатаПроверкиПодписи КАК ДатаПроверкиПодписи |ИЗ - | " + ПолноеИмяОбъектаМетаданных + ".УдалитьЭлектронныеПодписи КАК ТЧЭлектронныеПодписи + | &УдалитьЭлектронныеПодписи КАК ТЧЭлектронныеПодписи |ГДЕ | ТЧЭлектронныеПодписи.Ссылка В(&МассивОбъектов) |ИТОГИ | ПО ПодписанныйОбъект"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УдалитьЭлектронныеПодписи", ПолноеИмяОбъектаМетаданных + ".УдалитьЭлектронныеПодписи"); Если ОбъектМетаданных = Метаданные.Справочники.ВерсииФайлов Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "ТЧЭлектронныеПодписи.Ссылка КАК ПодписанныйОбъект", @@ -8952,12 +8985,14 @@ | ТЧСертификатыШифрования.НомерСтроки КАК ПорядковыйНомер, | ТЧСертификатыШифрования.Представление |ИЗ - | " + ПолноеИмяОбъектаМетаданных + ".УдалитьСертификатыШифрования КАК ТЧСертификатыШифрования + | &УдалитьСертификатыШифрования КАК ТЧСертификатыШифрования |ГДЕ | ТЧСертификатыШифрования.Ссылка В(&МассивОбъектов) |ИТОГИ | ПО ЗашифрованныйОбъект"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УдалитьСертификатыШифрования", + ПолноеИмяОбъектаМетаданных + ".УдалитьСертификатыШифрования"); Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов); Выгрузка = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl index fcbf26db8..2733a6066 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВМоделиСервиса/Module.bsl @@ -14,8 +14,8 @@ // состояние извлечения текста версий файлов. // // Параметры: -// ИсточникТекста - ОпределяемыйТип.ПрисоединенныйФайл - файл, у которого изменилось состояние извлечения текста. -// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов - новый +// ИсточникТекста - ОпределяемыйТип.ПрисоединенныйФайл - файл, у которого изменилось состояние извлечения текста. +// СостояниеИзвлеченияТекста - ПеречислениеСсылка.СтатусыИзвлеченияТекстаФайлов - новый // статус извлечения текста у файла. // Процедура ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт @@ -59,10 +59,6 @@ КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий. -// -// Параметры: -// ТаблицаИспользования - см. ОчередьЗаданийПереопределяемый.ПриОпределенииИспользованияРегламентныхЗаданий.ТаблицаИспользования -// Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт НоваяСтрока = ТаблицаИспользования.Добавить(); @@ -78,10 +74,6 @@ КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. -// -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ОчисткаНенужныхФайлов"); @@ -89,11 +81,9 @@ КонецПроцедуры +// ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. -// -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИзвлеченияТекста); @@ -105,94 +95,7 @@ КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков выгрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках выгрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных, при выгрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный -// обработчик выгрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередВыгрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// выгрузкой всех объектов информационной базы, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередВыгрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных, перед выгрузкой данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередВыгрузкойТипа() установить значение -// данного параметра равным Истина - выгрузка объектов, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередВыгрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// выгрузкой конкретного объекта информационной базы. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПередВыгрузкойОбъекта(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы - -// менеджер выгрузки текущего объекта. Подробнее см. комментарий к программному интерфейсу обработки -// ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы. Параметр передается только при вызове -// процедур обработчиков, для которых при регистрации указана версия не ниже 1.0.0.1, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПередВыгрузкойОбъекта() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед выгрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередВыгрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри обработчика ПередВыгрузкойОбъекта(), при -// этом внесенные изменения будут отражены в сериализации объекта в файлах выгрузки, но -// не будут зафиксированы в информационной базе -// Артефакты - Массив Из ОбъектXDTO - набор дополнительной информации, логически неразрывно -// связанной с объектом, но не являющейся его частью (артефакты объекта). Артефакты должны -// сформированы внутри обработчика ПередВыгрузкойОбъекта() и добавлены в массив, переданный -// в качестве значения параметра Артефакты. Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. В дальнейшем -// артефакты, сформированные в процедуре ПередВыгрузкойОбъекта(), будут доступны в процедурах -// обработчиков загрузки данных (см. комментарий к процедуре ПриРегистрацииОбработчиковЗагрузкиДанных(). -// Отказ - Булево - если в процедуре ПередВыгрузкойОбъекта() установить значение -// данного параметра равным Истина - выгрузка объекта, для которого был вызван обработчик, -// выполняться не будет. -// ПослеВыгрузкиТипа() - Булево - флаг необходимости вызова обработчика после выгрузки всех -// объектов информационной базы, относящихся к данному объекту метаданных. Если присвоено значение -// Истина - в общем модуле обработчика должна быть реализована экспортируемая процедура -// ПослеВыгрузкиТипа(), поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе выгрузи данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// Сериализатор - СериализаторXDTO, инициализированный с поддержкой выполнения -// аннотации ссылок. В случае, если в произвольном обработчике выгрузки требуется -// выполнять выгрузку дополнительных данных - следует использовать -// СериализаторXDTO, переданный в процедуру ПослеВыгрузкиТипа() в качестве -// значения параметра Сериализатор, а не полученных с помощью свойства глобального -// контекста СериализаторXDTO, -// ОбъектМетаданных - ОбъектМетаданных, после выгрузки данных которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. Процедура ПриРегистрацииОбработчиковВыгрузкиДанных(ТаблицаОбработчиков) Экспорт СправочникиФайлов = ПрочитатьКэшВыгрузкиЗагрузкиФайловыхФункций().СправочникиФайлов; @@ -218,124 +121,7 @@ КонецПроцедуры -// Вызывается при регистрации произвольных обработчиков загрузки данных. -// -// Параметры: -// ТаблицаОбработчиков - ТаблицаЗначений - в данной процедуре требуется -// дополнить эту таблицу значений информацией о регистрируемых произвольных -// обработчиках загрузки данных. Колонки: -// ОбъектМетаданных - ОбъектМетаданных, при загрузке данных которого должен -// вызываться регистрируемый обработчик, -// Обработчик - ОбщийМодуль, общий модуль, в котором реализован произвольный -// обработчик загрузки данных. Набор экспортных процедур, которые должны -// быть реализованы в обработчике, зависит от установки значений следующих -// колонок таблицы значений, -// Версия - Строка - номер версии интерфейса обработчиков выгрузки / загрузки данных, -// поддерживаемого обработчиком, -// ПередСопоставлениемСсылок - Булево - флаг необходимости вызова обработчика перед -// сопоставлением ссылок (в исходной ИБ и в текущей), относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередСопоставлениемСсылок(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, перед сопоставлением ссылок которого -// был вызван обработчик, -// СтандартнаяОбработка - Булево - если процедуре ПередСопоставлениемСсылок() -// установить значение данного параметра равным Ложь, вместо стандартного -// сопоставления ссылок (поиск объектов в текущей ИБ с теми же значениями -// естественного ключа, которые были выгружены из ИБ-источника) будет -// вызвана функция СопоставитьСсылки() общего модуля, в процедуре -// ПередСопоставлениемСсылок() которого значение параметра СтандартнаяОбработка -// было установлено равным Ложь. -// Параметры функции СопоставитьСсылки(): -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера, -// ТаблицаИсходныхСсылок - ТаблицаЗначений - содержащая информацию о ссылках, -// выгруженных из исходной ИБ. Колонки: -// ИсходнаяСсылка - ЛюбаяСсылка, ссылка объекта исходной ИБ, которую требуется -// сопоставить c ссылкой в текущей ИБ, -// Остальные колонки равным полям естественного ключа объекта, которые в -// процессе выгрузки данных были переданы в функцию -// Обработка.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы.ТребуетсяСопоставитьСсылкуПриЗагрузке() -// Возвращаемое значение функции СопоставитьСсылки() - ТаблицаЗначений, колонки: -// ИсходнаяСсылка - ЛюбаяСсылка, ссылка объекта, выгруженная из исходной ИБ, -// Ссылка - ЛюбаяСсылка, сопоставленная исходной ссылка в текущей ИБ. -// Отказ - Булево - если в процедуре ПередСопоставлениемСсылок() установить значение -// данного параметра равным Истина - сопоставление ссылок, соответствующих -// текущему объекту метаданных, выполняться не будет. -// ПередЗагрузкойТипа - Булево - флаг необходимости вызова обработчика перед -// загрузкой всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, перед загрузкой всех данных которого -// был вызван обработчик, -// Отказ - Булево - если в процедуре ПередЗагрузкойТипа() установить значение данного -// параметра равным Истина - загрузка всех объектов данных соответствующих текущему -// объекту метаданных выполняться не будет. -// ПередЗагрузкойОбъекта - Булево - флаг необходимости вызова обработчика перед -// загрузкой объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПередЗагрузкойОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, перед загрузкой которого был вызван обработчик. -// Значение, переданное в процедуру ПередЗагрузкойОбъекта() в качестве значения параметра -// Объект может быть модифицировано внутри процедуры обработчика ПередЗагрузкойОбъекта(). -// Артефакты - Массив Из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// Отказ - Булево - если в процедуре ПередЗагрузкойОбъекта() установить значение данного -// параметра равным Истина - загрузка объекта данных выполняться не будет. -// ПослеЗагрузкиОбъекта - Булево - флаг необходимости вызова обработчика после -// загрузки объекта данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиОбъекта(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// Объект - КонстантаМенеджерЗначения.*, СправочникОбъект.*, ДокументОбъект.*, -// БизнесПроцессОбъект.*, ЗадачаОбъект.*, ПланСчетовОбъект.*, ПланОбменаОбъект.*, -// ПланВидовХарактеристикОбъект.*, ПланВидовРасчетаОбъект.*, РегистрСведенийНаборЗаписей.*, -// РегистрНакопленияНаборЗаписей.*, РегистрБухгалтерииНаборЗаписей.*, -// РегистрРасчетаНаборЗаписей.*, ПоследовательностьНаборЗаписей.*, ПерерасчетНаборЗаписей.* - -// объект данных информационной базы, после загрузки которого был вызван обработчик. -// Артефакты - Массив Из ОбъектXDTO - дополнительные данные, логически неразрывно связанные -// с объектом данных, но не являющиеся его частью. Сформированы в экспортируемых процедурах -// ПередВыгрузкойОбъекта() обработчиков выгрузки данных (см. комментарий к процедуре -// ПриРегистрацииОбработчиковВыгрузкиДанных(). Каждый артефакт должен являться XDTO-объектом, -// для типа которого в качестве базового типа используется абстрактный XDTO-тип -// {http://www.1c.ru/1cFresh/Data/Dump/1.0.2.1}Artefact. Допускается использовать XDTO-пакеты, -// помимо изначально поставляемых в составе подсистемы ВыгрузкаЗагрузкаДанных. -// ПослеЗагрузкиТипа - Булево - флаг необходимости вызова обработчика после -// загрузки всех объектов данных, относящихся к данному объекту -// метаданных. Если присвоено значение Истина - в общем модуле обработчика должна -// быть реализована экспортируемая процедура ПослеЗагрузкиТипа(), -// поддерживающая следующие параметры: -// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера - менеджер -// контейнера, используемый в процессе загрузки данных. Подробнее см. комментарий -// к программному интерфейсу обработки ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера. -// ОбъектМетаданных - ОбъектМетаданных, после загрузки всех объектов которого -// был вызван обработчик. -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковЗагрузкиДанных. Процедура ПриРегистрацииОбработчиковЗагрузкиДанных(ТаблицаОбработчиков) Экспорт СправочникиФайлов = ПрочитатьКэшВыгрузкиЗагрузкиФайловыхФункций().СправочникиФайлов; @@ -351,13 +137,29 @@ КонецПроцедуры -#КонецОбласти - -// АПК:299-выкл - обработчики событий и обновления ИБ. -#Область ОбработчикиВыгрузкиДанных - +// Подключается в ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковВыгрузкиДанных. +// // Параметры: -// Артефакты - Массив +// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера +// МенеджерВыгрузкиОбъекта - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерВыгрузкиДанныхИнформационнойБазы +// Сериализатор - СериализаторXDTO +// Объект - КонстантаМенеджерЗначения +// - СправочникОбъект +// - ДокументОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланСчетовОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланВидовРасчетаОбъект +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей +// - ПоследовательностьНаборЗаписей +// - ПерерасчетНаборЗаписей +// Артефакты - Массив из ОбъектXDTO +// Отказ - Булево // Процедура ПередВыгрузкойОбъекта(Контейнер, МенеджерВыгрузкиОбъекта, Сериализатор, Объект, Артефакты, Отказ) Экспорт @@ -433,10 +235,28 @@ КонецПроцедуры -#КонецОбласти - -#Область ОбработчикиЗагрузкиДанных - +// Подключается в ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриРегистрацииОбработчиковЗагрузкиДанных. +// +// Параметры: +// Контейнер - ОбработкаОбъект.ВыгрузкаЗагрузкаДанныхМенеджерКонтейнера +// Объект - КонстантаМенеджерЗначения +// - СправочникОбъект +// - ДокументОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланСчетовОбъект +// - ПланОбменаОбъект +// - ПланВидовХарактеристикОбъект +// - ПланВидовРасчетаОбъект +// - РегистрСведенийНаборЗаписей +// - РегистрНакопленияНаборЗаписей +// - РегистрБухгалтерииНаборЗаписей +// - РегистрРасчетаНаборЗаписей +// - ПоследовательностьНаборЗаписей +// - ПерерасчетНаборЗаписей +// Артефакты - Массив из ОбъектXDTO +// Отказ - Булево +// Процедура ПередЗагрузкойОбъекта(Контейнер, Объект, Артефакты, Отказ) Экспорт СправочникиФайлов = ПрочитатьКэшВыгрузкиЗагрузкиФайловыхФункций().СправочникиФайлов; @@ -466,12 +286,16 @@ КонецПроцедуры +// Конец ТехнологияСервиса.ВыгрузкаЗагрузкаДанных + #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции +// АПК:299-выкл - обработчики событий и обновления ИБ. + #Область ОбновлениеИнформационнойБазы // Заполняет очередь извлечения текста для текущей области данных. Используется для начального заполнения при @@ -501,6 +325,7 @@ КонецПроцедуры #КонецОбласти + // АПК:299-вкл #Область ИзвлечениеТекста diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl index 3134999c7..182705180 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl @@ -221,8 +221,8 @@ // Занимает файл на редактирование (checkout). // // Параметры: -// ДанныеФайла - структура с данными файла. -// СтрокаОшибки - строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим +// ДанныеФайла - Структура - с данными файла. +// СтрокаОшибки - Строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим // пользователем"). // УникальныйИдентификатор - уникальный идентификатор формы. // @@ -276,7 +276,7 @@ КонецФункции -// Функция возвращает структуру, содержащую различные сведения о файле и версии. +// Возвращает структуру, содержащую различные сведения о файле и версии. // // Параметры: // ФайлИлиВерсияСсылка - СправочникСсылка.Файлы @@ -401,7 +401,7 @@ КонецФункции -// Функция возвращает структуру, содержащую различные сведения о Файле и версии. +// Возвращает структуру, содержащую различные сведения о Файле и версии. // // Возвращаемое значение: // Структура: @@ -449,9 +449,6 @@ Если ДанныеФайла.Версия <> Неопределено И СведенияОВерсии.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда - ДанныеФайлаТом = СведенияОВерсии.Том; - ДанныеФайлаПутьКФайлу = СведенияОВерсии.ПутьКФайлу; - ДвоичныеДанные = РаботаСФайламиВТомахСлужебный.ДанныеФайла(ДанныеФайла.Версия); ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ИдентификаторФормы); @@ -773,11 +770,6 @@ Версия.Размер = ДвоичныеДанные.Размер(); РаботаСФайламиСлужебный.ПроверитьРазмерФайлаДляЗагрузки(Версия); КонецЕсли; - - ФайлЗашифрован = Ложь; - Если СведенияОФайле.Зашифрован <> Неопределено Тогда - ФайлЗашифрован = СведенияОФайле.Зашифрован; - КонецЕсли; КонецЕсли; ИспользованиеПолнотекстовогоПоиска = Метаданные.СвойстваОбъектов.ИспользованиеПолнотекстовогоПоиска.Использовать; @@ -1253,7 +1245,7 @@ // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. // ДанныеФайла - Структура - структура с данными файла. -// СтрокаОшибки - строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим +// СтрокаОшибки - Строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим // пользователем"). // УникальныйИдентификатор - уникальный идентификатор формы. // @@ -1301,7 +1293,7 @@ // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. // ДанныеФайла - Структура - структура с данными файла. -// СтрокаОшибки - строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим +// СтрокаОшибки - Строка - в которой возвращается причина ошибки в случае неуспеха (скажем "Файл занят другим // пользователем"). // УникальныйИдентификатор - уникальный идентификатор формы. // РабочийКаталогВладельца - Строка - рабочий каталог владельца файла. @@ -1436,7 +1428,7 @@ // Освобождение Файла с получением данных. // Параметры: // ФайлСсылка - СправочникСсылка.Файлы - файл. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура - с данными файла. // УникальныйИдентификатор - уникальный идентификатор формы. // Процедура ПолучитьДанныеФайлаИОсвободитьФайл(ФайлСсылка, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт @@ -1738,7 +1730,7 @@ // Структура: // Версия - СправочникСсылка.ВерсииФайлов - найденная версия. // ДатаПомещения - дата помещения файла в рабочий каталог. -// Владелец - Ссылка - владелец файла. +// Владелец - ЛюбаяСсылка - владелец файла. // НомерВерсии - Число - номер версии. // ВРегистреНаЧтение - Булево - значение ресурса НаЧтение. // ВРегистреКодФайла - число сюда помещается код файла. @@ -2368,13 +2360,8 @@ КонецЦикла; Если ВерсияДругогоАвтора <> Неопределено Тогда - РаботаСФайламиСлужебный.ОбновитьВерсиюВФайле( ФайлИлиВерсия, ВерсияДругогоАвтора, Неопределено, УникальныйИдентификатор); - - ТекстПредупреждения = НСтр("ru = 'Не удалось удалить файл, т.к. в него вносили изменения другие авторы. - |Были удалены только Ваши версии файла.'"); - Иначе Результат.Файлы.Добавить(ФайлИлиВерсия); УдалитьДанные(ФайлИлиВерсия, УникальныйИдентификатор); @@ -2912,13 +2899,9 @@ Функция ПоместитьФайлыВоВременноеХранилище(Параметры) Экспорт Результат = Новый Массив; - ИмяВременнойПапки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(ИмяВременнойПапки); - Для Каждого ФайлВложение Из Параметры.МассивФайлов Цикл РаботаСФайламиСлужебный.СформироватьСписокФайловДляОтправкиПоПочте(Результат, ФайлВложение, Параметры.ИдентификаторФормы); КонецЦикла; - Возврат Результат; КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl index 323650699..c1dbb4fb7 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныйПрограммныйИнтерфейс // Возвращает путь к рабочему каталогу пользователя. @@ -317,7 +312,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ПредставлениеКоманды - Строка - необязательный. Имя команды, для выполнения которой необходимо расширение. +// ПредставлениеКоманды - Строка - имя команды, для выполнения которой необходимо расширение. // Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт Если Не КлиентПоддерживаетСинхронныеВызовы() Тогда @@ -822,7 +817,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура ОткрытьВерсиюФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт @@ -1120,7 +1115,8 @@ КонецПроцедуры // Проверяет свойства файла в рабочем каталоге и в хранилище файлов, -// если требуется уточняет у пользователя и возвращает действие. +// если требуется уточняет у пользователя и возвращает одно из действий: +// "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". // // Параметры: // ОбработчикРезультата - ОписаниеОповещения @@ -1132,10 +1128,6 @@ // ДатаМодификацииУниверсальная - Дата. // ВРабочемКаталогеНаЧтение - Булево. // -// Возвращаемое значение: -// Строка - возможные строки: -// "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". -// Процедура ДействиеПриОткрытииФайлаВРабочемКаталоге(ОбработчикРезультата, ИмяФайлаСПутем, ДанныеФайла) Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда @@ -1577,7 +1569,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. // Параметры вызываемой процедуры: -// ПрисоединенныйФайл - Ссылка, Неопределено - ссылка на добавленный файл, либо +// ПрисоединенныйФайл - ЛюбаяСсылка, Неопределено - ссылка на добавленный файл, либо // Неопределено, если файл не был помещен; // ДополнительныеПараметры - Произвольный - значение, которое было указано при создании // объекта оповещения. @@ -1732,7 +1724,7 @@ // Освобождает файл без обновления. // // Параметры: -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор управляемой формы. // Процедура ОсвободитьФайлБезВопроса(ДанныеФайла, УникальныйИдентификатор = Неопределено) @@ -3136,12 +3128,9 @@ // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ОбъектСсылка - СправочникСсылка.Файлы - файл. -// УникальныйИдентификатор - УникальныйИдентификатор формы. +// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // РабочийКаталогВладельца - Строка - рабочий каталог владельца. // -// Возвращаемое значение: -// Булево - Истина, если операция выполнена успешно. -// Процедура РедактироватьФайлПоСсылке(ОбработчикРезультата, ОбъектСсылка, УникальныйИдентификатор = Неопределено, @@ -3261,7 +3250,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор формы. // Процедура РедактироватьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт @@ -4220,11 +4209,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. -// -// Возвращаемое значение: -// * Неопределено - если файл не занят. -// * Структура с данными файла - если файл занят. +// ДанныеФайла - Структура // Процедура ЗанятьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) @@ -4379,15 +4364,10 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайла - Строка. // НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Структура: -// * ФайлПолучен - Булево - успешно ли выполнена операция. -// * ПолноеИмяФайла - Строка - полное имя файла. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьФайлВерсииВЛокальныйКэшФайлов( ОбработчикРезультата, @@ -4506,20 +4486,14 @@ //////////////////////////////////////////////////////////////////////////////// // Получение файла из программы на диск. -// Получить Файл из информационной базы на локальный диск и возвращает путь -// к этому файлу в параметре. +// Получить Файл из информационной базы на локальный диск и возвращает путь к этому файлу. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайла - Строка - здесь возвращается полное имя файла. -// ИдентификаторФормы - уникальный идентификатор формы. -// -// Возвращаемое значение: -// Структура - результат получения файла: -// * ФайлПолучен - Булево - успешно ли выполнена операция. -// * ПолноеИмяФайла - Строка - полное имя файла. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьФайлВерсииВРабочийКаталог( ОбработчикРезультата, @@ -4986,10 +4960,6 @@ // Ссылка - СправочникСсылка.Файлы - файл. // УдалитьВРабочемКаталоге - Булево - удалить даже в рабочем каталоге. // -// Возвращаемое значение: -// Структура - результат удаления файла с диска и регистра сведений: -// * Успех - Булево - успешно ли выполнена операция. -// Процедура УдалитьФайлИзРабочегоКаталога(ОбработчикРезультата, Ссылка, УдалитьВРабочемКаталоге = Ложь) ПараметрыВыполнения = Новый Структура; @@ -5235,16 +5205,11 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла. // ДатаФайлаВБазе - Дата - дата файла в базе. // НаЧтение - Булево - файл помещен на чтение. -// ИдентификаторФормы - уникальный идентификатор формы. -// -// Возвращаемое значение: -// Структура: -// * ФайлПолучен - Булево - успешно ли выполнена операция. -// * ПолноеИмяФайла - Строка - полное имя файла. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ОбработчикРезультата, ДанныеФайла, @@ -5618,15 +5583,10 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайла - строка (возвращаемое значение). // НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Структура: -// * ФайлПолучен - Булево - успешно ли выполнена операция. -// * ПолноеИмяФайла - Строка - полное имя файла. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // Процедура ПолучитьФайлВерсииВРабочийКаталогПапки(ОбработчикРезультата, ДанныеФайла, @@ -5692,7 +5652,6 @@ НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ПараметрыВыполнения.ПолноеИмяФайла); ПараметрыВыполнения.Вставить("ФайлЕстьВРегистре", НайденныеСвойства.ФайлЕстьВРегистре); Версия = НайденныеСвойства.Файл; - ДатаПомещения = ?(ПараметрыВыполнения.ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, Дата(1, 1, 1, 1, 1, 1)); Владелец = НайденныеСвойства.Владелец; ВРегистреНаЧтение = НайденныеСвойства.ВРегистреНаЧтение; ВРегистреПапка = НайденныеСвойства.ВРегистреПапка; @@ -5826,26 +5785,15 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла. // ДатаФайлаВБазе - Дата - дата файла в базе. // НаЧтение - Булево - файл помещен на чтение. -// ИдентификаторФормы - уникальный идентификатор формы. +// ИдентификаторФормы - УникальныйИдентификатор - идентификатор формы. // ДополнительныеПараметры - Произвольный - дополнительные параметры обработки. // -// Возвращаемое значение: -// Структура: -// * ФайлПолучен - Булево - успешно ли выполнена операция. -// * ПолноеИмяФайла - Строка - полное имя файла. -// -Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( - ОбработчикРезультата, - ДанныеФайла, - ПолноеИмяФайлаВРабочемКаталогеПапки, - ДатаФайлаВБазе, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры) +Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки(ОбработчикРезультата, ДанныеФайла, + ПолноеИмяФайлаВРабочемКаталогеПапки, ДатаФайлаВБазе, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры) ПараметрыВыполнения = Новый Структура; ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); @@ -5959,14 +5907,10 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // ПолноеИмяФайла - Строка - полное имя файла. // НормальноеИмяФайла - Строка - имя файла (без пути). // -// Возвращаемое значение: -// Булево - успешно ли выполнена операция: -// * Истина если длина полного имени файла не превышает 260. -// Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(ОбработчикРезультата, ДанныеФайла, ПолноеИмяФайла, НормальноеИмяФайла) @@ -6107,14 +6051,6 @@ // КаталогИсточника - Строка - прежнее имя каталога. // КаталогПриемника - Строка - новое имя каталога. // -// Возвращаемое значение: -// Структура: -// * ВозниклаОшибка - Булево - Истина когда все файлы скопированы. -// * ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. -// * ПолноеИмяСбойногоФайла - Строка - полное имя файла, при копировании которого возникла ошибка. -// * СкопированныеФайлыИПапки - Массив - полные имена файлов и папок приемника. -// * ОригинальныеФайлыИПапки - Массив - полные имена файлов и папок источника. -// Процедура СкопироватьСодержимоеКаталога(ОбработчикРезультата, Знач КаталогИсточника, Знач КаталогПриемника) Результат = Новый Структура; @@ -6234,9 +6170,6 @@ // КаталогИсточника - Строка - прежнее имя каталога. // КаталогПриемника - Строка - новое имя каталога. // -// Возвращаемое значение: -// Булево - успешно ли выполнена операция. -// Процедура ПеренестиСодержимоеРабочегоКаталога(ОбработчикРезультата, КаталогИсточника, КаталогПриемника) Экспорт // Новый путь является подмножеством старого. Это запрещено, т.к. может привести к зацикливанию. @@ -6333,15 +6266,12 @@ // Удаление массива путей переданных папок и файлов. // Удаляет все файлы и папки из переданного массива. -// Обход с конца. +// Обход с конца. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// СкопированныеФайлыИПапки - Массив - (Строка) Массив путей файлов и папок. -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция. +// СкопированныеФайлыИПапки - Массив из Строка - пути файлов и папок. // Процедура УдалитьСодержимоеКаталога(ОбработчикРезультата, СкопированныеФайлыИПапки) @@ -6408,17 +6338,12 @@ //////////////////////////////////////////////////////////////////////////////// // Импорт файлов с проверкой размера. -// Импорт - с вспомогательными операциями типа проверки предельного размера и впоследствии удаления файлов и показа -// ошибок при импорте только одной папки - вернет на нее ссылку. +// Импорт со вспомогательными операциями (проверка предельного размера, удаление файлов и показ +// ошибок при импорте). // // Параметры: // ПараметрыВыполнения - см. ПараметрыИмпортаФайлов. // -// Возвращаемое значение: -// Неопределено - если импорт не выполнен. -// Структура: -// * ПапкаДляДобавленияТекущая - СправочникСсылка.ПапкиФайлов - папка для добавления. -// Процедура ВыполнитьИмпортФайлов(Знач ПараметрыВыполнения) Экспорт СлужебныеПараметры = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ПараметрыВыполнения); @@ -6637,16 +6562,13 @@ //////////////////////////////////////////////////////////////////////////////// // Сохранение Файла на диск -// Сохранение на диск Файла +// Сохранение на диск файла. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. -// УникальныйИдентификатор - уникальный идентификатор формы. -// -// Возвращаемое значение: -// Строка - выбранный полный путь файла. +// ДанныеФайла - Структура +// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы.. // Процедура СохранитьКак(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт @@ -7038,8 +6960,9 @@ //////////////////////////////////////////////////////////////////////////////// // Проверяет размер файлов. -// Проверить Предельный Размер Файлов - вернет Ложь, если есть файлы, превышающие предельный размер, -// и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена". +// Проверить предельный размер файлов. +// Возвращает Ложь, если есть файлы, превышающие предельный размер, +// и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена". // // Параметры: // ОбработчикРезультата - ОписаниеОповещения @@ -7047,14 +6970,9 @@ // ПараметрыПроверки - Структура: // * ВыбранныеФайлы - Массив - массив объектов "Файл". // * Рекурсивно - Булево - рекурсивно обходить подкаталоги. -// * ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив +// * ПсевдоФайловаяСистема - Соответствие - для строки (каталога) возвращает массив // строк (подкаталоги и файлы). // -// Возвращаемое значение: -// Структура: -// * Успех - Булево - успешно ли выполнена операция. -// * КоличествоСуммарное - Число - количество импортированных файлов. -// Процедура ПроверитьПредельныйРазмерФайлов(ОбработчикРезультата, ПараметрыПроверки) ПараметрыВыполнения = Новый Структура; @@ -7257,9 +7175,9 @@ // Добавляет файлы перетаскиванием в список файлов. // // Параметры: -// ВладелецФайла - Ссылка - владелец файла. +// ВладелецФайла - ЛюбаяСсылка - владелец файла. // ИдентификаторФормы - УникальныйИдентификатор формы. -// МассивИменФайлов - Массив Строк - путей к файлам. +// МассивИменФайлов - Массив из Строка - путей к файлам. // Процедура ДобавитьФайлыПеретаскиванием(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач МассивИменФайлов) Экспорт @@ -7449,7 +7367,7 @@ // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // УникальныйИдентификатор - УникальныйИдентификатор - формы. // Процедура ОткрытьФайлСОповещением(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено, ДляРедактирования = Истина) Экспорт @@ -7654,7 +7572,7 @@ Возврат; КонецЕсли; - ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Обработка.РаботаСФайлами.Форма.ФормаВопроса")); + ПараметрыВыполнения.Вставить("ВременнаяФорма", ПолучитьФорму("Обработка.РаботаСФайлами.Форма.ФормаВопроса")); // АПК:65 ИдентификаторФормы = ПараметрыВыполнения.ВременнаяФорма.УникальныйИдентификатор; СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ПараметрыВыполнения.ВременнаяФорма, Истина); @@ -7752,13 +7670,7 @@ // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Структура: -// * Успех - Булево - успешно ли выполнена операция. -// * МассивДанныхДляЗанесенияВБазу - Массив - массив данных для записи в программу. -// * МассивОтпечатков - Массив - массив отпечатков. +// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // Процедура Зашифровать(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт @@ -7891,20 +7803,15 @@ //////////////////////////////////////////////////////////////////////////////// // Расшифровка файла. -// Расшифрует объект - Файл, Версия. +// Расшифровка файла. // // Параметры: // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // ФайлСсылка - СправочникСсылка.Файлы - файл. -// УникальныйИдентификатор - уникальный идентификатор формы. +// УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы. // ДанныеФайла - см. РаботаСФайламиСлужебныйВызовСервера.ДанныеФайла // -// Возвращаемое значение: -// Структура: -// * Успех - Булево - успешно ли выполнена операция. -// * МассивДанныхДляЗанесенияВБазу - массив структур. -// Процедура Расшифровать(ОбработчикРезультата, ФайлСсылка, УникальныйИдентификатор, ДанныеФайла) Экспорт Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда @@ -8649,6 +8556,13 @@ КонецПроцедуры // Продолжение процедуры (см. выше). +// +// Параметры: +// ПараметрыВыполнения - Структура: +// * ВыбранныеФайлы - Массив +// * ПапкаДляДобавленияВВыбранныеФайлы - Файл +// * МассивПапокДляВопросаПапкаУжеСуществует - Массив +// Процедура ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения) ПараметрыВыполнения.ОбработчикРезультата = ОбработчикЗавершения(ПараметрыВыполнения.ОбработчикРезультата); @@ -8925,7 +8839,7 @@ // Перерегистрировать В рабочем каталоге с другим флагом НаЧтение - если там вообще есть такой Файл. // Параметры: -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // НаЧтение - Булево - файл помещен на чтение. // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге). // @@ -9183,7 +9097,7 @@ // если нет - сгенерируем - и запишем в регистр сведений. // // Параметры: -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // // Возвращаемое значение: // Строка - путь файла @@ -9266,7 +9180,7 @@ // Находится ли в рабочем каталоге Файл для данной версии. // Параметры: -// ДанныеФайла - структура с данными файла. +// ДанныеФайла - Структура // // Возвращаемое значение: // Булево - файл находится в рабочем каталоге. @@ -10174,6 +10088,12 @@ КонецПроцедуры // Продолжение процедуры ОбработатьФайл. +// +// Параметры: +// Существует - Булево +// Контекст- Структура: +// * Результат - Структура +// Процедура ОбработатьФайлПослеПроверкиСуществования(Существует, Контекст) Экспорт Контекст.Результат.Вставить("Существует", Существует); @@ -10250,8 +10170,12 @@ // Продолжение процедуры ОбработатьФайл. // // Параметры: -// Контекст - Структура: +// Невидимость - Булево +// Контекст - Структура: // * Файл - Файл +// * СвойстваДляПолучения - Структура: +// ** Размер - Число +// ** ЭтоКаталог - Булево // Процедура ОбработатьФайлПослеПолученияНевидимости(Невидимость, Контекст) Экспорт @@ -10397,9 +10321,9 @@ ИмяПараметра = "СтандартныеПодсистемы.КомпонентаTwain"; Если ПараметрыПриложения[ИмяПараметра] = Неопределено Тогда - // Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется т.к. - // Внешняя компонента подключается из макета и сканирование не доступно в веб-клиенте. - КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain"); + // АПК:472,150-выкл Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется, + // т.к. внешняя компонента подключается из макета и сканирование не доступно в веб-клиенте. + КодВозврата = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN", "twain"); Если Не КодВозврата Тогда Если Не ПопытатьсяУстановитьКомпоненту Тогда @@ -10407,10 +10331,10 @@ КонецЕсли; УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN"); - Возврат ПроинициализироватьКомпоненту(Ложь); // Рекурсивно. КонецЕсли; + // АПК:472,150-вкл ПараметрыПриложения.Вставить(ИмяПараметра, Новый("AddIn.twain.AddInNativeExtension")); КонецЕсли; @@ -10435,9 +10359,6 @@ // ОбработчикРезультата - ОписаниеОповещения // - Неопределено - описание процедуры, принимающей результат работы метода. // -// Возвращаемое значение: -// Булево - успешно ли выполнена операция. -// // См. также: // Переменную глобального контекста КомпонентаTwain. // @@ -10452,9 +10373,10 @@ ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); Обработчик = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект, ПараметрыВыполнения); - // Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется т.к. - // Внешняя компонента подключается из макета и сканирование не доступно в веб-клиенте. + // АПК:472-выкл Вызов метода ОбщегоНазначенияКлиент.ПодключитьКомпонентуИзМакета не требуется, + // т.к. внешняя компонента подключается из макета и сканирование не доступно в веб-клиенте. НачатьУстановкуВнешнейКомпоненты(Обработчик, "ОбщийМакет.КомпонентаTWAIN"); + // АПК:472-вкл КонецПроцедуры @@ -10842,20 +10764,21 @@ КонецЕсли; Контекст = Новый Структура; - Контекст.Вставить("ФайлИлиВерсия", ФайлИлиВерсия); - Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); + Контекст.Вставить("ФайлИлиВерсия", ФайлИлиВерсия); + Контекст.Вставить("ОбработчикЗавершения", ОбработчикЗавершения); Контекст.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); - ЭтоВерсияФайла = ТипЗнч(ФайлИлиВерсия) = Тип("СправочникСсылка.ВерсииФайлов"); + Если ТипЗнч(ФайлИлиВерсия) <> Тип("СправочникСсылка.ВерсииФайлов") Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Удалить файл %1 без возможности восстановления?'"), + Строка(ФайлИлиВерсия)); + ТекстЗаголовка = НСтр("ru = 'Удаление файла'"); + Иначе + ТекстВопроса = НСтр("ru = 'Удалить версию файла без возможности восстановления?'"); + ТекстЗаголовка = НСтр("ru = 'Удаление версии файла'"); + КонецЕсли; - ТекстВопроса = ?(ЭтоВерсияФайла, - НСтр("ru = 'Удалить версию файла без возможности восстановления?'"), - НСтр("ru = 'Удалить файл без возможности восстановления?'")); - - ТекстЗаголовка = ?(ЭтоВерсияФайла, НСтр("ru = 'Удаление версии файла'"), НСтр("ru = 'Удаление файла'")); - ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьДанныеПослеОтветаНаВопрос", ЭтотОбъект, Контекст), - ТекстВопроса, РежимДиалогаВопрос.ДаНет, 20, КодВозвратаДиалога.Нет, ТекстЗаголовка, КодВозвратаДиалога.Нет); + ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет, ТекстЗаголовка, КодВозвратаДиалога.Нет); КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl index 0f14ab9f9..699034d48 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции // Проверяет установлена ли компонента сканирования и есть ли хоть один сканер. diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl index 46a6dfe6b..ab8b94c48 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйПовтИсп/Module.bsl @@ -6,11 +6,6 @@ // https://creativecommons.org/licenses/by/4.0/legalcode /////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Файловые функции". -// -//////////////////////////////////////////////////////////////////////////////// - #Область СлужебныеПроцедурыИФункции //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl index ab3299b43..8f2198b68 100644 --- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl @@ -8,16 +8,14 @@ #Область ПрограммныйИнтерфейс -// Формирует отчеты и отправляет их согласно настройкам транспорта (Папка, FILE, EMAIL, FTP); +// Формирует отчеты и отправляет их согласно настройкам - в указанную папку файлов, в папку на компьютере, +// по электронной почте или на FTP-ресурс. // // Параметры: // Рассылка - СправочникСсылка.РассылкиОтчетов - выполняемая рассылка отчетов. -// ПараметрыЖурнала - Структура - параметры записи в журнал регистрации, где: -// * ИмяСобытия - Строка - имя события (или группы событий). -// * Метаданные - ОбъектМетаданных - метаданные для привязки события журнала регистрации. -// * Данные - Произвольный - данные для привязки события журнала регистрации. +// ПараметрыЖурнала - см. РассылкаОтчетов.ПараметрыЖурнала. // ДополнительныеНастройки - Структура - настройки, которые переопределяют стандартные параметры рассылки, где: -// * Получатели - Соответствие - набор получателей и их e-mail адресов: +// * Получатели - Соответствие из КлючИЗначение - набор получателей и их e-mail адресов: // ** Ключ - СправочникСсылка - получатель. // ** Значение - Строка - набор e-mail адресов получателя в строке с разделителями. // @@ -25,22 +23,12 @@ // Булево - признак успешного выполнения рассылки. // Функция ВыполнитьРассылкуОтчетов(Рассылка, ПараметрыЖурнала = Неопределено, ДополнительныеНастройки = Неопределено) Экспорт - // Параметры записи в журнал регистрации. - Если ПараметрыЖурнала = Неопределено Тогда - ПараметрыЖурнала = Новый Структура; - КонецЕсли; - - Если Не ПараметрыЖурнала.Свойство("ИмяСобытия") Тогда - ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Запуск по требованию'", ОбщегоНазначения.КодОсновногоЯзыка())); - КонецЕсли; - - Если Не ПараметрыЖурнала.Свойство("Данные") Тогда - ПараметрыЖурнала.Вставить("Данные", Рассылка); - КонецЕсли; - - Если Не ПараметрыЖурнала.Свойство("Метаданные") Тогда - ПараметрыЖурнала.Вставить("Метаданные", ПараметрыЖурнала.Данные.Метаданные()); + + ПараметрыЖурналаПоУмолчанию = ПараметрыЖурнала(Рассылка); + Если ПараметрыЖурнала <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыЖурналаПоУмолчанию, ПараметрыЖурнала); КонецЕсли; + ПараметрыЖурнала = ПараметрыЖурналаПоУмолчанию; // Проверка прав доступа Если Не ПравоВывода(ПараметрыЖурнала) Тогда @@ -71,19 +59,6 @@ РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьЗапускРассылки(Рассылка); КонецЕсли; - // Таблица отчетов - ТаблицаОтчетов = Новый ТаблицаЗначений; - ТаблицаОтчетов.Колонки.Добавить("Отчет", Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Отчеты.Реквизиты.Отчет.Тип); - ТаблицаОтчетов.Колонки.Добавить("ОтправлятьЕслиПустой", Новый ОписаниеТипов("Булево")); - - МассивТиповНастроек = Новый Массив; - МассивТиповНастроек.Добавить(Тип("Неопределено")); - МассивТиповНастроек.Добавить(Тип("ПользовательскиеНастройкиКомпоновкиДанных")); - МассивТиповНастроек.Добавить(Тип("Структура")); - - ТаблицаОтчетов.Колонки.Добавить("Настройки", Новый ОписаниеТипов(МассивТиповНастроек)); - ТаблицаОтчетов.Колонки.Добавить("Форматы", Новый ОписаниеТипов("Массив")); - // Форматы по умолчанию ФорматыПоУмолчанию = Новый Массив; Найденные = Рассылка.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", ПустоеЗначениеОтчета())); @@ -103,6 +78,7 @@ КонецЕсли; // Заполнение таблицы отчетов + ТаблицаОтчетов = ОтчетыДляРассылки(); Для Каждого СтрокаОтчет Из Рассылка.Отчеты Цикл Стр = ТаблицаОтчетов.Добавить(); Стр.Отчет = СтрокаОтчет.Отчет; @@ -132,7 +108,7 @@ КонецЦикла; // Подготовка параметров доставки. - ПараметрыДоставки = СтандартныеПараметрыДоставки(); + ПараметрыДоставки = ПараметрыДоставки(); ПараметрыДоставки.ИспользоватьПапку = Рассылка.ИспользоватьПапку; ПараметрыДоставки.ИспользоватьСетевойКаталог = Рассылка.ИспользоватьСетевойКаталог; ПараметрыДоставки.ИспользоватьFTPРесурс = Рассылка.ИспользоватьFTPРесурс; @@ -239,128 +215,37 @@ КонецФункции -// Выполняет рассылку отчетов без элемента справочника "Рассылки отчетов". +// Выполняет рассылку произвольных отчетов, указанных в параметре Отчеты. // -//////////////////////////////////////////////////////////////////////////////// // Параметры: -// -// Отчеты - ТаблицаЗначений - набор выгружаемых отчетов. Колонки: -// * Отчет - СправочникСсылка.ВариантыОтчетов -// - СправочникСсылка.ДополнительныеОтчетыИОбработки - -// Отчет, который необходимо сформировать. -// * ОтправлятьЕслиПустой - Булево - флаг отправки отчета даже если он пустой. -// * Настройки - настройки, с которыми должен сформироваться отчет, где: -// Дополнительно используется для определения принадлежности отчета к СКД. -// - ПользовательскиеНастройкиКомпоновкиДанных - табличный документ сформируется механизмами СКД. -// - Структура - табличный документ сформируется при помощи метода "Сформировать()", где: -// *** Ключ - Строка - имя реквизита объекта отчета. -// *** Значение - Произвольный - значение реквизита объекта отчета. -// - Неопределено - настройки по умолчанию. Для определения принадлежности к СКД -// будет использован реквизит объекта "СхемаКомпоновкиДанных". -// * Форматы - Массив из ПеречислениеСсылка.ФорматыСохраненияОтчетов - -// Форматы, в которых необходимо сохранить и отправить отчет. -// -// ПараметрыДоставки - Структура - настройки транспорта (способа доставки) отчетов. -// Набор реквизитов может отличаться для разных способов доставки: -// -// Обязательные реквизиты: -// * Автор - СправочникСсылка.Пользователи - автор рассылки. -// * ИспользоватьПапку - Булево - доставлять отчеты в папку подсистемы "Работа с файлами". -// * ИспользоватьСетевойКаталог - Булево - доставлять отчеты в папку файловой системы. -// * ИспользоватьFTPРесурс - Булево - доставлять отчеты на FTP. -// * ИспользоватьЭлектроннуюПочту - Булево - доставлять отчеты по электронной почте. -// -// Обязательные реквизиты когда { ИспользоватьПапку = Истина }: -// * Папка - СправочникСсылка.ПапкиФайлов - папка подсистемы "Работа с файлами". -// -// Обязательные реквизиты когда { ИспользоватьСетевойКаталог = Истина }: -// * СетевойКаталогWindows - Строка - каталог файловой системы (локальный на сервере или сетевой). -// * СетевойКаталогLinux - Строка - каталог файловой системы (локальный на сервере или сетевой). -// -// Обязательные реквизиты когда { ИспользоватьFTPРесурс = Истина }: -// * Сервер - Строка - имя FTP сервера. -// * Порт - Число - порт FTP сервера. -// * Логин - Строка - имя пользователя FTP сервера. -// * Пароль - Строка - пароль пользователя FTP сервера. -// * Каталог - Строка - путь к каталогу на FTP сервере. -// * ПассивноеСоединение - Булево - использовать пассивное соединение. -// -// Обязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина }: -// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - -// Учетная запись для отправки почтового сообщения. -// * Получатели - Соответствие - набор получателей и их e-mail адресов: -// ** Ключ - СправочникСсылка - получатель. -// ** Значение - Строка - набор e-mail адресов получателя в строке с разделителями. -// -// Необязательные реквизиты: -// * Архивировать - Булево - архивировать все файлы сформированных отчетов в один архив. -// Архивация может потребоваться, например, при рассылке графиков в формате html. -// * ИмяАрхива - Строка - имя архива. -// * ПарольАрхива - Строка - пароль архива. -// * ТранслитерироватьИменаФайлов - Булево - признак необходимости транслитерации имен файлов отчетов рассылки. -// -// Необязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина }: -// * Персонализирована - Булево - рассылка персонализирована получателями. -// Значение по умолчанию Ложь. -// Если установить значение Истина, то каждый получатель получит отчет с отбором по нему. -// Для этого в отчетах следует установить отбор "[Получатель]" по реквизиту, совпадающем с типом получателя. -// Применимо только только при доставке по почте, -// поэтому когда устанавливается в Истина, то другие способы доставки отключаются: -// { ИспользоватьПапку = Ложь } -// { ИспользоватьСетевойКаталог = Ложь } -// { ИспользоватьFTPРесурс = Ложь } -// И соответствующая им возможность уведомления: -// { ТолькоУведомить = Ложь } -// * ТолькоУведомить - Булево - Ложь - отправлять только уведомления (не присоединять сформированные отчеты). -// * СкрытыеКопии - Булево - Ложь - если "Истина", то при отправке вместо "Кому" заполняется "СкрытыеКопии". -// * ШаблонТемы - Строка - тема письма. -// * ШаблонТекста - Строка - тело письма. -// * ПараметрыПисьма - Структура - параметры сообщения, -// которые будут переданы подсистеме "РаботаСПочтовымиСообщениями" напрямую. -// Их обработку можно увидеть в модуле "РаботаСПочтовымиСообщениямиСлужебный", процедура "ОтправитьСообщение". -// Подсистемой "РассылкаОтчетов" могут использоваться: -// ** ТипТекста - ТипТекстаПочтовогоСообщения -// - Строка -// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем - -// Тип текста письма. -// ** Вложения - Соответствие: -// *** Ключ - Строка - наименование. -// *** Значение - данные картинки. -// - Строка - адрес во временном хранилище, по которому размещена картинка. -// - ДвоичныеДанные - двоичные данные картинки. -// - Картинка - данные картинки. -// ** АдресОтвета - Строка - e-mail адрес ответа. -// +// Отчеты - см. РассылкаОтчетов.ОтчетыДляРассылки. +// ПараметрыДоставки - см. РассылкаОтчетов.ПараметрыДоставки. // НаименованиеРассылки - Строка - выводится в тему и сообщение, а также для вывода ошибок. -// -// ПараметрыЖурнала - Структура - параметры записи в журнал регистрации: -// * ИмяСобытия - Строка - имя события (или группы событий). -// * Метаданные - ОбъектМетаданных - метаданные для привязки события журнала регистрации. -// * Данные - Произвольный - данные для привязки события журнала регистрации. +// ПараметрыЖурнала - см. РассылкаОтчетов.ПараметрыЖурнала. // // Возвращаемое значение: // Булево - признак успешного выполнения рассылки. // Функция ВыполнитьРассылку(Отчеты, ПараметрыДоставки, НаименованиеРассылки = "", ПараметрыЖурнала = Неопределено) Экспорт - РассылкаВыполнена = Ложь; - УточненныеПараметрыДоставки = СтандартныеПараметрыДоставки(); - ЗаполнитьЗначенияСвойств(УточненныеПараметрыДоставки, ПараметрыДоставки); + ПараметрыДоставкиПоУмолчанию = ПараметрыДоставки(); + ЗаполнитьЗначенияСвойств(ПараметрыДоставкиПоУмолчанию, ПараметрыДоставки); + ПараметрыДоставки = ПараметрыДоставкиПоУмолчанию; // Добавление дерева сформированных отчетов - табличных документов и отчетов, сохраненных в форматы (файлов). ДеревоОтчетов = СоздатьДеревоОтчетов(); // Заполнение параметрами по умолчанию и проверка на заполненность ключевых параметров доставки. - Если Не ПроверитьИДозаполнитьПараметрыВыполнения(Отчеты, УточненныеПараметрыДоставки, НаименованиеРассылки, ПараметрыЖурнала) Тогда + Если Не ПроверитьИДозаполнитьПараметрыВыполнения(Отчеты, ПараметрыДоставки, НаименованиеРассылки, ПараметрыЖурнала) Тогда Возврат Ложь; КонецЕсли; // Строка дерева общих (не персонализированных по получателям) отчетов. - УточненныеПараметрыДоставки.СтрокаОбщихОтчетов = ОпределитьСтрокуДереваДляПолучателя(ДеревоОтчетов, Неопределено, УточненныеПараметрыДоставки); + ПараметрыДоставки.СтрокаОбщихОтчетов = ОпределитьСтрокуДереваДляПолучателя(ДеревоОтчетов, Неопределено, ПараметрыДоставки); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Инициализирована рассылка ''%1'', автор: ''%2'''"), - НаименованиеРассылки, УточненныеПараметрыДоставки.Автор); + НаименованиеРассылки, ПараметрыДоставки.Автор); ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщения); @@ -381,11 +266,11 @@ // Инициализация отчета. ПараметрыОтчета = Новый Структура("Отчет, Настройки, Форматы, ОтправлятьЕслиПустой"); ЗаполнитьЗначенияСвойств(ПараметрыОтчета, СтрокаОтчет); - Если Не ИнициализироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, УточненныеПараметрыДоставки.Персонализирована) Тогда + Если Не ИнициализироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, ПараметрыДоставки.Персонализирована) Тогда Продолжить; КонецЕсли; - Если УточненныеПараметрыДоставки.Персонализирована И НЕ ПараметрыОтчета.Персонализирован Тогда + Если ПараметрыДоставки.Персонализирована И НЕ ПараметрыОтчета.Персонализирован Тогда ПараметрыОтчета.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Отчет ''%1'' не может сформирован, так как в его настройках не указан отбор по получателю рассылки.'"), ПредставлениеОтчета); @@ -398,12 +283,12 @@ Попытка Если ПараметрыОтчета.Персонализирован Тогда // В разрезе получателей - Для Каждого КлючИЗначение Из УточненныеПараметрыДоставки.Получатели Цикл + Для Каждого КлючИЗначение Из ПараметрыДоставки.Получатели Цикл СформироватьИСохранитьОтчет( ПараметрыЖурнала, ПараметрыОтчета, ДеревоОтчетов, - УточненныеПараметрыДоставки, + ПараметрыДоставки, КлючИЗначение.Ключ); КонецЦикла; Иначе @@ -412,7 +297,7 @@ ПараметрыЖурнала, ПараметрыОтчета, ДеревоОтчетов, - УточненныеПараметрыДоставки, + ПараметрыДоставки, Неопределено); КонецЕсли; @@ -436,16 +321,18 @@ УровеньЖурналаРегистрации.Предупреждение, НСтр("ru = 'Рассылка отчетов не выполнена, так как отчеты пустые или не сформированы из-за ошибок.'")); - ФайловаяСистема.УдалитьВременныйКаталог(УточненныеПараметрыДоставки.КаталогВременныхФайлов); + ФайловаяСистема.УдалитьВременныйКаталог(ПараметрыДоставки.КаталогВременныхФайлов); Возврат Ложь; КонецЕсли; + РассылкаВыполнена = Ложь; + // Общие отчеты. - ОбщиеВложения = УточненныеПараметрыДоставки.СтрокаОбщихОтчетов.Строки.НайтиСтроки(Новый Структура("Уровень", 3), Истина); + ОбщиеВложения = ПараметрыДоставки.СтрокаОбщихОтчетов.Строки.НайтиСтроки(Новый Структура("Уровень", 3), Истина); // Отправка личных отчетов (персонализированных). Для Каждого СтрокаПолучатель Из ДеревоОтчетов.Строки Цикл - Если СтрокаПолучатель = УточненныеПараметрыДоставки.СтрокаОбщихОтчетов Тогда + Если СтрокаПолучатель = ПараметрыДоставки.СтрокаОбщихОтчетов Тогда Продолжить; // Пропустить строку дерева общих отчетов. КонецЕсли; @@ -461,18 +348,18 @@ ВложенияПолучателя = ОбъединитьМассивы(ОбщиеВложения, ЛичныеВложения); // Формирование представления отчетов. - СформироватьПредставлениеОтчетовДляПолучателя(УточненныеПараметрыДоставки, СтрокаПолучатель); + СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); // Архивация вложений. - АрхивацияВложений(ВложенияПолучателя, УточненныеПараметрыДоставки, СтрокаПолучатель.Значение); + АрхивацияВложений(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель.Значение); ПредставлениеПолучателя = Строка(СтрокаПолучатель.Ключ); // Доставка. Попытка - ОтправитьОтчетыПолучателю(ВложенияПолучателя, УточненныеПараметрыДоставки, СтрокаПолучатель); + ОтправитьОтчетыПолучателю(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель); РассылкаВыполнена = Истина; - УточненныеПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина; + ПараметрыДоставки.ВыполненаПоЭлектроннойПочте = Истина; Исключение ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось отправить отчеты получателю ''%1'':'"), ПредставлениеПолучателя); @@ -481,20 +368,20 @@ КонецПопытки; Если РассылкаВыполнена Тогда - УточненныеПараметрыДоставки.Получатели.Удалить(СтрокаПолучатель.Ключ); + ПараметрыДоставки.Получатели.Удалить(СтрокаПолучатель.Ключ); КонецЕсли; КонецЦикла; // Отправка общих отчетов. Если ОбщиеВложения.Количество() > 0 Тогда // Представление отчетов. - СформироватьПредставлениеОтчетовДляПолучателя(УточненныеПараметрыДоставки, СтрокаПолучатель); + СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); // Архивация вложений. - АрхивацияВложений(ОбщиеВложения, УточненныеПараметрыДоставки, УточненныеПараметрыДоставки.КаталогВременныхФайлов); + АрхивацияВложений(ОбщиеВложения, ПараметрыДоставки, ПараметрыДоставки.КаталогВременныхФайлов); // Доставка. - Если ВыполнитьДоставку(ПараметрыЖурнала, УточненныеПараметрыДоставки, ОбщиеВложения) Тогда + Если ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, ОбщиеВложения) Тогда РассылкаВыполнена = Истина; КонецЕсли; КонецЕсли; @@ -505,29 +392,222 @@ ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Рассылка не выполнена'")); КонецЕсли; - ФайловаяСистема.УдалитьВременныйКаталог(УточненныеПараметрыДоставки.КаталогВременныхФайлов); + ФайловаяСистема.УдалитьВременныйКаталог(ПараметрыДоставки.КаталогВременныхФайлов); // Результат. Если ПараметрыЖурнала.Свойство("БылиОшибки") Тогда - УточненныеПараметрыДоставки.БылиОшибки = ПараметрыЖурнала.БылиОшибки; + ПараметрыДоставки.БылиОшибки = ПараметрыЖурнала.БылиОшибки; КонецЕсли; Если ПараметрыЖурнала.Свойство("БылиПредупреждения") Тогда - УточненныеПараметрыДоставки.БылиПредупреждения = ПараметрыЖурнала.БылиПредупреждения; + ПараметрыДоставки.БылиПредупреждения = ПараметрыЖурнала.БылиПредупреждения; КонецЕсли; Возврат РассылкаВыполнена; КонецФункции -// Для вызова из модулей "РассылкаОтчетовПереопределяемый" и "РассылкаОтчетовПовтИсп". -// Добавляет формат (в случае его отсутствия) и устанавливает его параметры (если переданы). +// Конструктор для значения параметра ПараметрыЖурнала функций ВыполнитьРассылкуОтчетов и ВыполнитьРассылку. +// +// Параметры: +// Рассылка - СправочникСсылка.РассылкиОтчетов - выполняемая рассылка отчетов. +// +// Возвращаемое значение: +// Структура - параметры записи в журнал регистрации, где: +// * ИмяСобытия - Строка - имя события (или группы событий). +// * Метаданные - Массив из ОбъектМетаданных, Неопределено - метаданные для привязки события журнала регистрации. +// * Данные - Произвольный - данные для привязки события журнала регистрации. +// +Функция ПараметрыЖурнала(Рассылка = Неопределено) Экспорт + + ПараметрыЖурнала = Новый Структура; + ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Запуск по требованию'", ОбщегоНазначения.КодОсновногоЯзыка())); + ПараметрыЖурнала.Вставить("Данные", Рассылка); + ПараметрыЖурнала.Вставить("Метаданные", ?(Рассылка <> Неопределено, Рассылка.Метаданные(), Неопределено)); + ПараметрыЖурнала.Вставить("МассивОшибок", Неопределено); // служебное свойство + Возврат ПараметрыЖурнала; + +КонецФункции + +// Конструктор для значения параметра Отчеты функции ВыполнитьРассылку. +// +// Возвращаемое значение: +// ТаблицаЗначений - набор выгружаемых отчетов. Колонки: +// * Отчет - СправочникСсылка.ВариантыОтчетов +// - СправочникСсылка.ДополнительныеОтчетыИОбработки - отчет, который необходимо сформировать. +// * ОтправлятьЕслиПустой - Булево - отправлять отчет, даже если он пустой. +// * Настройки - ПользовательскиеНастройкиКомпоновкиДанных - табличный документ сформируется механизмами СКД. +// - Структура - табличный документ сформируется при помощи метода Сформировать, где: +// ** Ключ - Строка - имя реквизита объекта отчета. +// ** Значение - Произвольный - значение реквизита объекта отчета. +// - Неопределено - настройки по умолчанию. +// Примечание. Настройки, с которыми должен сформироваться отчет. +// * Форматы - Массив из ПеречислениеСсылка.ФорматыСохраненияОтчетов - форматы, в которых необходимо сохранить и +// отправить отчет. +// +Функция ОтчетыДляРассылки() Экспорт + + ТаблицаОтчетов = Новый ТаблицаЗначений; + ТаблицаОтчетов = Новый ТаблицаЗначений; + ТаблицаОтчетов.Колонки.Добавить("Отчет", Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Отчеты.Реквизиты.Отчет.Тип); + ТаблицаОтчетов.Колонки.Добавить("ОтправлятьЕслиПустой", Новый ОписаниеТипов("Булево")); + + МассивТиповНастроек = Новый Массив; + МассивТиповНастроек.Добавить(Тип("Неопределено")); + МассивТиповНастроек.Добавить(Тип("ПользовательскиеНастройкиКомпоновкиДанных")); + МассивТиповНастроек.Добавить(Тип("Структура")); + + ТаблицаОтчетов.Колонки.Добавить("Настройки", Новый ОписаниеТипов(МассивТиповНастроек)); + ТаблицаОтчетов.Колонки.Добавить("Форматы", Новый ОписаниеТипов("Массив")); + Возврат ТаблицаОтчетов; + +КонецФункции + +// Конструктор для значения параметра ПараметрыДоставки функции ВыполнитьРассылку. +// +// Возвращаемое значение: +// Структура - настройки способа доставки отчетов. Состав свойств может отличаться для разных способов доставки. +// Общие свойства: +// * Автор - СправочникСсылка.Пользователи - автор рассылки. +// * ИспользоватьПапку - Булево - доставлять отчеты в папку подсистемы "Работа с файлами". +// * ИспользоватьСетевойКаталог - Булево - доставлять отчеты в папку файловой системы. +// * ИспользоватьFTPРесурс - Булево - доставлять отчеты на FTP. +// * ИспользоватьЭлектроннуюПочту - Булево - доставлять отчеты по электронной почте. +// +// Свойства, когда ИспользоватьПапку = Истина: +// * Папка - СправочникСсылка.ПапкиФайлов - папка подсистемы "Работа с файлами". +// +// Свойства, когда ИспользоватьСетевойКаталог = Истина: +// * СетевойКаталогWindows - Строка - каталог файловой системы (локальный на сервере или сетевой). +// * СетевойКаталогLinux - Строка - каталог файловой системы (локальный на сервере или сетевой). +// +// Свойства, когда ИспользоватьFTPРесурс = Истина: +// * Сервер - Строка - имя FTP сервера. +// * Порт - Число - порт FTP сервера. +// * Логин - Строка - имя пользователя FTP сервера. +// * Пароль - Строка - пароль пользователя FTP сервера. +// * Каталог - Строка - путь к каталогу на FTP сервере. +// * ПассивноеСоединение - Булево - использовать пассивное соединение. +// +// Свойства, когда ИспользоватьЭлектроннуюПочту = Истина: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - для отправки почтового сообщения. +// * Получатели - Соответствие из КлючИЗначение - набор получателей и их e-mail адресов: +// ** Ключ - СправочникСсылка - получатель. +// ** Значение - Строка - email-адреса получателя, разделенные запятыми. +// +// Дополнительные свойства: +// * Архивировать - Булево - архивировать все файлы сформированных отчетов в один архив. +// Архивация может потребоваться, например, при рассылке графиков в формате html. +// * ИмяАрхива - Строка - имя архива. +// * ПарольАрхива - Строка - пароль архива. +// * ТранслитерироватьИменаФайлов - Булево - признак необходимости транслитерации имен файлов отчетов рассылки. +// +// Необязательные свойства, когда ИспользоватьЭлектроннуюПочту = Истина: +// * Персонализирована - Булево - рассылка персонализирована получателями. +// Значение по умолчанию Ложь. +// Если установить значение Истина, то каждый получатель получит отчет с отбором по нему. +// Для этого в отчетах следует установить отбор "[Получатель]" по реквизиту, совпадающем с типом получателя. +// Применимо только только при доставке по почте, +// поэтому когда устанавливается в Истина, то другие способы доставки отключаются. +// * ТолькоУведомить - Булево - Ложь - отправлять только уведомления (не присоединять сформированные отчеты). +// * СкрытыеКопии - Булево - Ложь - если Истина, то при отправке вместо "Кому" заполняется "СкрытыеКопии". +// * ШаблонТемы - Строка - тема письма. +// * ШаблонТекста - Строка - тело письма. +// * ПараметрыФорматов - Соответствие из КлючИЗначение: +// ** Ключ - ПеречислениеСсылка.ФорматыСохраненияОтчетов +// ** Значение - Структура: +// *** Расширение - Строка +// *** ТипФайла - ТипФайлаТабличногоДокумента +// *** Имя - Строка +// * ПараметрыПисьма - Структура - параметры сообщения, которые будут переданы подсистеме +// РаботаСПочтовымиСообщениями напрямую. Их обработку см. в процедуре +// РаботаСПочтовымиСообщениямиСлужебный.ОтправитьСообщение. +// Подсистемой "РассылкаОтчетов" могут использоваться: +// ** ТипТекста - ТипТекстаПочтовогоСообщения +// - Строка +// - ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем - тип текста письма. +// ** Вложения - Соответствие из КлючИЗначение: +// *** Ключ - Строка - наименование. +// *** Значение - Строка - адрес во временном хранилище, по которому размещена картинка. +// - ДвоичныеДанные - двоичные данные картинки. +// - Картинка - данные картинки. +// ** АдресОтвета - Строка - email-адрес ответа. +// +Функция ПараметрыДоставки() Экспорт + + ПараметрыДоставки = Новый Структура; + ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); + ПараметрыДоставки.Вставить("Соединение", Неопределено); + ПараметрыДоставки.Вставить("ЗапускЗафиксирован", Истина); + ПараметрыДоставки.Вставить("Автор", Пользователи.ТекущийПользователь()); + ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); + + ПараметрыДоставки.Вставить("НастройкиПолучателей", Новый Соответствие); + ПараметрыДоставки.Вставить("Получатели", Неопределено); + ПараметрыДоставки.Вставить("УчетнаяЗапись", Неопределено); + ПараметрыДоставки.Вставить("Рассылка", ""); + + ПараметрыДоставки.Вставить("ПисьмоВФорматеHTML", Ложь); + ПараметрыДоставки.Вставить("Персонализирована", Ложь); + ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); + ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); + ПараметрыДоставки.Вставить("СкрытыеКопии", Ложь); + + ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьПапку", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Ложь); + ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Ложь); + + ПараметрыДоставки.Вставить("Каталог", Неопределено); + ПараметрыДоставки.Вставить("СетевойКаталогWindows", Неопределено); + ПараметрыДоставки.Вставить("СетевойКаталогLinux", Неопределено); + ПараметрыДоставки.Вставить("КаталогВременныхФайлов", ФайловаяСистема.СоздатьВременныйКаталог("RP")); + ПараметрыДоставки.Вставить("ВключатьДатуВИмяФайла", Ложь); + + ПараметрыДоставки.Вставить("Сервер", Неопределено); + ПараметрыДоставки.Вставить("Порт", Неопределено); + ПараметрыДоставки.Вставить("ПассивноеСоединение", Ложь); + ПараметрыДоставки.Вставить("Логин", Неопределено); + ПараметрыДоставки.Вставить("Пароль", Неопределено); + + ПараметрыДоставки.Вставить("Папка", Неопределено); + ПараметрыДоставки.Вставить("Архивировать", Ложь); + ПараметрыДоставки.Вставить("ИмяАрхива", ШаблонИмениАрхива()); + ПараметрыДоставки.Вставить("ПарольАрхива", Неопределено); + + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ПредставлениеОтчетовПолучателя", ""); + ПараметрыДоставки.Вставить("ШаблонТемы", ШаблонТемы()); + ПараметрыДоставки.Вставить("ШаблонТекста", ""); + + ПараметрыДоставки.Вставить("ПараметрыФорматов", Новый Соответствие); + ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); + ПараметрыДоставки.Вставить("СтрокаОбщихОтчетов", Неопределено); + ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); + + ПараметрыДоставки.Вставить("БылиОшибки", Ложь); + ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); + ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); + ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); + ПараметрыДоставки.Вставить("ВыполненныеСпособыПубликации", ""); + + Возврат ПараметрыДоставки; + +КонецФункции + +// Для вызова из модулей РассылкаОтчетовПереопределяемый и РассылкаОтчетовПовтИсп. +// Добавляет формат (в случае его отсутствия) и устанавливает его параметры (если переданы). // // Параметры: // СписокФорматов - СписокЗначений // ФорматСсылка - Строка // - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка или имя формата. -// Картинка - Картинка - необязательный. Картинка формата. -// ИспользоватьПоУмолчанию - Булево - необязательный. Признак того, что формат используется по умолчанию. +// Картинка - Картинка - картинка формата. +// ИспользоватьПоУмолчанию - Булево - признак того, что формат используется по умолчанию. // Процедура УстановитьПараметрыФормата(СписокФорматов, ФорматСсылка, Картинка = Неопределено, ИспользоватьПоУмолчанию = Неопределено) Экспорт Если ТипЗнч(ФорматСсылка) = Тип("Строка") Тогда @@ -545,7 +625,7 @@ КонецЕсли; КонецПроцедуры -// Для вызова из модулей "РассылкаОтчетовПереопределяемый" и "РассылкаОтчетовПовтИсп". +// Для вызова из модулей РассылкаОтчетовПереопределяемый и РассылкаОтчетовПовтИсп. // Добавляет описание типа получателей в соответствующую таблицу. // // Параметры: @@ -642,8 +722,7 @@ КонецЕсли; КонецПроцедуры -// Выполняет массив рассылок и размещает результат по адресу АдресРезультата. В файловом -// режиме вызывается напрямую, в клиент-серверном - через фоновое задание. +// Выполняет несколько рассылок и размещает результат по адресу АдресРезультата. // // Параметры: // ПараметрыВыполнения - Структура - выполняемые рассылки и их параметры: @@ -683,8 +762,9 @@ МассивСообщений = Новый Массив; Для Каждого СтрокаТаблицы Из Подготовленные Цикл - ПараметрыЖурнала = Новый Структура("МассивОшибок", Новый Массив); + ПараметрыЖурнала = ПараметрыЖурнала(СтрокаТаблицы.Рассылка); + ПараметрыЖурнала.МассивОшибок = Новый Массив; СтрокаТаблицы.Выполнена = ВыполнитьРассылкуОтчетов( СтрокаТаблицы.Рассылка, ПараметрыЖурнала, @@ -763,7 +843,7 @@ // * Метаданные - ОбъектМетаданных - метаданные для привязки события журнала регистрации. // * Данные - Произвольный - данные для привязки события журнала регистрации. // ДополнительныеНастройки - Структура - настройки, которые переопределяют стандартные параметры рассылки: -// * Получатели - Соответствие - набор получателей и их e-mail адресов: +// * Получатели - Соответствие из КлючИЗначение - набор получателей и их e-mail адресов: // ** Ключ - СправочникСсылка - получатель. // ** Значение - Строка - набор e-mail адресов получателя в строке с разделителями. // @@ -788,7 +868,7 @@ // Форма - ФормаКлиентскогоПриложения // - РасширениеФормыОтчета // Отказ - Булево -// СтандартнаяОбработка - булево +// СтандартнаяОбработка - Булево // Процедура ФормаОтчетаДобавитьКоманды(Форма, Отказ, СтандартнаяОбработка) Экспорт @@ -841,11 +921,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок -// -// Параметры: -// ИсключенияПоискаСсылок - Массив -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.РассылкиОтчетов.Реквизиты.ТипПолучателейРассылки); @@ -853,10 +929,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - Массив -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт Если Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -896,10 +968,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел -// // Параметры: -// ТекущиеДела - Массив +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если Не ПравоДобавления() Тогда @@ -930,7 +1000,7 @@ Отборы.Вставить("СОшибками", Истина); Отборы.Вставить("ЭтоГруппа", Ложь); Если Пользователи.ЭтоПолноправныйПользователь() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "И РассылкиОтчетов.Автор = &Автор", ""); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "И РассылкиОтчетов.Автор = &Автор", ""); // @query-part Иначе Отборы.Вставить("Автор", Пользователи.ТекущийПользователь()); Запрос.УстановитьПараметр("Автор", Отборы.Автор); @@ -956,14 +1026,17 @@ КонецПроцедуры // См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами. +// Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт Объекты.Вставить(Метаданные.Справочники.РассылкиОтчетов.ПолноеИмя(), "РеквизитыНеРедактируемыеВГрупповойОбработке"); КонецПроцедуры -// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. + + +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий // // Параметры: -// Зависимости - ТаблицаЗначений +// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); @@ -982,7 +1055,7 @@ // См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек // // Параметры: -// Объекты - Массив +// Объекты - Массив из ОбъектМетаданных // Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт @@ -1004,10 +1077,8 @@ // Процедура ВыполнитьРассылкуПоРасписанию(Рассылка) Экспорт - // Проверки. ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.РассылкаОтчетов); - // Регистрация запуска (запущена, но не выполнена). РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьЗапускРассылки(Рассылка); Если Не ПравоДоступа("Чтение", Метаданные.Справочники.РассылкиОтчетов) Тогда @@ -1015,13 +1086,12 @@ НСтр("ru = 'У текущего пользователя недостаточно прав для чтения рассылок отчетов. |Рекомендуется отключить все рассылки этого пользователя или сменить автора его рассылок (на вкладке ""Расписание"").'"); КонецЕсли; + Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ ВыполнятьПоРасписанию ИЗ Справочник.РассылкиОтчетов ГДЕ Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Рассылка); Выборка = Запрос.Выполнить().Выбрать(); Если Не Выборка.Следующий() Тогда - ВызватьИсключение - НСтр("ru = 'У текущего пользователя недостаточно прав для чтения этой рассылки. - |Рекомендуется сменить автора рассылки (на вкладке ""Расписание"").'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для просмотра рассылки отчетов.'"); КонецЕсли; Если Не Выборка.ВыполнятьПоРасписанию Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1030,14 +1100,7 @@ Строка(Рассылка)); КонецЕсли; - // Параметры записи в журнал регистрации. - ПараметрыЖурнала = Новый Структура("ИмяСобытия, Метаданные, Данные"); - ПараметрыЖурнала.ИмяСобытия = НСтр("ru = 'Рассылка отчетов. Запуск по расписанию'", ОбщегоНазначения.КодОсновногоЯзыка()); - ПараметрыЖурнала.Метаданные = Рассылка.Метаданные(); - ПараметрыЖурнала.Данные = Рассылка; - - // Рассылка - ВыполнитьРассылкуОтчетов(Рассылка, ПараметрыЖурнала, Новый Структура("ЗапускЗафиксирован", Истина)); + ВыполнитьРассылкуОтчетов(Рассылка, ПараметрыЖурнала(Рассылка), Новый Структура("ЗапускЗафиксирован", Истина)); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -1238,6 +1301,7 @@ // параметров. // // Параметры: +// ПараметрыЖурнала - см. ПараметрыЖурнала. // ПараметрыОтчета - Структура - отчет, настройки и результат его инициализации: // * Отчет - СправочникСсылка.ВариантыОтчетов - ссылка отчета. // * Настройки - Неопределено @@ -1246,10 +1310,10 @@ // Настройки отчета, которые необходимо использовать, // подробнее см. процедуру "ЗаписатьНастройкиСтрокиОтчеты" модуля "Справочник.РассылкиОтчетов.ФормаОбъекта". // ПерсонализацияВозможна - Булево - Истина, если отчет может быть персонализирован. -// УникальныйИдентификаторФормы - УникальныйИдентификатор - необязательный. Адрес размещения СКД. +// УникальныйИдентификаторФормы - УникальныйИдентификатор - адрес размещения СКД. // // Параметры, изменяемые в процессе работы метода: -// ПараметрыОтчета - Структура - +// ПараметрыОтчета - Структура: // Результат инициализации: // * Инициализирован - Булево - Истина, если инициализация прошла успешно. // * Ошибки - Строка - Текст ошибок. @@ -1257,16 +1321,16 @@ // * Имя - Строка - Имя отчета. // * ЭтоВариант - Булево - Истина, если поставщик - справочник "ВариантыОтчетов". // * СКД - Булево - Истина, если отчет на базе СКД. -// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. -// * Объект - ОтчетОбъект.<Имя отчета>, ВнешнийОтчет - Объект отчета. +// * Метаданные - ОбъектМетаданныхОтчет - Метаданные отчета. +// * Объект - ОтчетОбъект, ВнешнийОтчет - Объект отчета. // Свойства отчетов на базе СКД: -// * СхемаКД - СхемаКомпоновкиДанных - -// * КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - -// * НастройкиКД - НастройкиКомпоновкиДанных - +// * СхемаКД - СхемаКомпоновкиДанных +// * КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных +// * НастройкиКД - НастройкиКомпоновкиДанных // * АдресСхемы - Строка - Адрес схемы компоновки данных во временном хранилище. // Свойства произвольных отчетов: -// * ДоступныеРеквизиты - Структура - Имя и параметры реквизита. -// ** <Имя реквизита> - Структура - Параметры реквизита. +// * ДоступныеРеквизиты - Структура - Имя и параметры реквизита: +// ** ИмяРеквизита - Структура - Параметры реквизита: // *** Представление - Строка - Представление реквизита. // *** Тип - ОписаниеТипов - Тип реквизита. // @@ -1670,24 +1734,18 @@ Возврат ПользовательИБ.Имя; КонецФункции -// Создает запись в журнале регистрации и сообщениях пользователю; -// Поддерживает передачу информации об ошибке. +// Создает запись в журнале регистрации и выводит сообщения пользователю. +// Пользователю выводится краткое представление ошибки, а в журнал записывается подробное представление ошибки. // // Параметры: -// ПараметрыЖурнала - Структура - параметры записи в журнал регистрации, где: -// * ИмяСобытия - Строка - имя события (или группы событий). -// * Метаданные - ОбъектМетаданных - метаданные для привязки события журнала регистрации. -// * Данные - Произвольный - данные для привязки события журнала регистрации. -// * МассивОшибок - Массив - сообщения пользователю. +// ПараметрыЖурнала - см. ПараметрыЖурнала // УровеньЖурнала - УровеньЖурналаРегистрации - важность сообщения для администратора. -// Определяется автоматически на основании типа параметра "ОписаниеПроблемы": -// Когда тип = ИнформацияОбОшибке то Ошибка, -// когда тип = Строка то Предупреждение, +// Определяется автоматически на основании типа параметра ОписаниеПроблемы: +// Когда тип = ИнформацияОбОшибке то Ошибка, когда тип = Строка то Предупреждение, // в противном случае Информация. // Текст - Строка - краткое описание проблемы. // ОписаниеПроблемы - ИнформацияОбОшибке // - Строка - описание возникшей проблемы, которое добавляется после текста. -// Пользователю выводится краткое представление ошибки, а в журнал записывается подробное представление ошибки. // Процедура ЗаписьЖурнала(ПараметрыЖурнала, Знач УровеньЖурнала = Неопределено, Знач Текст = "", Знач ОписаниеПроблемы = Неопределено) Экспорт @@ -1724,7 +1782,7 @@ ИначеЕсли ТипЗнч(ОписаниеПроблемы) = Тип("Строка") Тогда Если ЗаписатьВЖурнал Тогда ТекстДляЖурнала = ТекстДляЖурнала + Символы.ПС + ОписаниеПроблемы; - КонецЕсли; + КонецЕсли; ТекстДляПользователя = ТекстДляПользователя + Символы.ПС + ОписаниеПроблемы; КонецЕсли; @@ -1740,8 +1798,9 @@ Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстДляПользователя; Сообщение.УстановитьДанные(ПараметрыЖурнала.Данные); - Если ПараметрыЖурнала.Свойство("МассивОшибок") Тогда - ПараметрыЖурнала.МассивОшибок.Добавить(Сообщение); + Если ПараметрыЖурнала.Свойство("МассивОшибок") И ТипЗнч(ПараметрыЖурнала.МассивОшибок) = Тип("Массив") Тогда + МассивОшибок = ПараметрыЖурнала.МассивОшибок; // Массив из СообщениеПользователю + МассивОшибок.Добавить(Сообщение); Иначе Сообщение.Сообщить(); КонецЕсли; @@ -1750,6 +1809,13 @@ КонецПроцедуры // Формирует массив разрешений по данным рассылки отчетов. +// +// Параметры: +// Рассылка - ВыборкаИзРезультатаЗапроса +// +// Возвращаемое значение: +// Массив +// Функция РазрешенияНаРесурсыСервера(Рассылка) Экспорт Разрешения = Новый Массив; @@ -1834,7 +1900,7 @@ // * Данные - Произвольный - данные для записи в журнал регистрации. // ПараметрыОтчета - Структура - см. ВыполнитьРассылку(), параметр ТаблицаОтчетов. // ДеревоОтчетов - ДеревоЗначений - отчеты и результат формирования. -// ПараметрыДоставки - см. ВыполнитьРассылку.ПараметрыДоставки +// ПараметрыДоставки - см. ПараметрыДоставки // Получатель - СправочникСсылка - ссылка получателя. // // Результат выполнения записывается в ДеревоОтчетов. @@ -2849,11 +2915,11 @@ // Возвращает список значений перечисления "ФорматыСохраненияОтчетов". // // Возвращаемое значение: -// СписокФорматов - СписокЗначений - список форматов, с пометками на системных форматах по умолчанию, где: -// * Значение - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на описываемый формат. -// * Представление - Строка - пользовательское представление описываемого формата. -// * Пометка - Булево - признак использования как формата по умолчанию. -// * Картинка - Картинка - картинка формата. +// СписокЗначений - список форматов, с пометками на системных форматах по умолчанию, где: +// * Значение - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на описываемый формат. +// * Представление - Строка - пользовательское представление описываемого формата. +// * Пометка - Булево - признак использования как формата по умолчанию. +// * Картинка - Картинка - картинка формата. // Функция СписокФорматов() Экспорт СписокФорматов = Новый СписокЗначений; @@ -2936,73 +3002,6 @@ КонецПроцедуры -Функция СтандартныеПараметрыДоставки() - - ПараметрыДоставки = Новый Структура; - ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); - ПараметрыДоставки.Вставить("Соединение", Неопределено); - ПараметрыДоставки.Вставить("ЗапускЗафиксирован", Истина); - ПараметрыДоставки.Вставить("Автор", Пользователи.ТекущийПользователь()); - ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); - - ПараметрыДоставки.Вставить("НастройкиПолучателей", Новый Соответствие); - ПараметрыДоставки.Вставить("Получатели", Неопределено); - ПараметрыДоставки.Вставить("УчетнаяЗапись", Неопределено); - ПараметрыДоставки.Вставить("Рассылка", ""); - - ПараметрыДоставки.Вставить("ПисьмоВФорматеHTML", Ложь); - ПараметрыДоставки.Вставить("Персонализирована", Ложь); - ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); - ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); - ПараметрыДоставки.Вставить("СкрытыеКопии", Ложь); - - ПараметрыДоставки.Вставить("ИспользоватьЭлектроннуюПочту", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьПапку", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ИспользоватьFTPРесурс", Ложь); - - ПараметрыДоставки.Вставить("Каталог", Неопределено); - ПараметрыДоставки.Вставить("СетевойКаталогWindows", Неопределено); - ПараметрыДоставки.Вставить("СетевойКаталогLinux", Неопределено); - ПараметрыДоставки.Вставить("КаталогВременныхФайлов", ФайловаяСистема.СоздатьВременныйКаталог("RP")); - ПараметрыДоставки.Вставить("ВключатьДатуВИмяФайла", Ложь); - - ПараметрыДоставки.Вставить("Сервер", Неопределено); - ПараметрыДоставки.Вставить("Порт", Неопределено); - ПараметрыДоставки.Вставить("ПассивноеСоединение", Ложь); - ПараметрыДоставки.Вставить("Логин", Неопределено); - ПараметрыДоставки.Вставить("Пароль", Неопределено); - - ПараметрыДоставки.Вставить("Папка", Неопределено); - ПараметрыДоставки.Вставить("Архивировать", Ложь); - ПараметрыДоставки.Вставить("ИмяАрхива", ШаблонИмениАрхива()); - ПараметрыДоставки.Вставить("ПарольАрхива", Неопределено); - - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ПредставлениеОтчетовПолучателя", ""); - ПараметрыДоставки.Вставить("ШаблонТемы", ШаблонТемы()); - ПараметрыДоставки.Вставить("ШаблонТекста", ""); - - ПараметрыДоставки.Вставить("ПараметрыФорматов", Новый Соответствие); - ПараметрыДоставки.Вставить("ТранслитерироватьИменаФайлов", Ложь); - ПараметрыДоставки.Вставить("СтрокаОбщихОтчетов", Неопределено); - ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); - - ПараметрыДоставки.Вставить("БылиОшибки", Ложь); - ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); - ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); - ПараметрыДоставки.Вставить("ВыполненныеСпособыПубликации", ""); - - Возврат ПараметрыДоставки; - -КонецФункции - Функция ПредставлениеФормата(Формат) Экспорт Если Формат = Перечисления.ФорматыСохраненияОтчетов.PDF Тогда diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl index a3281d743..85cba80ad 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl @@ -244,7 +244,7 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма отчета. -// Ссылка - СправочникСсылка.РассылкиОтчетов - необязательный. Ссылка рассылки отчетов. +// Ссылка - СправочникСсылка.РассылкиОтчетов - ссылка рассылки отчетов. // Процедура ОткрытьРассылкуИзФормыОтчета(Форма, Ссылка = Неопределено) НастройкиОтчета = Форма.НастройкиОтчета; diff --git a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl index 77d8857a3..5bc316184 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl @@ -87,7 +87,7 @@ // ПараметрыПолучателей - Структура - параметры формирования получателей рассылки. // Запрос - Запрос - запрос, который будет использован, если значение параметра СтандартнаяОбработка останется Истина. // СтандартнаяОбработка - Булево - признак использования стандартных механизмов. -// Результат - Соответствие - получатели с их E-mail адресами: +// Результат - Соответствие из КлючИЗначение - получатели с их E-mail адресами: // * Ключ - СправочникСсылка - получатель. // * Значение - Строка - набор E-mail адресов в строке с разделителями. // diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl index b4c7d05a5..0506e2ce9 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСервер/Module.bsl @@ -15,8 +15,8 @@ // Параметры: // Отбор - Структура - со свойствами: // 1) Общие для любого режима работы: -// * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор регламентного задания -// в локальном режиме работы. +// * УникальныйИдентификатор - УникальныйИдентификатор - идентификатор регламентного задания в локальном +// режиме работы или идентификатор ссылки задания очереди в модели сервиса. // - СправочникСсылка.ОчередьЗаданий // - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания // очереди в модели сервиса. @@ -41,9 +41,9 @@ // * Ключ - Строка - прикладной идентификатор задания. // * Параметры - Массив - параметры, передаваемые в обработчик задания. // * Расписание - Расписание - расписание задания. -// * УникальныйИдентификатор - УникальныйИдентификатор -// - СправочникСсылка.ОчередьЗаданий -// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания. +// * УникальныйИдентификатор - СправочникСсылка.ОчередьЗаданий +// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания +// очереди в модели сервиса. // * ЗапланированныйМоментЗапуска - Дата - дата и время запланированного запуска задания // (в часовом поясе области данных). // * ИмяМетода - Строка - имя метода (или псевдоним) обработчика очереди задании. @@ -114,27 +114,11 @@ КопияОтбора.Идентификатор = Новый УникальныйИдентификатор(КопияОтбора.Идентификатор); КонецЕсли; - СправочникДляЗадания = МодульОчередьЗаданий.СправочникОчередьЗаданий(); - Если МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийРазделениеДанных"); - ПереопределенныйСправочник = МодульОчередьЗаданийРазделениеДанных.ПриВыбореСправочникаДляЗадания(КопияОтбора); - Если ПереопределенныйСправочник <> Неопределено Тогда - СправочникДляЗадания = ПереопределенныйСправочник; - КонецЕсли; - КонецЕсли; - КопияОтбора.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(КопияОтбора.Идентификатор)); + КопияОтбора.Вставить("Идентификатор", СсылкаЗаданияОчереди(КопияОтбора.Идентификатор, КопияОтбора)); КонецЕсли; КопияОтбора.Удалить("Метаданные"); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(КопияОтбора); - // Для обратной совместимости поле Идентификатор не удаляется. - КопияСписка = СписокЗаданий.Скопировать(); - КопияСписка.Колонки.Добавить("УникальныйИдентификатор"); - Для Каждого Строка Из КопияСписка Цикл - Строка.УникальныйИдентификатор = Строка.Идентификатор; - КонецЦикла; - - Возврат КопияСписка; + Возврат УточненныйСписокЗаданий(МодульОчередьЗаданий.ПолучитьЗадания(КопияОтбора)); КонецЕсли; Иначе @@ -151,15 +135,22 @@ // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска -// предопределенного регламентного задания. -// - УникальныйИдентификатор - идентификатор регламентного задания. -// - Строка - строка уникального идентификатора регламентного задания -// или имя метаданных предопределенного регламентного задания. -// - РегламентноеЗадание - регламентное задание из которого нужно получить -// уникальный идентификатор для получения свежей копии регламентного задания. +// предопределенного регламентного задания. +// - Строка - имя метаданных предопределенного регламентного задания в любом режиме работы +// или строка уникального идентификатора регламентного задания в локальном режиме работы +// или строка уникального идентификатора ссылки задания очереди в модели сервиса. +// - УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы +// или идентификатор ссылки задания очереди в модели сервиса. +// - РегламентноеЗадание - регламентное задание из которого нужно получить уникальный идентификатор +// для получения свежей копии регламентного задания в локальном режиме работы. +// - СправочникСсылка.ОчередьЗаданий +// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания очереди в модели сервиса. +// - СтрокаТаблицыЗначений: см. НайтиЗадания // // Возвращаемое значение: -// РегламентноеЗадание - прочитано из базы данных. +// РегламентноеЗадание - в локальном режиме работы. +// СтрокаТаблицыЗначений: см. НайтиЗадания +// Неопределено - задание не найдено. // Функция Задание(Знач Идентификатор) Экспорт @@ -178,6 +169,8 @@ КонецЕсли; КонецЕсли; + РегламентноеЗадание = Неопределено; + Если ОбщегоНазначения.РазделениеВключено() Тогда МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); @@ -201,23 +194,15 @@ ПараметрыЗадания.Вставить("ИмяМетода", Идентификатор.ИмяМетода); КонецЕсли; ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - СправочникДляЗадания = МодульОчередьЗаданий.СправочникОчередьЗаданий(); - Если МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийРазделениеДанных"); - ПереопределенныйСправочник = МодульОчередьЗаданийРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); - Если ПереопределенныйСправочник <> Неопределено Тогда - СправочникДляЗадания = ПереопределенныйСправочник; - КонецЕсли; - КонецЕсли; - ПараметрыЗадания.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(Идентификатор)); + ПараметрыЗадания.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда - Возврат Идентификатор; + ПараметрыЗадания.Вставить("Идентификатор", Идентификатор.Идентификатор); Иначе ПараметрыЗадания.Вставить("Идентификатор", Идентификатор); КонецЕсли; - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания); + СписокЗаданий = УточненныйСписокЗаданий(МодульОчередьЗаданий.ПолучитьЗадания(ПараметрыЗадания)); Для Каждого Задание Из СписокЗаданий Цикл РегламентноеЗадание = Задание; Прервать; @@ -246,18 +231,21 @@ // Добавляет новое задание в очередь или как регламентное. // // Параметры: -// Параметры - Структура - параметры добавляемого задания, возможные ключи: -// * Использование -// * Метаданные - обязательно для указания -// * Параметры -// * Ключ -// * ИнтервалПовтораПриАварийномЗавершении -// * Расписание -// * КоличествоПовторовПриАварийномЗавершении +// Параметры - Структура - параметры добавляемого задания, возможные свойства: +// * Использование - Булево - Истина, если регламентное задание должно выполняться автоматически согласно расписанию. +// * Метаданные - ОбъектМетаданныхРегламентноеЗадание - обязательно для указания. Объект метаданных, на основе +// которого будет создано регламентное задание. +// * Параметры - Массив - параметры регламентного задания. Количество и состав параметров должны соответствовать +// параметрам метода регламентного задания. +// * Ключ - Строка - прикладной идентификатор регламентного задания. +// * ИнтервалПовтораПриАварийномЗавершении - Число - интервал в секундах, через который нужно перезапускать задание +// в случае его аварийного завершения. +// * Расписание - РасписаниеРегламентногоЗадания - расписание задания. +// * КоличествоПовторовПриАварийномЗавершении - Число - количество повторов при аварийном завершении задания. // -// Возвращаемое значение: -// РегламентноеЗадание, СправочникСсылка.ОчередьЗаданий, СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор -// добавленного задания. +// Возвращаемое значение: +// РегламентноеЗадание - в локальном режиме работы. +// СтрокаТаблицыЗначений: см. НайтиЗадания // Функция ДобавитьЗадание(Параметры) Экспорт @@ -284,7 +272,8 @@ МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); Задание = МодульОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); - СписокЗаданий = МодульОчередьЗаданий.ПолучитьЗадания(Новый Структура("Идентификатор", Задание)); + Отбор = Новый Структура("Идентификатор", Задание); + СписокЗаданий = УточненныйСписокЗаданий(МодульОчередьЗаданий.ПолучитьЗадания(Отбор)); Для Каждого Задание Из СписокЗаданий Цикл Возврат Задание; КонецЦикла; @@ -346,15 +335,21 @@ КонецФункции -// Удаляет РегламентноеЗадание из информационной базы. +// Удаляет регламентное задание из информационной базы. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска -// не предопределенного регламентного задания. -// - УникальныйИдентификатор - идентификатор регламентного задания. -// - Строка - строка уникального идентификатора регламентного задания. -// - РегламентноеЗадание - регламентное задание, которое нужно получить -// уникальный идентификатор для получения свежей копии регламентного задания. +// непредопределенного регламентного задания. +// - Строка - имя метаданных предопределенного регламентного задания в любом режиме работы +// или строка уникального идентификатора регламентного задания в локальном режиме работы +// или строка уникального идентификатора ссылки задания очереди в модели сервиса. +// - УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы. +// или идентификатор ссылки задания очереди в модели сервиса. +// - РегламентноеЗадание - регламентное задание, уникальный идентификатор которого используется +// для определения удаляемого экземпляра регламентного задания в локальном режиме работы. +// - СправочникСсылка.ОчередьЗаданий +// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания очереди в модели сервиса. +// - СтрокаТаблицыЗначений: см. НайтиЗадания // Процедура УдалитьЗадание(Знач Идентификатор) Экспорт @@ -387,19 +382,9 @@ Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда ИмяМетода = Идентификатор.ИмяМетода; ПараметрыЗадания.Вставить("ИмяМетода", ИмяМетода); + ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СправочникДляЗадания = МодульОчередьЗаданий.СправочникОчередьЗаданий(); - - Если МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийРазделениеДанных"); - ПереопределенныйСправочник = МодульОчередьЗаданийРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); - Если ПереопределенныйСправочник <> Неопределено Тогда - СправочникДляЗадания = ПереопределенныйСправочник; - КонецЕсли; - КонецЕсли; - - ПараметрыЗадания.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(Идентификатор)); + ПараметрыЗадания.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда @@ -456,22 +441,37 @@ КонецПроцедуры // Изменяет задание с указанным идентификатором. -// В случае вызова в транзакции на задание устанавливается объектная блокировка. +// +// В модели сервиса (разделение включено): +// - в случае вызова в транзакции на задание устанавливается объектная блокировка, +// - если задание создано на основе шаблона или предопределенное, может быть указано +// только свойство Использование в параметре Параметры. Расписание в этом случае, +// изменять нельзя, т.к. оно хранится централизованно в неразделенном Шаблоне задания, +// отдельно для каждой области оно не сохраняется. // // Параметры: -// Идентификатор - СправочникСсылка.ОчередьЗаданий -// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания -// Параметры - Структура - параметры, которые следует установить заданию, возможные ключи: -// * Использование -// * Параметры -// * Ключ -// * ИнтервалПовтораПриАварийномЗавершении -// * Расписание -// * КоличествоПовторовПриАварийномЗавершении +// Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска +// непредопределенного регламентного задания. +// - Строка - имя метаданных предопределенного регламентного задания в любом режиме работы +// или строка уникального идентификатора регламентного задания в локальном режиме работы +// или строка уникального идентификатора ссылки задания очереди в модели сервиса. +// - УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы +// или идентификатор ссылки задания очереди в модели сервиса. +// - РегламентноеЗадание - регламентное задание в локальном режиме работы. +// - СправочникСсылка.ОчередьЗаданий +// - СправочникСсылка.ОчередьЗаданийОбластейДанных - идентификатор задания очереди в модели сервиса. +// - СтрокаТаблицыЗначений: см. НайтиЗадания +// +// Параметры - Структура - параметры, которые следует установить заданию, возможные свойства: +// * Использование - Булево - Истина, если регламентное задание должно выполняться автоматически согласно расписанию. +// * Параметры - Массив - параметры регламентного задания. Количество и состав параметров должны соответствовать +// параметрам метода регламентного задания. +// * Ключ - Строка - прикладной идентификатор регламентного задания. +// * ИнтервалПовтораПриАварийномЗавершении - Число - интервал в секундах, через который нужно перезапускать задание +// в случае его аварийного завершения. +// * Расписание - РасписаниеРегламентногоЗадания - расписание задания. +// * КоличествоПовторовПриАварийномЗавершении - Число - количество повторов при аварийном завершении задания. // -// В случае если задание создано на основе шаблона или предопределенное, могут быть указаны -// только следующие ключи: Использование. -// Процедура ИзменитьЗадание(Знач Идентификатор, Знач Параметры) Экспорт ВызватьИсключениеЕслиНетПраваАдминистрирования(); @@ -534,17 +534,7 @@ КонецЕсли; ИначеЕсли ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); - СправочникДляЗадания = МодульОчередьЗаданий.СправочникОчередьЗаданий(); - Если МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийРазделениеДанных"); - ПереопределенныйСправочник = МодульОчередьЗаданийРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыПоиска); - Если ПереопределенныйСправочник <> Неопределено Тогда - СправочникДляЗадания = ПереопределенныйСправочник; - КонецЕсли; - КонецЕсли; - - ПараметрыПоиска.Вставить("Идентификатор", СправочникДляЗадания.ПолучитьСсылку(Идентификатор)); + ПараметрыПоиска.Вставить("Идентификатор", СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания)); ИначеЕсли ТипЗнч(Идентификатор) = Тип("СтрокаТаблицыЗначений") Тогда @@ -632,17 +622,20 @@ КонецПроцедуры // Возвращает уникальный идентификатор регламентного задания. -// Перед вызовом требуется иметь право администрирования или УстановитьПривилегированныйРежим. +// Для вызова требуются права администрирования или УстановитьПривилегированныйРежим. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска -// регламентного задания. -// - УникальныйИдентификатор - идентификатор регламентного задания. -// - Строка - строка уникального идентификатора регламентного задания. +// регламентного задания. +// - Строка - строка уникального идентификатора регламентного задания +// или идентификатора ссылки задания очереди в модели сервиса. +// - УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы +// или идентификатор ссылки задания очереди в модели сервиса. // - РегламентноеЗадание - регламентное задание. // // Возвращаемое значение: -// УникальныйИдентификатор - УИ объекта регламентного задания. +// УникальныйИдентификатор - идентификатор регламентного задания в локальном режиме работы +// или идентификатор ссылки задания очереди в модели сервиса. // Функция УникальныйИдентификатор(Знач Идентификатор) Экспорт @@ -651,11 +644,13 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции без поддержки модели сервиса. +// Процедуры и функции без поддержки заданий очереди в модели сервиса. // Возвращает использование регламентного задания. // Перед вызовом требуется иметь право администрирования или УстановитьПривилегированныйРежим. -// Не предназначена для использования в модели сервиса. +// +// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди, +// одинаково как в разделенном, так и в неразделенном режимах. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -665,7 +660,7 @@ // - РегламентноеЗадание - регламентное задание. // // Возвращаемое значение: -// Булево - если Истина, регламентное задание используется. +// Булево - Истина, если регламентное задание используется. // Функция РегламентноеЗаданиеИспользуется(Знач Идентификатор) Экспорт @@ -679,7 +674,9 @@ // Возвращает расписание регламентного задания. // Перед вызовом требуется иметь право администрирования или УстановитьПривилегированныйРежим. -// Не предназначена для использования в модели сервиса. +// +// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди, +// одинаково как в разделенном, так и в неразделенном режимах. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -710,7 +707,9 @@ // Устанавливает использование регламентного задания. // Перед вызовом требуется иметь право администрирования или УстановитьПривилегированныйРежим. -// Не предназначена для использования в модели сервиса. +// +// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди, +// одинаково как в разделенном, так и в неразделенном режимах. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -750,7 +749,9 @@ // Устанавливает расписание регламентного задания. // Перед вызовом требуется иметь право администрирования или УстановитьПривилегированныйРежим. -// Не предназначена для использования в модели сервиса. +// +// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди, +// одинаково как в разделенном, так и в неразделенном режимах. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -794,7 +795,9 @@ КонецПроцедуры // Возвращает РегламентноеЗадание из информационной базы. -// Не предназначена для использования в модели сервиса. +// +// В модели сервиса работает с регламентными заданиями платформы, а не с заданиями очереди, +// одинаково как в разделенном, так и в неразделенном режимах. // // Параметры: // Идентификатор - ОбъектМетаданных - объект метаданных регламентного задания для поиска @@ -884,7 +887,7 @@ // может быть изменено только значение свойства Использование. // // Параметры: -// РегламентноеЗадание - ОбъектМетаданных: РегламентноеЗадание - задание, свойства которого +// РегламентноеЗадание - ОбъектМетаданныхРегламентноеЗадание - задание, свойства которого // требуется изменить. // ИзменяемыеПараметры - Структура - свойства регламентного задания, которые требуется изменить. // Ключ структуры - имя параметра, а значение - значение параметра формы. @@ -984,6 +987,7 @@ ТекстДляЖурнала); ТекущийСеанс.Отменить(); + ТекущийСеанс.ОжидатьЗавершенияВыполнения(1); КонецПроцедуры @@ -1076,7 +1080,11 @@ Возврат; КонецЕсли; - Если Задание[ИмяСвойства] = ПараметрыЗадания[ИмяСвойства] Тогда + Если Задание[ИмяСвойства] = ПараметрыЗадания[ИмяСвойства] + Или ТипЗнч(Задание[ИмяСвойства]) = Тип("РасписаниеРегламентногоЗадания") + И ТипЗнч(ПараметрыЗадания[ИмяСвойства]) = Тип("РасписаниеРегламентногоЗадания") + И Строка(Задание[ИмяСвойства]) = Строка(ПараметрыЗадания[ИмяСвойства]) Тогда + Возврат; КонецЕсли; @@ -1085,6 +1093,39 @@ КонецПроцедуры +// Для функций НайтиЗадания, Задание, ДобавитьЗадание. +Функция УточненныйСписокЗаданий(СписокЗаданий) + + // Для обратной совместимости поле Идентификатор не удаляется. + КопияСписка = СписокЗаданий.Скопировать(); + КопияСписка.Колонки.Добавить("УникальныйИдентификатор"); + Для Каждого Строка Из КопияСписка Цикл + Строка.УникальныйИдентификатор = Строка.Идентификатор; + КонецЦикла; + + Возврат КопияСписка; + +КонецФункции + +// Для функций НайтиЗадание, Задание, УдалитьЗадание, ИзменитьЗадание. +Функция СсылкаЗаданияОчереди(Идентификатор, ПараметрыЗадания) + + МодульОчередьЗаданий = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданий"); + СправочникДляЗадания = МодульОчередьЗаданий.СправочникОчередьЗаданий(); + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Если МодульРаботаВМоделиСервиса.ЭтоРазделеннаяКонфигурация() Тогда + МодульОчередьЗаданийРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийРазделениеДанных"); + ПереопределенныйСправочник = МодульОчередьЗаданийРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); + Если ПереопределенныйСправочник <> Неопределено Тогда + СправочникДляЗадания = ПереопределенныйСправочник; + КонецЕсли; + КонецЕсли; + + Возврат СправочникДляЗадания.ПолучитьСсылку(Идентификатор); + +КонецФункции + // Вызывает исключение, если у пользователя нет права администрирования. Процедура ВызватьИсключениеЕслиНетПраваАдминистрирования() diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index 8e824fc40..25708769e 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -11,7 +11,7 @@ // Проверяет, включено ли регламентное задание по функциональным опциям. // // Параметры: -// Задание - ОбъектМетаданных: РегламентноеЗадание - регламентное задание. +// Задание - ОбъектМетаданныхРегламентноеЗадание - регламентное задание. // ЗависимостиЗаданий - ТаблицаЗначений - таблица зависимостей регламентных // заданий, полученная методом РегламентныеЗаданияСлужебный.РегламентныеЗаданияЗависимыеОтФункциональныхОпций. // Если не указано, получается автоматически. @@ -235,10 +235,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -656,7 +652,7 @@ // Наименование, ИмяМетода, РегламентноеЗадание. // // Возвращаемое значение: -// ТаблицаЗначений - возвращается таблица после отбора. +// см. НовыеСвойстваФоновыхЗаданий // Функция СвойстваФоновыхЗаданий(Отбор = Неопределено) Экспорт @@ -847,7 +843,7 @@ // - Строка - строка уникального идентификатора РегламентногоЗадания. // // Возвращаемое значение: -// СтрокаТаблицыЗначений - с колонками: +// СтрокаТаблицыЗначений: // * Идентификатор - Строка // * Наименование - Строка // * Ключ - Строка @@ -1103,11 +1099,11 @@ КонецПроцедуры // Параметры: -// МассивФоновыхЗаданий - Массив из ФоновоеЗадание -// ПоследнееФоновоеЗадание - ФоновоеЗадание -// - Неопределено +// МассивФоновыхЗаданий - Массив из ФоновоеЗадание +// ПоследнееФоновоеЗадание - ФоновоеЗадание +// - Неопределено // Возвращаемое значение: -// ФоновоеЗадание, Неопределено +// ФоновоеЗадание, Неопределено // Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl index a5741ffa2..9c4720c03 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl @@ -143,9 +143,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Экспортные служебные процедуры и функции. - // Проверяет необходимость запуска автоматического резервного копирования // в процессе работы пользователя, а также повторного оповещения после игнорировании первоначального. // @@ -178,7 +175,8 @@ // Проверяет необходимость проведения автоматического резервного копирования. // -// Возвращаемое значение - Булево - Истина, если необходима, Ложь - иначе. +// Возвращаемое значение: +// Булево - Истина, если необходима, Ложь - иначе. // Функция НеобходимостьАвтоматическогоРезервногоКопирования() @@ -243,7 +241,7 @@ // Если да - выводит форму обработчика с результатами резервного копирования. // // Параметры: -// Параметры - Структура - параметры резервного копирования. +// Параметры - Структура - параметры резервного копирования. // Процедура ПроверитьРезервноеКопированиеИБ(Параметры) @@ -299,7 +297,8 @@ // Возвращает тип события журнала регистрации для данной подсистемы. // -// Возвращаемое значение - Строка - тип события журнала регистрации. +// Возвращаемое значение: +// Строка - тип события журнала регистрации. // Функция СобытиеЖурналаРегистрации() Экспорт @@ -521,7 +520,8 @@ // Возвращает параметры скрипта резервного копирования. // -// Возвращаемое значение - Структура - структура скрипта резервного копирования. +// Возвращаемое значение: +// Структура - структура скрипта резервного копирования. // Функция КлиентскиеПараметрыРезервногоКопирования() Экспорт @@ -557,4 +557,28 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * КаталогПрограммы - Строка +// * ИмяФайлаПрограммы - Строка +// * СобытиеЖурналаРегистрации - Строка +// * ИмяCOMСоединителя - Строка +// * ЭтоБазоваяВерсияКонфигурации - Строка +// * ПараметрыСкрипта - Строка +// * ПараметрыЗапускаПредприятия - Строка +// +Функция ОбщиеПараметрыСкрипта() Экспорт + + ПараметрыСкрипта = Новый Структура; + ПараметрыСкрипта.Вставить("КаталогПрограммы" , ""); + ПараметрыСкрипта.Вставить("ИмяФайлаПрограммы" , ""); + ПараметрыСкрипта.Вставить("СобытиеЖурналаРегистрации" , ""); + ПараметрыСкрипта.Вставить("ИмяCOMСоединителя" , ""); + ПараметрыСкрипта.Вставить("ЭтоБазоваяВерсияКонфигурации", ""); + ПараметрыСкрипта.Вставить("ПараметрыСкрипта" , ""); + ПараметрыСкрипта.Вставить("ПараметрыЗапускаПредприятия" , ""); + Возврат ПараметрыСкрипта; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl index 226e48061..b3e09cca2 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl @@ -79,28 +79,8 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - ТаблицаЗначений - определяет параметры дела: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый подсистемой. -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * ВыводитьВОповещениях - Булево - если Истина, уведомление о деле будет дублироваться всплывающим -// оповещением и отображением в центре оповещений. -// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. -// Можно применять для дел, которые не предполагают многократного -// использования, т.е. после выполнения они для данной информационной базы -// больше отображаться не будут. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка -// - объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -199,7 +179,7 @@ // пользователей. // // Возвращаемое значение: -// Структура - параметры. +// Структура - параметры. // Функция ПараметрыПриЗавершенииРаботы() @@ -249,7 +229,8 @@ // Возвращает сохраненные параметры резервного копирования. // -// Возвращаемое значение - Структура - параметры резервного копирования. +// Возвращаемое значение: +// Структура - параметры резервного копирования. // Функция ПараметрыРезервногоКопирования() Экспорт @@ -265,7 +246,7 @@ КонецФункции // Параметры: -// ПараметрыРезервногоКопирования - Структура - параметры резервного копирования ИБ. +// ПараметрыРезервногоКопирования - Структура - параметры резервного копирования ИБ. // Процедура ДополнитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования) @@ -343,7 +324,7 @@ КонецПроцедуры // Параметры: -// ДатаНапоминания - Дата - дата и время последнего оповещения пользователя о необходимости проведения резервного +// ДатаНапоминания - Дата - дата и время последнего оповещения пользователя о необходимости проведения резервного // копирования. // Процедура УстановитьДатуПоследнегоНапоминания(ДатаНапоминания) Экспорт @@ -355,8 +336,8 @@ КонецПроцедуры // Параметры: -// ИмяЭлемента - Строка - имя параметра. -// ЗначениеЭлемента - Произвольный - значение параметра. +// ИмяЭлемента - Строка - имя параметра. +// ЗначениеЭлемента - Произвольный - значение параметра. // Процедура УстановитьЗначениеНастройки(ИмяЭлемента, ЗначениеЭлемента) Экспорт @@ -367,7 +348,7 @@ КонецПроцедуры // Параметры: -// НачалоРаботы - Булево - признак вызова при начале работы программы. +// НачалоРаботы - Булево - признак вызова при начале работы программы. // // Возвращаемое значение: // Структура - параметры резервного копирования. @@ -468,8 +449,8 @@ // Вызывается из скрипта через COM-соединение. // // Параметры: -// Результат - Булево - результат копирования. -// ИмяФайлаРезервнойКопии - Строка - имя файла резервной копии. +// Результат - Булево - результат копирования. +// ИмяФайлаРезервнойКопии - Строка - имя файла резервной копии. // Процедура ЗавершитьРезервноеКопирование(Результат, ИмяФайлаРезервнойКопии = "") Экспорт @@ -485,7 +466,7 @@ // Вызывается из скрипта через COM-соединение. // // Параметры: -// Результат - Булево - результат восстановления. +// Результат - Булево - результат восстановления. // Процедура ЗавершитьВосстановление(Результат) Экспорт @@ -506,6 +487,9 @@ КонецФункции +// Параметры: +// ПараметрыСкрипта - см. РезервноеКопированиеИБКлиент.ОбщиеПараметрыСкрипта. +// Функция ПодготовитьОбщиеПараметрыСкрипта(Знач ПараметрыСкрипта) Экспорт ПараметрыПодключения = ПараметрыСкрипта.ПараметрыСкрипта; @@ -515,11 +499,7 @@ СтрокаСоединенияИнформационнойБазы = Лев(СтрокаСоединенияИнформационнойБазы, СтрДлина(СтрокаСоединенияИнформационнойБазы) - 1); КонецЕсли; - КаталогПрограммы = ""; - ПараметрыСкрипта.Свойство("КаталогПрограммы", КаталогПрограммы); - Если ПустаяСтрока(КаталогПрограммы) Тогда - КаталогПрограммы = КаталогПрограммы(); - КонецЕсли; + КаталогПрограммы = ?(ПустаяСтрока(ПараметрыСкрипта.КаталогПрограммы), КаталогПрограммы(), ПараметрыСкрипта.КаталогПрограммы); ИмяИсполняемогоФайлаПрограммы = КаталогПрограммы + ПараметрыСкрипта.ИмяФайлаПрограммы; // Определение пути к информационной базе. diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl index 7c1841682..9197d9c40 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектов/Module.bsl @@ -11,21 +11,21 @@ // Определяет форму ФИО в заданном падеже. // // Параметры: -// ФИО - Строка - строка, в которой содержится ФИО для склонения. -// Падеж - Число - падеж, в который необходимо просклонять представление объекта. +// ФИО - Строка - строка, в которой содержится ФИО для склонения. +// Падеж - Число - падеж, в который необходимо просклонять представление объекта. // 1 - Именительный. // 2 - Родительный. // 3 - Дательный. // 4 - Винительный. // 5 - Творительный. // 6 - Предложный. -// Объект - ОбъектСклонения - ссылка на объект, реквизит которого склоняется. -// Пол - Число - число - пол физического лица, +// Объект - ОбъектСклонения - ссылка на объект, реквизит которого склоняется. +// Пол - Число - число - пол физического лица, // 1 - мужской, // 2 - женский. // // Возвращаемое значение: -// Строка - результат склонения ФИО в падеже. +// Строка - результат склонения ФИО в падеже. // Функция ПросклонятьФИО(ФИО, Падеж, Объект = Неопределено, Пол = Неопределено) Экспорт @@ -40,8 +40,8 @@ // Склоняет представление объекта. // // Параметры: -// Представление - Строка - строка, в которой содержится ФИО для склонения. -// Падеж - Число - падеж, в который необходимо просклонять представление объекта. +// Представление - Строка - строка, в которой содержится ФИО для склонения. +// Падеж - Число - падеж, в который необходимо просклонять представление объекта. // 1 - Именительный. // 2 - Родительный. // 3 - Дательный. @@ -127,7 +127,7 @@ // Определяет доступен ли сервис склонения. // // Возвращаемое значение: -// Булево - Истина, если веб-сервис склонения доступен. +// Булево - Истина, если веб-сервис склонения доступен. // Функция ДоступенСервисСклонения() Экспорт @@ -151,7 +151,7 @@ // Представление - Строка - строка для склонения. // Объект - ОбъектСклонения - объект для склонения. // ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО) +// Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской // 2 - женский. // @@ -208,9 +208,9 @@ // Только для работы на ОС Windows. // // Параметры: -// Объект - ОпределяемыйТип.ОбъектСклонения - ссылка на объект, в котором содержится реквизит для склонения. -// ВидПредставления - Строка - имя реквизита объекта для склонения. -// Падеж - Число - падеж, в который необходимо просклонять представление объекта. +// Объект - ОпределяемыйТип.ОбъектСклонения - ссылка на объект, в котором содержится реквизит для склонения. +// ВидПредставления - Строка - имя реквизита объекта для склонения. +// Падеж - Число - падеж, в который необходимо просклонять представление объекта. // 1 - Именительный. // 2 - Родительный. // 3 - Дательный. @@ -219,7 +219,7 @@ // 6 - Предложный. // // Возвращаемое значение: -// Строка - результат склонения представления объекта в падеже. +// Строка - результат склонения представления объекта в падеже. // Функция Просклонять(Представление, Падеж, Объект = Неопределено, ПараметрыСклонения = Неопределено) @@ -251,17 +251,17 @@ // Параметры: // Представление - Строка - строка для склонения. // ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО): 1 - мужской, 2 - женский. +// Пол - Число - пол физического лица (в случае склонения ФИО): 1 - мужской, 2 - женский. // ПоказыватьСообщения - Булево - признак, определяющий нужно ли показывать пользователю сообщения об ошибках. // // Возвращаемое значение: -// Структура: -// * Именительный - Строка. -// * Родительный - Строка. -// * Дательный - Строка. -// * Винительный - Строка. -// * Творительный - Строка. -// * Предложный - Строка. +// Структура: +// * Именительный - Строка. +// * Родительный - Строка. +// * Дательный - Строка. +// * Винительный - Строка. +// * Творительный - Строка. +// * Предложный - Строка. // Функция ПросклонятьПредставлениеПоВсемПадежам(Представление, ПараметрыСклонения = Неопределено, ПоказыватьСообщения = Ложь) @@ -281,8 +281,8 @@ // // Параметры: // Представление - Строка - строка для склонения. -// ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО) +// ЭтоФИО - Булево - признак склонения ФИО. +// Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской // 2 - женский. // ПараметрыСклонения diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl index 89085f719..9567fb521 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиент/Module.bsl @@ -70,7 +70,7 @@ // Форма - ФормаКлиентскогоПриложения - форма объекта склонения. // Представление - Строка - строка для склонения. // ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО) +// Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской // 2 - женский. // ПоказыватьСообщения - Булево - признак, определяющий нужно ли показывать пользователю сообщения об ошибках. @@ -92,7 +92,7 @@ // Форма - ФормаКлиентскогоПриложения - форма объекта склонения. // Представление - Строка - строка для склонения. // ЭтоФИО - Булево - признак склонения ФИО. -// Пол - Число - пол физического лица (в случае склонения ФИО) +// Пол - Число - пол физического лица (в случае склонения ФИО) // 1 - мужской // 2 - женский. // diff --git a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl index a501f0ff7..4c3accba8 100644 --- a/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СклонениеПредставленийОбъектовКлиентСервер/Module.bsl @@ -34,13 +34,13 @@ // Возвращает пустую структуру склонения. // // Возвращаемое значение: -// Структура: -// *ИменительныйПадеж - Строка. -// *РодительныйПадеж - Строка. -// *ДательныйПадеж - Строка -// *ВинительныйПадеж - Строка. -// *ТворительныйПадеж - Строка. -// *ПредложныйПадеж - Строка. +// Структура: +// *ИменительныйПадеж - Строка. +// *РодительныйПадеж - Строка. +// *ДательныйПадеж - Строка +// *ВинительныйПадеж - Строка. +// *ТворительныйПадеж - Строка. +// *ПредложныйПадеж - Строка. // Функция СтруктураСклонения() Экспорт diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl index dfe2d4d15..1085515ca 100644 --- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -200,11 +200,11 @@ // // Возвращаемое значение: // Структура: -// Начало - Дата - время начала действия блокировки. -// Конец - Дата - время завершения действия блокировки. -// Сообщение - Строка - сообщения для пользователей, выполняющих вход в заблокированную область данных. -// Установлена - Булево - признак того, что блокировка установлена. -// Эксклюзивная - Булево - блокировка не может быть изменена администратором приложения. +// * Начало - Дата - время начала действия блокировки. +// * Конец - Дата - время завершения действия блокировки. +// * Сообщение - Строка - сообщения для пользователей, выполняющих вход в заблокированную область данных. +// * Установлена - Булево - признак того, что блокировка установлена. +// * Эксклюзивная - Булево - блокировка не может быть изменена администратором приложения. // Функция НовыеПараметрыБлокировкиСоединений() Экспорт @@ -358,7 +358,7 @@ // Названия соединений разделены символом переноса строки. // // Параметры: -// Сообщение - Строка - передаваемая строка. +// Сообщение - Строка - передаваемая строка. // // Возвращаемое значение: // Строка - названия соединений. @@ -533,37 +533,15 @@ КонецПроцедуры -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// +// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.РегистрыСведений.БлокировкиСеансовОбластейДанных); КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - ТаблицаЗначений - определяет параметры дела: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый подсистемой. -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * ВыводитьВОповещениях - Булево - если Истина, уведомление о деле будет дублироваться всплывающим -// оповещением и отображением в центре оповещений. -// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. -// Можно применять для дел, которые не предполагают многократного -// использования, т.е. после выполнения они для данной информационной базы -// больше отображаться не будут. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка -// - объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -640,7 +618,7 @@ // Возвращает текст сообщения блокировки сеансов. // // Параметры: -// Сообщение - Строка - сообщение для блокировки. +// Сообщение - Строка - сообщение для блокировки. // КодРазрешения - Строка - код разрешения для входа в информационную базу. // // Возвращаемое значение: @@ -692,6 +670,10 @@ // См. описание в функции ПараметрыБлокировкиСеансов. // +// Параметры: +// ПолучитьКоличествоСеансов - Булево +// ПараметрыБлокировки - см. ТекущиеПараметрыБлокировкиСоединений +// Функция ПараметрыБлокировкиСеансовРасширенные(Знач ПолучитьКоличествоСеансов, ПараметрыБлокировки) Если ПараметрыБлокировки.УстановленаБлокировкаСоединенийИБНаДату Тогда @@ -722,10 +704,16 @@ КонецФункции +// Возвращаемое значение: +// Структура: +// * УстановленаБлокировкаСоединенийИБНаДату - Булево +// * ТекущийРежимОбластиДанных - см. НовыеПараметрыБлокировкиСоединений +// * ТекущийРежимИБ - см. НовыеПараметрыБлокировкиСоединений +// * ТекущаяДата - Дата +// Функция ТекущиеПараметрыБлокировкиСоединений() - // ТекущаяДатаСеанса не используется, т.к. блокировка устанавливается в часовом поясе сервера. - ТекущаяДата = ТекущаяДата(); + ТекущаяДата = ТекущаяДата(); // АПК:143 ТекущаяДатаСеанса не используется, т.к. блокировка в часовом поясе сервера. УстановитьПривилегированныйРежим(Истина); ТекущийРежимИБ = ПолучитьБлокировкуСеансов(); diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl index 623b5d838..2b1eb313b 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -11,15 +11,15 @@ // Открывает форму ввода параметров администрирования информационной базы и/или кластера. // // Параметры: -// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - обработчик, который будет вызван после ввода параметров +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - обработчик, который будет вызван после ввода параметров // администрирования. -// ЗапрашиватьПараметрыАдминистрированияИБ - Булево - признак необходимости ввода параметров администрирования +// ЗапрашиватьПараметрыАдминистрированияИБ - Булево - признак необходимости ввода параметров администрирования // информационной базы. -// ЗапрашиватьПараметрыАдминистрированияКластера - Булево - признак необходимости ввода параметров администрирования +// ЗапрашиватьПараметрыАдминистрированияКластера - Булево - признак необходимости ввода параметров администрирования // кластера. -// ПараметрыАдминистрирования - см. СтандартныеПодсистемыСервер.ПараметрыАдминистрирования. -// Заголовок - Строка - заголовок формы, описывающий для чего запрашиваются параметры администрирования. -// ПоясняющаяНадпись - Строка - пояснение для выполняемого действия, в контексте которого запрашиваются параметры. +// ПараметрыАдминистрирования - см. СтандартныеПодсистемыСервер.ПараметрыАдминистрирования. +// Заголовок - Строка - заголовок формы, описывающий для чего запрашиваются параметры администрирования. +// ПоясняющаяНадпись - Строка - пояснение для выполняемого действия, в контексте которого запрашиваются параметры. // Процедура ПоказатьПараметрыАдминистрирования(ОписаниеОповещенияОЗакрытии, ЗапрашиватьПараметрыАдминистрированияИБ, ЗапрашиватьПараметрыАдминистрированияКластера, ПараметрыАдминистрирования = Неопределено, diff --git a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl index f15a36677..a4d846ceb 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl @@ -86,7 +86,7 @@ // Используется в целях локализации. // // Возвращаемое значение: -// Строка - текст для администратора. +// Строка - текст для администратора. // Функция ТекстДляАдминистратора() Экспорт @@ -97,10 +97,10 @@ // Возвращает пользовательский текст сообщения блокировки сеансов. // // Параметры: -// Сообщение - Строка - полное сообщение. +// Сообщение - Строка - полное сообщение. // // Возвращаемое значение: -// Строка - сообщение блокировки. +// Строка - сообщение блокировки. // Функция ИзвлечьСообщениеБлокировки(Знач Сообщение) Экспорт diff --git a/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl b/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl index fe9849e4f..70bc24090 100644 --- a/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБПереопределяемый/Module.bsl @@ -11,7 +11,7 @@ // Позволяет модифицировать параметры блокировки сеансов. // // Параметры: -// ПараметрыБлокировкиСеансов - см. СоединенияИБ.ПараметрыБлокировкиСеансов +// ПараметрыБлокировкиСеансов - см. СоединенияИБ.ПараметрыБлокировкиСеансов // Процедура ПриОпределенииПараметровБлокировкиСеансов(ПараметрыБлокировкиСеансов) Экспорт diff --git a/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl b/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl index 0294b20c7..1ed5faf9f 100644 --- a/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl +++ b/SSL/src/CommonModules/СозданиеНаОсновании/Module.bsl @@ -73,10 +73,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт КомандыСозданияНаОсновании = Команды.СкопироватьКолонки(); @@ -262,6 +262,10 @@ КонецПроцедуры +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ДинамическоеПодменюСозданияНаОсновании - см. ПодключаемыеКоманды.ЗарегистрироватьПодменю +// Процедура СкрытьСтандартноеПодменюВводаНаОсновании(Форма, ДинамическоеПодменюСозданияНаОсновании) ПодменюСоздатьНаОсновании = Форма.Элементы.Найти("ФормаСоздатьНаОсновании"); diff --git a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl index 9391dc6f2..95d551d62 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДОИООбработчикСообщения_1_0_1_2/Module.bsl @@ -115,7 +115,6 @@ ИначеЕсли Assignment.Тип() = ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс.ТипНазначениеСправочникамИДокументам(ПакетМанифеста()) Тогда Для Каждого AssignmentObject Из Assignment.Objects Цикл - СтрокаНазначения = НастройкиНазначения.Добавить(); ОбъектНазначения = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(AssignmentObject.ObjectName, Ложь); СтрокаРаздела.ОбъектНазначения = ?(ЗначениеЗаполнено(ОбъектНазначения), ОбъектНазначения, Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка()); КонецЦикла; diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl index 341119e9b..fc6477b54 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl @@ -178,10 +178,14 @@ Или ВходВОбластьДанных И Не ПравоДоступа("АдминистрированиеДанных", Метаданные) Тогда - ВызватьИсключение НСтр("ru = 'Недостаточно прав для работы с отключенной логикой работы системы.'"); + ТекстОшибки = НСтр("ru = 'Недостаточно прав для работы с отключенной логикой начала работы системы.'"); + Иначе + ТекстОшибки = ПользователиСлужебный.ОшибкаПроверкиПравТекущегоПользователяПриВходе(); КонецЕсли; - ПользователиСлужебный.ПроверитьПраваТекущегоПользователяПриВходе(); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + СвойстваКлиента.Вставить("ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы", ТекстОшибки); + КонецЕсли; КонецПроцедуры @@ -218,6 +222,7 @@ Или Справочники.ВерсииРасширений.РасширенияИзмененыДинамически()); ДинамическиеИзменения = Справочники.ВерсииРасширений.ДинамическиИзмененныеРасширения(); + МожноОповещать = Истина; Если ДинамическиеИзменения.Исправления <> Неопределено И ДинамическиеИзменения.Расширения = Неопределено diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl index 4939036fb..ff20dc2f4 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl @@ -71,19 +71,15 @@ // ДополнительныеПараметры - Структура // ТекстВопроса - Строка - текст задаваемого вопроса. // Кнопки - РежимДиалогаВопрос -// - СписокЗначений - может быть задан список значений, в котором: -// Значение - содержит значение, связанное с -// кнопкой и возвращаемое при выборе кнопки. В качестве значения может -// использоваться значение +// - СписокЗначений - может быть задан список значений, в котором: +// Значение - содержит значение, связанное с кнопкой и возвращаемое при +// ее нажатии. В качестве значения может использоваться значение // перечисления КодВозвратаДиалога, а также другие значения, // поддерживающее XDTO-сериализацию. -// Представление - задает текст кнопки. +// Представление - текст кнопки. // // ДополнительныеПараметры - см. СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю. // -// Возвращаемое значение: -// Результат выбора пользователя будет передан в метод, описанный параметром ОписаниеОповещенияОЗавершении. -// Процедура ПоказатьВопросПользователю(ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки, ДополнительныеПараметры = Неопределено) Экспорт Параметры = ПараметрыВопросаПользователю(); @@ -277,14 +273,20 @@ Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда Попытка - // Проверка права и заполнение параметров работы клиента на сервере. + // Проверка права отключения и заполнение параметров работы клиента на сервере. СвойстваКлиента = Новый Структура; ЗаполнитьПараметрыРаботыКлиентаНаСервере(СвойстваКлиента); СтандартныеПодсистемыВызовСервера.ПроверитьПравоОтключитьЛогикуНачалаРаботыСистемы(СвойстваКлиента); + Если СвойстваКлиента.Свойство("ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы") Тогда + ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( + Параметры, СвойстваКлиента.ОшибкаНетПраваОтключитьЛогикуНачалаРаботыСистемы); + КонецЕсли; Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + СтандартныеПодсистемыВызовСервера.ЗаписатьОшибкуВЖурналРегистрацииПриЗапускеИлиЗавершении( + Ложь, "Запуск", ТекстОшибки); ПользователиСлужебныйКлиент.УстановитьИнтерактивнуюОбработкуПриОшибкеНедостаточноПравДляВходаВПрограмму( - Параметры, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + Параметры, ТекстОшибки); КонецПопытки; Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда Возврат; @@ -397,45 +399,11 @@ // Процедура ПередЗавершениемРаботыСистемы(Отказ = Ложь, ТекстПредупреждения = "") Экспорт - Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда + Если Не ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Отказ) Тогда Возврат; КонецЕсли; - - ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; - - Если ПараметрыПриЗапускеПрограммы.Свойство("СкрытьРабочийСтолПриНачалеРаботыСистемы") Тогда - // Произошла попытка закрытия до окончания запуска. - #Если ВебКлиент Тогда - // В веб-клиенте это возможно в штатном случае (при закрытии страницы в целом), - // поэтому закрытие блокируется, так как его все равно можно выполнить принудительно, - // а в случае случайного закрытия у пользователя должна быть возможность остаться на странице. - Отказ = Истина; - #Иначе - // Не в веб-клиенте это возможно в случае ошибок в немодальной последовательности запуска. - // То есть нет ни одного окна блокирующего весь интерфейс. Закрытие нужно разрешить, - // но без стандартных процедур перед завершение работы системы, так как они могут - // привести к ошибке в процессе закрытия из-за незавершенного запуска. - #КонецЕсли - Возврат; - КонецЕсли; - - // В режиме работы толстый клиент (обычное приложение) не выводится список предупреждений. -#Если ТолстыйКлиентОбычноеПриложение Тогда - Возврат; -#КонецЕсли - - Если ПараметрыПриложения["СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы"] = Истина Тогда - Возврат; - КонецЕсли; - - Если Не ПараметрКлиента("ДоступноИспользованиеРазделенныхДанных") Тогда - Возврат; - КонецЕсли; - - Предупреждения = Новый Массив; - ИнтеграцияПодсистемБСПКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); - ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); - + + Предупреждения = ПредупрежденияПередЗавершениемРаботыСистемы(Отказ); Если Предупреждения.Количество() = 0 Тогда Если Не ПараметрКлиента("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы") Тогда Возврат; @@ -678,6 +646,9 @@ // Возвращает имя исполняемого файла в зависимости от вида клиента. // +// Возвращаемое значение: +// Строка +// Функция ИмяИсполняемогоФайлаПриложения(ПолучитьИмяФайлаКонфигуратора = Ложь) Экспорт ШаблонИмениФайла = "1cv8[УчебнаяПлатформа].exe"; @@ -747,6 +718,10 @@ КонецФункции // Проверяет, выполнено ли опасное отключение процедур запуска для целей автоматического тестирования. +// +// Возвращаемое значение: +// Булево +// Функция ОтключенаЛогикаНачалаРаботыСистемы() Экспорт Возврат СтрНайти(ПараметрЗапуска, "ОтключитьЛогикуНачалаРаботыСистемы") > 0; КонецФункции @@ -756,7 +731,7 @@ // Возвращаемое значение: // Структура: // * Ключ - Строка - имя элемента стиля. -// * Значение - ОбъектМетаданных: ЭлементСтиля - элемент стиля. +// * Значение - ОбъектМетаданныхЭлементСтиля. // Функция ЭлементыСтиля() Экспорт @@ -777,10 +752,11 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Табличный документ - // Переадресует оповещение без результата на оповещение с результатом. +// +// Возвращаемое значение: +// ОписаниеОповещения +// Функция ОповещениеБезРезультата(ОповещениеСРезультатом) Экспорт Возврат Новый ОписаниеОповещения("ВыполнитьОповещениеСПустымРезультатом", ЭтотОбъект, ОповещениеСРезультатом); @@ -841,7 +817,7 @@ // Ссылка - ЛюбаяСсылка - объект, который необходимо показать в списке. // ИмяФормыСписка - Строка - имя формы списка. // Если передать Неопределено то будет определена автоматически (потребуется вызов сервера). -// ПараметрыФормы - Структура - необязательный. Дополнительные параметры открытия формы списка. +// ПараметрыФормы - Структура - дополнительные параметры открытия формы списка. // Процедура ПоказатьВСписке(Ссылка, ИмяФормыСписка, ПараметрыФормы = Неопределено) Экспорт Если Ссылка = Неопределено Тогда @@ -873,7 +849,7 @@ // Обработчик - ОписаниеОповещения - описание процедуры, которая будет вызвана после завершения показа. // Возвращаемое значение аналогично ПоказатьВопросПользователю(). // Текст - Строка - текст информации. -// Заголовок - Строка - необязательный. Заголовок окна. По умолчанию "Подробнее". +// Заголовок - Строка - заголовок окна. По умолчанию "Подробнее". // Процедура ПоказатьПодробнуюИнформацию(Обработчик, Текст, Заголовок = Неопределено) Экспорт НастройкиДиалога = Новый Структура; @@ -896,6 +872,10 @@ КонецПроцедуры // Шапка файла для технической поддержки. +// +// Возвращаемое значение: +// Строка +// Функция ИнформацияДляПоддержки() Экспорт Текст = НСтр("ru = 'Название программы: [НазваниеПрограммы] @@ -943,6 +923,9 @@ // Каталог системных приложений, например, "C:\Windows\System32". // Используется только в ОС Windows. // +// Возвращаемое значение: +// Строка +// Функция КаталогСистемныхПриложений() Экспорт ОбъектShell = Новый COMОбъект("Shell.Application"); @@ -1450,7 +1433,42 @@ //////////////////////////////////////////////////////////////////////////////// // ПередЗавершениемРаботыСистемы +// Только для внутреннего использования. +// +// Возвращаемое значение: +// Структура: +// Отказ - Булево +// Предупреждения - Массив из см. СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. +// ИнтерактивнаяОбработка - ОписаниеОповещения, Неопределено +// ОбработкаПродолжения - ОписаниеОповещения, Неопределено +// НепрерывноеВыполнение - Булево +// ОбработкаЗавершения - ОписаниеОповещения +// +Функция ПараметрыДействийПередЗавершениемРаботыСистемы() Экспорт + + Параметры = Новый Структура; + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + Параметры.Вставить("Предупреждения", ПараметрКлиента("ПредупрежденияПриЗавершенииРаботы")); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", Истина); + + // Внутренние параметры. + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения", СтандартныеПодсистемыКлиент, Параметры)); + Возврат Параметры; + +КонецФункции + // Только для внутреннего использования. Продолжение процедуры ПередЗавершениемРаботыСистемы. +// +// Параметры: +// Параметры - см. СтандартныеПодсистемыКлиент.ПараметрыДействийПередЗавершениемРаботыСистемы +// Процедура ДействияПередЗавершениемРаботыСистемы(Параметры) Экспорт Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); @@ -1472,6 +1490,11 @@ КонецПроцедуры // Только для внутреннего использования. Завершение процедуры ПередЗавершениемРаботыСистемы. +// +// Параметры: +// Неопределен - Неопределено +// Параметры - см. СтандартныеПодсистемыКлиент.ПараметрыДействийПередЗавершениемРаботыСистемы +// Процедура ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения(Неопределен, Параметры) Экспорт Параметры.ОбработкаПродолжения = Неопределено; @@ -1491,9 +1514,9 @@ // // Параметры: // Неопределен - Неопределено -// ДополнительныеПараметры - Структура: -// * Параметры - Структура -// * ОбработкаПродолжения - ОписаниеОповещения +// ДополнительныеПараметры - Структура: +// * Параметры - см. СтандартныеПодсистемыКлиент.ПараметрыДействийПередЗавершениемРаботыСистемы +// * ОбработкаПродолжения - ОписаниеОповещения // Процедура ДействияПередЗавершениемРаботыСистемыПослеОбработкиОшибки(Неопределен, ДополнительныеПараметры) Экспорт @@ -1677,10 +1700,11 @@ Возврат; КонецЕсли; - Форма = ОткрытьФорму("ОбщаяФорма.РегиональныеНастройки",,,,,, - Новый ОписаниеОповещения("ПослеЗакрытияФормыВыбораНачальныхРегиональныхНастроекИБ", ЭтотОбъект, Параметры)); - - Если Форма = Неопределено Тогда + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("МультиязычностьКлиент"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗакрытияФормыВыбораНачальныхРегиональныхНастроекИБ", ЭтотОбъект, Параметры); + МодульМультиязычностьКлиент.ОткрытьФормуРегиональныхНастроек(ОписаниеОповещения); + Иначе ПослеЗакрытияФормыВыбораНачальныхРегиональныхНастроекИБ(Новый Структура("Отказ", Истина), Параметры); КонецЕсли; @@ -1826,6 +1850,12 @@ ПодключитьОбработчикОжиданияСтандартныхПериодическихПроверок(); + Если ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Ложь) Тогда + // Предварительная компиляция клиентских модулей для избежания неявных серверных вызовов + // в обработчике ПередЗавершениемРаботыСистемы. + ПредупрежденияПередЗавершениемРаботыСистемы(Ложь); + КонецЕсли; + КонецПроцедуры // Вызывается из обработчика ожидания каждые 20 минут, например, для контроля @@ -1900,6 +1930,54 @@ КонецПроцедуры +Функция ВыводитьПредупрежденияПередЗавершениемРаботыСистемы(Отказ) + + Если ОтключенаЛогикаНачалаРаботыСистемы() Тогда + Возврат Ложь; + КонецЕсли; + + ПараметрыПриЗапускеПрограммы = ПараметрыПриложения["СтандартныеПодсистемы.ПараметрыПриЗапускеПрограммы"]; + + Если ПараметрыПриЗапускеПрограммы.Свойство("СкрытьРабочийСтолПриНачалеРаботыСистемы") Тогда + // Произошла попытка закрытия до окончания запуска. + // В веб-клиенте это возможно в штатном случае (при закрытии страницы в целом), + // поэтому закрытие блокируется, так как его все равно можно выполнить принудительно, + // а в случае случайного закрытия у пользователя должна быть возможность остаться на странице. + // Не в веб-клиенте это возможно в случае ошибок в немодальной последовательности запуска. + // То есть нет ни одного окна блокирующего весь интерфейс. Закрытие нужно разрешить, + // но без стандартных процедур перед завершение работы системы, так как они могут + // привести к ошибке в процессе закрытия из-за незавершенного запуска. +#Если Не ВебКлиент Тогда + Отказ = Истина; +#КонецЕсли + Возврат Ложь; + КонецЕсли; + + // В режиме работы толстый клиент (обычное приложение) не выводится список предупреждений. +#Если ТолстыйКлиентОбычноеПриложение Тогда + Возврат Ложь; +#КонецЕсли + + Если ПараметрыПриложения["СтандартныеПодсистемы.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы"] = Истина Тогда + Возврат Ложь; + КонецЕсли; + + Если Не ПараметрКлиента("ДоступноИспользованиеРазделенныхДанных") Тогда + Возврат Ложь; + КонецЕсли; + Возврат Истина; + +КонецФункции + +Функция ПредупрежденияПередЗавершениемРаботыСистемы(Отказ) + + Предупреждения = Новый Массив; + ИнтеграцияПодсистемБСПКлиент.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(Отказ, Предупреждения); + Возврат Предупреждения; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Для справочника ИдентификаторыОбъектовМетаданных. @@ -2221,7 +2299,7 @@ // Если добавлен новый полученный параметр клиента, обновляет параметры работы клиента. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.Параметры. // // Возвращаемое значение: // Булево - Истина, если можно продолжить выполнения, и соответственно, не выполнялся @@ -2243,7 +2321,7 @@ // Обрабатывает ошибку, найденную при вызове обработчика события ПриНачалеРаботыСистемы. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы.Параметры. // ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. // ПрекратитьРаботу - Булево - если указано Истина, то при ошибке запуска не будет возможности продолжить работу. // @@ -2256,7 +2334,7 @@ // Проверяет результат обработчика события ПередНачаломРаботыСистемы и выполняет обработчик оповещения. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.Параметры. // // Возвращаемое значение: // Булево - Истина, если был выполнен обработчик оповещения, указанный @@ -2311,7 +2389,7 @@ // Проверяет результат интерактивной обработки, если Отказ, тогда вызывает обработку завершения. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы.Параметры. // // Возвращаемое значение: // Булево - Истина, если можно продолжить выполнения, и соответственно, не выполнялся @@ -2331,7 +2409,7 @@ // Обрабатывает ошибку, найденную при вызове обработчика события ПриНачалеРаботыСистемы. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы.Параметры. // ИнформацияОбОшибке - ИнформацияОбОшибке - информация об ошибке. // ПрекратитьРаботу - Булево - если указано Истина, то при ошибке запуска не будет возможности продолжить работу. // @@ -2344,7 +2422,7 @@ // Проверяет результат обработчика события ПриНачалеРаботыСистемы и выполняет обработчик оповещения. // // Параметры: -// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы. +// Параметры - см. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы.Параметры. // // Возвращаемое значение: // Булево - Истина, если был выполнен обработчик оповещения, указанный в @@ -2501,9 +2579,9 @@ // "ОбщаяФорма.ВопросПередЗавершениемРаботыСистемы". // // Параметры: -// Параметры - сквозные параметры цепочки вызовов процедуры ПередЗавершениемРаботыСистемы. -// ОбработкаОтвета - ОписаниеОповещения для продолжения после получения ответа пользователя. -// ПредупреждениеПользователю - Структура - структура передаваемого предупреждения. +// Параметры - см. СтандартныеПодсистемыКлиент.ПараметрыДействийПередЗавершениемРаботыСистемы. +// ОбработкаОтвета - ОписаниеОповещения - для продолжения после получения ответа пользователя. +// ПредупреждениеПользователю - см. СтандартныеПодсистемыКлиент.ПредупреждениеПриЗавершенииРаботы. // ИмяФормы - Строка - имя общей формы с вопросами. // ПараметрыФормы - Структура - параметры для формы с вопросами. // diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСерверЛокализация/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСерверЛокализация/Module.bsl index 94ad2b48d..c88516236 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСерверЛокализация/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСерверЛокализация/Module.bsl @@ -11,7 +11,9 @@ // Описывает правил транслитерации национального алфавита в латиницу. // // Параметры: -// Правила - Соответствие - ключ как буква национального алфавита, значение как буква латинского алфавита. +// Правила - Соответствие из КлючИЗначение: +// * Ключ - Строка - буква национального алфавита; +// * Значение - Строка - буква латинского алфавита. // Процедура ПриЗаполненииПравилТранслитерации(Правила) Экспорт diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl index 216f785ee..1e4e91b1a 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl @@ -14,7 +14,7 @@ // Возвращаемое значение: // ФиксированнаяСтруктура: // * Порядок - Массив из Строка -// * ПоИменам - соответствие из КлючИЗначение - где: +// * ПоИменам - Соответствие из КлючИЗначение: // ** Ключ - Строка // ** Значение - см. НовоеОписаниеПодсистемы // @@ -226,11 +226,10 @@ // Проверка выполняется по более точному алгоритму, если используется подсистема "Обмен данными". // // Параметры: -// ФильтрПоНазначению - Строка - уточняет, наличие какого РИБ проверяется. -// Допустимые значения: -// * Пустая строка - любого РИБ -// * "СФильтром" - РИБ с фильтром -// * "Полный" - РИБ без фильтров. +// ФильтрПоНазначению - Строка - уточняет, наличие какого РИБ проверяется: +// Пустая строка - любого РИБ; +// "СФильтром" - РИБ с фильтром; +// "Полный" - РИБ без фильтров. // // Возвращаемое значение: // Булево @@ -249,11 +248,10 @@ // Проверка выполняется по более точному алгоритму, если используется подсистема "Обмен данными". // // Параметры: -// ФильтрПоНазначению - Строка - задает назначение узлов планов обмена РИБ, которые необходимо вернуть. -// Допустимые значения: -// * Пустая строка - будут возвращены все узлы РИБ -// * "СФильтром" - будут возвращены узлы РИБ с фильтром -// * "Полный" - будут возвращены узлы РИБ без фильтров. +// ФильтрПоНазначению - Строка - задает назначение узлов планов обмена РИБ, которые необходимо вернуть: +// Пустая строка - будут возвращены все узлы РИБ; +// "СФильтром" - будут возвращены узлы РИБ с фильтром; +// "Полный" - будут возвращены узлы РИБ без фильтров. // // Возвращаемое значение: // СписокЗначений @@ -271,8 +269,8 @@ Если ЗначениеЗаполнено(ФильтрПоНазначению) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - ОбщийМодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); - НазначениеРИБ = ВРег(ОбщийМодульОбменДаннымиСервер.НазначениеПланаОбмена(ИмяПланаОбмена)); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + НазначениеРИБ = ВРег(МодульОбменДаннымиСервер.НазначениеПланаОбмена(ИмяПланаОбмена)); Если ФильтрПоНазначению = "СФИЛЬТРОМ" И НазначениеРИБ <> "РИБСФИЛЬТРОМ" Или ФильтрПоНазначению = "ПОЛНЫЙ" И НазначениеРИБ <> "РИБ" Тогда @@ -406,7 +404,7 @@ // Доступность объектов метаданных по функциональным опциям. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка // * Значение - Булево // @@ -461,7 +459,7 @@ // У "функциональной" подсистемы снят флажок "Включать в командный интерфейс". // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка // * Значение - Булево // @@ -575,7 +573,7 @@ // * Планы видов расчета. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя предопределенного, // * Значение - СправочникСсылка // - ПланВидовХарактеристикСсылка @@ -652,7 +650,7 @@ // Вспомогательные процедуры и функции // Возвращаемое значение: -// Структура: +// Структура: // * ПараллельноеОтложенноеОбновлениеСВерсии - Строка // * РежимВыполненияОтложенныхОбработчиков - Строка // * ОсновнойСерверныйМодуль - Строка diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index e993e1878..172961144 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -47,7 +47,11 @@ ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(НезаполненныеПараметрыКлиента); КонецЕсли; Справочники.ВерсииРасширений.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); - МультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); + КонецЕсли; // При установке соединения с информационной базой до вызова всех остальных обработчиков. ПередЗапускомПрограммы(); @@ -60,7 +64,11 @@ КонецЕсли; Справочники.ВерсииРасширений.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); - МультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + МодульМультиязычностьСервер.УстановкаПараметровСеанса(ИменаПараметровСеанса, УстановленныеПараметры); + КонецЕсли; Если ИменаПараметровСеанса.Найти("БуферОбмена") <> Неопределено Тогда ПараметрыСеанса.БуферОбмена = Новый ФиксированнаяСтруктура(Новый Структура("Источник, Данные")); @@ -417,6 +425,45 @@ КонецФункции +// Возвращает версию режима совместимости в формате нумерации редакций и версий, например, 8.3.15.0. +// +// Возвращаемое значение: +// Строка - версия режима совместимости в формате нумерации редакций и версий. +// +Функция ВерсияРежимаСовместимости() Экспорт + + Если Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда + + Информация = Новый СистемнаяИнформация; + Возврат Информация.ВерсияПриложения; + + КонецЕсли; + + ОписаниеРежимаСовместимости = СтрРазделить(Метаданные.РежимСовместимости, "_"); + Символов = СтрДлина(ОписаниеРежимаСовместимости[0]); + + НомерРедакции = ""; + + Для НомерСимвола = 1 По Символов Цикл + + ТекущийСимвол = Сред(ОписаниеРежимаСовместимости[0], НомерСимвола, 1); + + Если СтрНайти("0123456789", ТекущийСимвол) > 0 Тогда + НомерРедакции = НомерРедакции + ТекущийСимвол; + КонецЕсли; + + КонецЦикла; + + ОписаниеРежимаСовместимости.Установить(0, НомерРедакции); + + Для Индекс = ОписаниеРежимаСовместимости.Количество() По 3 Цикл + ОписаниеРежимаСовместимости.Добавить("0"); + КонецЦикла; + + Возврат СтрСоединить(ОписаниеРежимаСовместимости, "."); + +КонецФункции + #Область УстаревшиеПроцедурыИФункции // Устарела. Веб-клиент более не поддерживает конфигурации, которые используют интерфейс версии 8.2. @@ -1291,6 +1338,13 @@ // Может быть передана ссылка или массив ссылок на измененные объекты, // либо можно указать тип или массив типов измененных объектов. // +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Тип - например, ДокументСсылка.ЗаказПокупателя. +// * Значение - Структура: +// ** ИмяСобытия - Строка - например, "Запись_ЗаказПокупателя". +// ** ПустаяСсылка - ЛюбаяСсылка +// Функция ПодготовитьОповещениеФормОбИзменении(ИзмененныеОбъекты) Экспорт Результат = Новый Соответствие; @@ -1401,7 +1455,7 @@ // Возвращает представление начальной (главной) страницы. // // Возвращаемое значение: -// Строка - представление начальной страницы. +// Строка // Функция ПредставлениеНачальнойСтраницы() Экспорт @@ -1412,6 +1466,9 @@ // Проверяет используемую версию платформы и возвращает признак // возможности установки подписанных расширений в базовой версии конфигурации. // +// Возвращаемое значение: +// Булево - Истина, если возможно. +// Функция ДоступнаУстановкаПодписанныхРасширенийВБазовойВерсии() Экспорт ДоступнаУстановка = Истина; @@ -1461,10 +1518,6 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.БезопасноеХранилищеДанных.Измерения.Владелец); @@ -1480,10 +1533,6 @@ КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке. -// -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке.Типы -// Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных); @@ -1491,10 +1540,6 @@ КонецПроцедуры // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. -// -// Параметры: -// Типы - см. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.Типы -// Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВИнтернете); @@ -1508,10 +1553,6 @@ КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); @@ -1529,10 +1570,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// -// Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -1561,11 +1600,7 @@ КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляАдминистраторовСистемы. @@ -1617,10 +1652,6 @@ КонецПроцедуры // См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. -// -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.УдалениеУстаревшихПараметровРаботыВерсийРасширений.Имя); @@ -1628,10 +1659,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1652,21 +1679,6 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "ОбновлениеИнформационнойБазыСлужебный.НачальноеЗаполнениеПредопределенныхДанных"; - Обработчик = Обработчики.Добавить(); - Обработчик.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; - Обработчик.Версия = "3.1.3.270"; - Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.Идентификатор = Новый УникальныйИдентификатор("68d400bb-e5bb-49da-a567-ebf7458b29f8"); - Обработчик.ПроцедураЗаполненияДанныхОбновления = "МультиязычностьСервер.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; - Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; - Обработчик.Комментарий = НСтр("ru = 'Заполнение пустых значений мультиязычных реквизитов значением основного языка.'"); - Обработчик.ОчередьОтложеннойОбработки = 2; - - ОбъектыСНачальнымЗаполнениемСтрокой = ОбновлениеИнформационнойБазыСлужебный.ОбъектыСНачальнымЗаполнениемСтрокой(); - Обработчик.ЧитаемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; - Обработчик.ИзменяемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; - Обработчик.БлокируемыеОбъекты = ОбъектыСНачальнымЗаполнениемСтрокой; - КонецПроцедуры // Формирует текст для вывода пользователю при необходимости динамического обновления. @@ -1763,6 +1775,17 @@ КонецФункции +Функция ЯзыкиКонфигурации() Экспорт + + Языки = Новый Массив; + Для каждого Язык Из Метаданные.Языки Цикл + Языки.Добавить(Язык.КодЯзыка); + КонецЦикла; + + Возврат Языки; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1825,10 +1848,8 @@ // Обязательные параметры для продолжения работы. Параметры.Вставить("РазделениеВключено", ОбщегоНазначения.РазделениеВключено()); - Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных", ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()); - Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ЭтоРазделеннаяКонфигурация); Параметры.Вставить("ЕстьДоступДляОбновленияВерсииПлатформы", Пользователи.ЭтоПолноправныйПользователь(,Истина)); @@ -1842,7 +1863,6 @@ Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", ЗапрашиватьПодтверждениеПриЗавершенииПрограммы()); ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности(); - Параметры.Вставить("МинимальнаяВерсияПлатформы", ОбщиеПараметры.МинимальнаяВерсияПлатформы); Параметры.Вставить("РекомендуемаяВерсияПлатформы", ОбщиеПараметры.РекомендуемаяВерсияПлатформы); // Устарели. Для обратной совместимости. @@ -1857,14 +1877,11 @@ Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); Если ЭтоВызовПередНачаломРаботыСистемы Тогда - Параметры.Вставить("ЭлементыСтиля", НаборЭлементовСтиля()); - КонецЕсли; Если ЭтоВызовПередНачаломРаботыСистемы И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ОпцииИнтерфейса") Тогда - Параметры.Вставить("ОпцииИнтерфейса", СтандартныеПодсистемыПовтИсп.ОпцииИнтерфейса()); КонецЕсли; @@ -1884,7 +1901,6 @@ МодульБлокировкаРаботыСВнешнимиРесурсами.ПриДобавленииПараметровРаботыКлиентаПриЗапуске( Параметры, ЭтоВызовПередНачаломРаботыСистемы); - МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда Параметры.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована"); КонецЕсли; @@ -1905,19 +1921,21 @@ Возврат Ложь; КонецЕсли; - УстановитьПривилегированныйРежим(Истина); Если ЭтоВызовПередНачаломРаботыСистемы И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ВосстановитьСвязьСГлавнымУзлом") - И Не ОбщегоНазначения.РазделениеВключено() - И ПланыОбмена.ГлавныйУзел() = Неопределено - И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()) Тогда - + И Не ОбщегоНазначения.РазделениеВключено() Тогда + + УстановитьПривилегированныйРежим(Истина); + ВосстановитьСвязьСГлавнымУзлом = ПланыОбмена.ГлавныйУзел() = Неопределено + И ЗначениеЗаполнено(Константы.ГлавныйУзел.Получить()); УстановитьПривилегированныйРежим(Ложь); - Параметры.Вставить("ВосстановитьСвязьСГлавнымУзлом", Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь)); - СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); - Возврат Ложь; + + Если ВосстановитьСвязьСГлавнымУзлом Тогда + Параметры.Вставить("ВосстановитьСвязьСГлавнымУзлом", Пользователи.ЭтоПолноправныйПользователь(, Истина)); + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + Возврат Ложь; + КонецЕсли; КонецЕсли; - УстановитьПривилегированныйРежим(Ложь); Если ЭтоВызовПередНачаломРаботыСистемы И Не Параметры.ПолученныеПараметрыКлиента.Свойство("ВыбратьНачальныеРегиональныеНастройкиИБ") @@ -1929,23 +1947,15 @@ Возврат Ложь; КонецЕсли; - Если ЭтоВызовПередНачаломРаботыСистемы - И НЕ (Параметры.РазделениеВключено И Не Параметры.ДоступноИспользованиеРазделенныхДанных) - И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда + Если ЭтоВызовПередНачаломРаботыСистемы И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса") Тогда + ОписаниеОшибки = ""; МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); - ЗначениеРазделителя = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); - Если МодульРаботаВМоделиСервиса.ОбластьДанныхЗаблокирована(ЗначениеРазделителя) Тогда - - ОписаниеОшибки = НСтр("ru = 'Запуск приложения временно недоступен. - |Выполняются регламентные операции по обслуживанию приложения. - | - |Попробуйте запустить приложение через несколько минут.'"); - + МодульРаботаВМоделиСервиса.ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки); + Если Не ПустаяСтрока(ОписаниеОшибки) Тогда Параметры.Вставить("ОбластьДанныхЗаблокирована", ОписаниеОшибки); // Работа будет завершена. Возврат Ложь; - КонецЕсли; КонецЕсли; @@ -2080,6 +2090,8 @@ Параметры.Вставить("РаботаСВнешнимиРесурсамиЗаблокирована"); КонецЕсли; + Параметры.Вставить("ВерсияРежимаСовместимости", ВерсияРежимаСовместимости()); + КонецПроцедуры // Заполняет структуру параметров, необходимых для работы клиентского кода @@ -3215,7 +3227,7 @@ // Вызов ОбщегоНазначения.ВычислитьВБезопасномРежиме не требуется, // т.к. это проверка установки привилегированного режима в функции Вычислить без установки безопасного режима. - Возврат Вычислить("ДоступенПереходВПривилегированныйРежим()"); + Возврат Вычислить("ДоступенПереходВПривилегированныйРежим()"); // АПК:488 КонецФункции @@ -3386,24 +3398,11 @@ Функция ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы() Экспорт - Если (ОбщегоНазначения.РазделениеВключено() И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()) - Или ОбщегоНазначения.ЭтоАвтономноеРабочееМесто() Тогда - Возврат Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда + МодульМультиязычностьСервер = ОбщегоНазначения.ОбщийМодуль("МультиязычностьСервер"); + Возврат МодульМультиязычностьСервер.ТребуетсяУстановкаРегиональныхНастроекИнформационнойБазы(); КонецЕсли; - УстановитьПривилегированныйРежим(Истина); - - Если ЗначениеЗаполнено(Константы.ОсновнойЯзык.Получить()) Тогда - Возврат Ложь; - КонецЕсли; - - Если ОбновлениеИнформационнойБазыСлужебный.РежимОбновленияДанных() = "НачальноеЗаполнение" - И Метаданные.Языки.Количество() > 1 Тогда - Возврат Истина; - КонецЕсли; - - Константы.ОсновнойЯзык.Установить(Метаданные.ОсновнойЯзык.КодЯзыка); - Возврат Ложь; КонецФункции @@ -3428,7 +3427,7 @@ // Структура: // * Ключ - Строка - имя элемента стиля. // * Значение - Строка -// - ОбъектМетаданных: ЭлементСтиля - элемент стиля. Для толстого клиента обычного приложения +// - ОбъектМетаданныхЭлементСтиля - элемент стиля. Для толстого клиента обычного приложения // элемент стиля преобразуется в системное строковое представление переданного значения. // Функция НаборЭлементовСтиля() diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index c277301be..b705d8c0b 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -1434,11 +1434,11 @@ // Выполняет преобразование цифры в римскую нотацию. // // Параметры: -// Цифра - Число - цифра от 0 до 9. +// Цифра - Число - цифра от 0 до 9. // РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка - Строка - символы, соответствующие римским цифрам. // // Возвращаемое значение -// Строка - цифра в римской нотации. +// Строка - цифра в римской нотации. // // Пример: // СтроковыеФункцииКлиентСервер.ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII". diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl index 122655089..8bee8d7d0 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl @@ -12,14 +12,14 @@ // // Параметры: // Настройки - Структура: -// * Реквизиты - Соответствие - для переопределения имен реквизитов объекта, в которых содержится информация +// * Реквизиты - Соответствие из КлючИЗначение - для переопределения имен реквизитов объекта, в которых содержится информация // о сумме и валюте, выводимых в списке связанных документов. // В ключе указывается полное имя объекта метаданных, в значении - соответствие // реквизитов Валюта и СуммаДокумента с реальными реквизитами объекта. // Если не задано, то значения зачитываются из реквизитов Валюта и СуммаДокумента. -// * РеквизитыДляПредставления - Соответствие - для переопределения представления объектов, выводимых в списке -// связанных документов. В ключе указывается полное имя объекта метаданных, в значении - -// массив имен реквизитов, значения которых участвуют в формировании представления. +// * РеквизитыДляПредставления - Соответствие из КлючИЗначение - для переопределения представления объектов, выводимых +// в списке связанных документов. В ключе указывается полное имя объекта метаданных, в +// значении - массив имен реквизитов, значения которых участвуют в формировании представления. // Для формирования представления перечисленных здесь объектов будет вызываться // процедура СтруктураПодчиненностиПереопределяемый.ПриПолученииПредставления. // diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl index 081dbf9cf..d42a47d14 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиСлужебный/Module.bsl @@ -25,10 +25,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // // // Параметры: diff --git a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl index b216bda5a..803251c5c 100644 --- a/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаПереопределяемый/Module.bsl @@ -11,29 +11,14 @@ // Определяет список обработчиков (модулей менеджеров или общих модулей) для формирования и обновления // списка всех текущих дел, предусмотренных в конфигурации. // -// В указанных модулях должна быть размещена процедура обработчика, в которую передаются параметры: -// ТекущиеДела - ТаблицаЗначений - определяет параметры дела: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый подсистемой. -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * ВыводитьВОповещениях - Булево - если Истина, уведомление о деле будет дублироваться всплывающим -// оповещением и отображением в центре оповещений. -// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. -// Можно применять для дел, которые не предполагают многократного -// использования, т.е. после выполнения они для данной информационной базы -// больше отображаться не будут. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка, объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. +// В указанных модулях должна быть размещена процедура обработчика, в которую передается параметр +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // -// Далее пример процедуры обработчика для копирования в указанные модули. +// Далее пример процедуры обработчика для копирования в указанные модули: // -//// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +//// Параметры: +//// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +//// //Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт // //КонецПроцедуры diff --git a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl index 464a9d4bd..c7bbd5109 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСервер/Module.bsl @@ -8,6 +8,51 @@ #Область ПрограммныйИнтерфейс +// Таблица текущих дел пользователя. +// Передается в обработчики ПриЗаполненииСпискаТекущихДел. +// +// Возвращаемое значение: +// ТаблицаЗначений - определяет параметры дела: +// * Идентификатор - Строка - внутренний идентификатор дела, используемый подсистемой. +// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. +// * Важное - Булево - если Истина, дело будет выделено красным цветом. +// * ВыводитьВОповещениях - Булево - если Истина, уведомление о деле будет дублироваться всплывающим +// оповещением и отображением в центре оповещений. +// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. +// Можно применять для дел, которые не предполагают многократного +// использования, т.е. после выполнения они для данной информационной базы +// больше отображаться не будут. +// * Представление - Строка - представление дела, выводимое пользователю. +// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. +// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку +// дела на панели "Текущие дела". +// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. +// * Владелец - Строка +// - ОбъектМетаданных - строковый идентификатор дела, которое будет владельцем для текущего +// или объект метаданных подсистема. +// * Подсказка - Строка - текст подсказки. +// * ОбъектВладелецДел - Строка - полное имя объекта метаданных, в котором расположен обработчик заполнения дел. +// +Функция ТекущиеДела() Экспорт + + ДелаПользователя = Новый ТаблицаЗначений; + ДелаПользователя.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); + ДелаПользователя.Колонки.Добавить("ЕстьДела", Новый ОписаниеТипов("Булево")); + ДелаПользователя.Колонки.Добавить("Важное", Новый ОписаниеТипов("Булево")); + ДелаПользователя.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); + ДелаПользователя.Колонки.Добавить("СкрыватьВНастройках", Новый ОписаниеТипов("Булево")); + ДелаПользователя.Колонки.Добавить("ВыводитьВОповещениях", Новый ОписаниеТипов("Булево")); + ДелаПользователя.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); + ДелаПользователя.Колонки.Добавить("Форма", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); + ДелаПользователя.Колонки.Добавить("ПараметрыФормы", Новый ОписаниеТипов("Структура")); + ДелаПользователя.Колонки.Добавить("Владелец"); + ДелаПользователя.Колонки.Добавить("Подсказка", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); + ДелаПользователя.Колонки.Добавить("ОбъектВладелецДел", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(256))); + + Возврат ДелаПользователя; + +КонецФункции + // Возвращает массив подсистем командного интерфейса, в которые включен переданный // объект метаданных. // diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl index 93d8b2945..4dea56cd3 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебный/Module.bsl @@ -23,13 +23,13 @@ // дела на панели "Текущие дела". // * ПараметрыФормы- Структура - параметры, с которыми нужно открывать форму показателя. // * Владелец - Строка -// - объект метаданных - строковый идентификатор дела, которое будет владельцем для текущего +// - ОбъектМетаданных - строковый идентификатор дела, которое будет владельцем для текущего // или объект метаданных подсистема. // * Подсказка - Строка - текст подсказки. // Процедура СформироватьСписокТекущихДелПользователя(Параметры, АдресРезультата) Экспорт - ТекущиеДела = ТекущиеДела(); + ТекущиеДела = ТекущиеДелаСервер.ТекущиеДела(); НастройкиОтображения = СохраненныеНастройкиОтображения(); КоличествоДел = 0; @@ -98,9 +98,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // СовместноДляПользователейИВнешнихПользователей. @@ -195,6 +193,9 @@ // Только для внутреннего использования. // +// Параметры: +// ТекущиеДела - ТаблицаЗначений +// Процедура УстановитьНачальныйПорядокРазделов(ТекущиеДела) Экспорт ПорядокРазделовКомандногоИнтерфейса = Новый Массив; @@ -303,50 +304,6 @@ КонецПроцедуры -// Создает пустую таблицу дел пользователя. -// -// Возвращаемое значение: -// ТаблицаЗначений - определяет параметры дела: -// * Идентификатор - Строка - внутренний идентификатор дела, используемый подсистемой. -// * ЕстьДела - Булево - если Истина, дело выводится в списке текущих дел пользователя. -// * Важное - Булево - если Истина, дело будет выделено красным цветом. -// * ВыводитьВОповещениях - Булево - если Истина, уведомление о деле будет дублироваться всплывающим -// оповещением и отображением в центре оповещений. -// * СкрыватьВНастройках - Булево - если Истина, то дело будет скрыто в форме настроек текущих дел. -// Можно применять для дел, которые не предполагают многократного -// использования, т.е. после выполнения они для данной информационной базы -// больше отображаться не будут. -// * Представление - Строка - представление дела, выводимое пользователю. -// * Количество - Число - количественный показатель дела, выводится в строке заголовка дела. -// * Форма - Строка - полный путь к форме, которую необходимо открыть при нажатии на гиперссылку -// дела на панели "Текущие дела". -// * ПараметрыФормы - Структура - параметры, с которыми нужно открывать форму показателя. -// * Владелец - Строка -// - ОбъектМетаданных - строковый идентификатор дела, которое будет владельцем для текущего -// или объект метаданных подсистема. -// * Подсказка - Строка - текст подсказки. -// * ОбъектВладелецДел - Строка - полное имя объекта метаданных, в котором расположен обработчик заполнения дел. -// -Функция ТекущиеДела() Экспорт - - ДелаПользователя = Новый ТаблицаЗначений; - ДелаПользователя.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); - ДелаПользователя.Колонки.Добавить("ЕстьДела", Новый ОписаниеТипов("Булево")); - ДелаПользователя.Колонки.Добавить("Важное", Новый ОписаниеТипов("Булево")); - ДелаПользователя.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); - ДелаПользователя.Колонки.Добавить("СкрыватьВНастройках", Новый ОписаниеТипов("Булево")); - ДелаПользователя.Колонки.Добавить("ВыводитьВОповещениях", Новый ОписаниеТипов("Булево")); - ДелаПользователя.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число")); - ДелаПользователя.Колонки.Добавить("Форма", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); - ДелаПользователя.Колонки.Добавить("ПараметрыФормы", Новый ОписаниеТипов("Структура")); - ДелаПользователя.Колонки.Добавить("Владелец"); - ДелаПользователя.Колонки.Добавить("Подсказка", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(250))); - ДелаПользователя.Колонки.Добавить("ОбъектВладелецДел", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(256))); - - Возврат ДелаПользователя; - -КонецФункции - Процедура ДобавитьДело(ТекущиеДела, Менеджер, КоличествоДел) Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда diff --git a/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl index 83925e9ec..901b92f17 100644 --- a/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ТекущиеДелаСлужебныйПовтИсп/Module.bsl @@ -11,8 +11,10 @@ // Возвращает соответствие объектов метаданных и подсистем командного интерфейса. // // Возвращаемое значение: -// Соответствие - где ключом является полное имя объекта, а значение - массив подсистем -// командного интерфейса программы, в которые входит данный объект. +// Соответствие из КлючИЗначение: +// * Ключ - Строка - полное имя объекта. +// * Значение - Массив из Строка - полные имена подсистем командного интерфейса программы, +// в которые входит данный объект. // Функция ПринадлежностьОбъектовРазделамКомандногоИнтерфейса() Экспорт diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl index a3b708980..6a8a8314a 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектов/Module.bsl @@ -11,14 +11,14 @@ // Безвозвратно удаляет объекты, помеченные на удаление, выполняя при этом контроль ссылочной целостности. // // Параметры: -// УдаляемыеОбъекты - Массив Из ПланОбменаСсылка - объекты для удаления. -// - Массив Из СправочникСсылка -// - Массив Из ДокументСсылка -// - Массив Из ПланСчетовСсылка -// - Массив Из ПланВидовРасчетаСсылка -// - Массив Из БизнесПроцессСсылка -// - Массив Из ЗадачаСсылка -// РежимУдаления - Строка - способ удаления, может принимать значения: +// УдаляемыеОбъекты - Массив из ПланОбменаСсылка - объекты для удаления. +// - Массив из СправочникСсылка +// - Массив из ДокументСсылка +// - Массив из ПланСчетовСсылка +// - Массив из ПланВидовРасчетаСсылка +// - Массив из БизнесПроцессСсылка +// - Массив из ЗадачаСсылка +// РежимУдаления - Строка - способ удаления, может принимать значения: // "Стандартный" - удаление объектов с контролем ссылочной целостности и сохранением возможности // многопользовательской работы. // "Монопольный" - удаление объектов с контролем ссылочной целостности с установкой монопольного режима. @@ -28,19 +28,19 @@ // будут очищены. // // Возвращаемое значение: -// Структура: -// * Успешно - Булево - Истина, если все объекты были удалены. -// * ПрепятствующиеУдалению - ТаблицаЗначений - объекты, в которых есть ссылки на удаляемые объекты: -// ** УдаляемыйСсылка - ЛюбаяСсылка -// ** МестоИспользования - ЛюбаяСсылка - ссылка на объект, препятствующий удалению. +// Структура: +// * Успешно - Булево - Истина, если все объекты были удалены. +// * ПрепятствующиеУдалению - ТаблицаЗначений - объекты, в которых есть ссылки на удаляемые объекты: +// ** УдаляемыйСсылка - ЛюбаяСсылка +// ** МестоИспользования - ЛюбаяСсылка - ссылка на объект, препятствующий удалению. // - Неопределено - объект используется в константе или // в процессе удаление произошла ошибка. Информация о константе указана в поле метаданные. // Информация об ошибке указана в поле ОписаниеОшибки. -// ** ОписаниеОшибки - Строка - описание ошибки при удалении объекта. -// ** ПодробноеОписаниеОшибки - Строка - подробное описание ошибки при удалении объекта. -// ** Метаданные - ОбъектМетаданных - описание метаданных объекта, препятствующего удалению. -// * Удаленные - Массив из ЛюбаяСсылка- успешно удаленные объекты. -// * НеУдаленные - Массив из ЛюбаяСсылка - не удаленные объекты. +// ** ОписаниеОшибки - Строка - описание ошибки при удалении объекта. +// ** ПодробноеОписаниеОшибки - Строка - подробное описание ошибки при удалении объекта. +// ** Метаданные - ОбъектМетаданных - описание метаданных объекта, препятствующего удалению. +// * Удаленные - Массив из ЛюбаяСсылка- успешно удаленные объекты. +// * НеУдаленные - Массив из ЛюбаяСсылка - не удаленные объекты. // Функция УдалитьПомеченныеОбъекты(УдаляемыеОбъекты, РежимУдаления = "Стандартный") Экспорт Возврат УдалениеПомеченныхОбъектовСлужебный.УдалитьПомеченныеОбъектыСлужебный(УдаляемыеОбъекты, РежимУдаления); @@ -51,19 +51,19 @@ // Предопределенные элементы исключаются из результата поиска. // // Параметры: -// ОтборМетаданных - СписокЗначений Из Строка - Список из полных имен метаданных, в которых будет +// ОтборМетаданных - СписокЗначений из Строка - список из полных имен метаданных, в которых будет // выполнен поиск помеченных на удаление. // Например, "Справочник._ДемоНоменклатура". -// - Неопределено - отбор по объектам метаданных накладываться не будет. +// - Неопределено - отбор по объектам метаданных накладываться не будет. // -// ИскатьТехнологическиеОбъекты - Булево - если Истина, то поиск будет осуществляться в объектах метаданных, +// ИскатьТехнологическиеОбъекты - Булево - если Истина, то поиск будет осуществляться в объектах метаданных, // добавленных в исключения поиска ссылок. // см. ОбщегоНазначения.ИсключенияПоискаСсылок. // Например, в справочнике КлючиДоступа. // // // Возвращаемое значение: -// Массив из ЛюбаяСсылка +// Массив из ЛюбаяСсылка // Функция ПомеченныеНаУдаление(Знач ОтборМетаданных = Неопределено, ИскатьТехнологическиеОбъекты = Ложь) Экспорт ИсключенияПоискаУдаляемых = Новый Массив; @@ -113,8 +113,8 @@ // Устанавливает видимость помеченных на удаление. // // Параметры: -// Форма - ФормаКлиентскогоПриложения - форма с динамическим списком -// НастройкиОтображенияПомеченныхОбъектов - ТаблицаФормы - элемент формы динамического списка. +// Форма - ФормаКлиентскогоПриложения - форма с динамическим списком +// НастройкиОтображенияПомеченныхОбъектов - ТаблицаФормы - элемент формы динамического списка. // - см. НастройкиОтображенияПомеченныхОбъектов // // Пример: @@ -155,10 +155,10 @@ // Формирует настройки отображения помеченных на удаления объектов. // // Возвращаемое значение: -// ТаблицаЗначений: -// * ИмяЭлементаФормы - Строка - имя таблицы формы, связанного с динамическим списком. -// * ТипыМетаданных - СписокЗначений из Строка - типы объектов, отображаемых в динамическом списке. -// * ИмяСписка - Строка - необязательный. Имя динамического списка на форме. +// ТаблицаЗначений: +// * ИмяЭлементаФормы - Строка - имя таблицы формы, связанного с динамическим списком. +// * ТипыМетаданных - СписокЗначений из Строка - типы объектов, отображаемых в динамическом списке. +// * ИмяСписка - Строка - необязательный. Имя динамического списка на форме. // Функция НастройкиОтображенияПомеченныхОбъектов() Экспорт @@ -186,9 +186,9 @@ // Используется для установки начального значения пометки кнопки формы. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТаблицаФормы - ТаблицаФормы - таблица формы, связанная с динамическим списком -// КнопкаФормы - КнопкаФормы - кнопка, связанная с командой Показать помеченные +// Форма - ФормаКлиентскогоПриложения +// ТаблицаФормы - ТаблицаФормы - таблица формы, связанная с динамическим списком +// КнопкаФормы - КнопкаФормы - кнопка, связанная с командой Показать помеченные // Процедура УстановитьПометкуКомандыПоказатьПомеченные(Форма, ТаблицаФормы, КнопкаФормы) Экспорт ЗначениеОтбора = УдалениеПомеченныхОбъектовСлужебный.ЗагрузитьНастройкуОтображенияПомеченныхНаУдаления( @@ -205,7 +205,7 @@ // - ДокументОбъект - объект, в котором будет выполнен поиск удаляемых объектов // // Возвращаемое значение: -// Соответствие из КлючЗначение: +// Соответствие из КлючИЗначение: // * Ключ -ЛюбаяСсылка - перечень удаляемых объектов, которые есть в источнике. // * Значение - Строка - представление ссылки // @@ -290,10 +290,10 @@ // Формирует настройки скрытия помеченных объектов для динамического списка. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ЭлементСписок - ТаблицаФормы -// ТипыМетаданных - Массив из Строка -// - Неопределено - по умолчанию основная таблица динамического списка +// Форма - ФормаКлиентскогоПриложения +// ЭлементСписок - ТаблицаФормы +// ТипыМетаданных - Массив из Строка +// - Неопределено - по умолчанию основная таблица динамического списка // // Возвращаемое значение: // см. НастройкиОтображенияПомеченныхОбъектов @@ -322,8 +322,8 @@ // Выводит на форму элементы управления и устраняет конфликты фиксированных и пользовательских настроек списка. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// Настройка - см. НастройкиОтображенияПомеченныхОбъектов +// Форма - ФормаКлиентскогоПриложения +// Настройка - см. НастройкиОтображенияПомеченныхОбъектов // Процедура УстановитьНастройкиСписка(Форма, Настройка, ЗначениеОтбора) @@ -343,7 +343,7 @@ КонецПроцедуры // Параметры: -// Форма - ФормаКлиентскогоПриложения +// Форма - ФормаКлиентскогоПриложения // Процедура СоздатьРеквизитХраненияНастроек(Форма) ДобавляемыеРеквизиты = Новый Массив; @@ -355,8 +355,8 @@ // Удаляет отбор по полю ПометкаУдаления из сохраненных пользовательских настроек // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ИмяСписка - Строка +// Форма - ФормаКлиентскогоПриложения +// ИмяСписка - Строка // Процедура УдалитьПользовательскуюНастройкуОтбораПомеченныхНаУдаление(Форма, ИмяСписка) @@ -393,7 +393,7 @@ КонецПроцедуры // Параметры: -// ДинамическийСписок - ДинамическийСписок +// ДинамическийСписок - ДинамическийСписок // Процедура УстановитьОграничениеНаОтборПоПометкеУдаления(ДинамическийСписок) @@ -408,7 +408,7 @@ КонецПроцедуры // Параметры: -// НастройкиОтображенияПомеченныхОбъектов - см. НастройкаОтображенияПомеченныхОбъектовСписка +// НастройкиОтображенияПомеченныхОбъектов - см. НастройкаОтображенияПомеченныхОбъектовСписка // Процедура ЗаполнитьИменаСпискаПоЭлементамФормы(Форма, НастройкиОтображенияПомеченныхОбъектов) Для Каждого Настройка Из НастройкиОтображенияПомеченныхОбъектов Цикл @@ -478,10 +478,10 @@ КонецФункции // Параметры: -// Реквизиты - КоллекцияОбъектовМетаданных +// Реквизиты - КоллекцияОбъектовМетаданных // // Возвращаемое значение: -// Массив +// Массив // Функция СформироватьРеквизитыРегистровБухгалтерииСКорреспонденцией(Знач Реквизиты) РеквизитыРегистраСКорреспонденцией = Новый Массив; @@ -584,10 +584,10 @@ КонецФункции // Параметры: -// МетаданныеИсточника - ОбъектМетаданныхРегистрБухгалтерии +// МетаданныеИсточника - ОбъектМетаданныхРегистрБухгалтерии // // Возвращаемое значение: -// Массив +// Массив // Функция СформироватьСтандартныеРеквизитыРегистраБухгалтерии(МетаданныеИсточника) СтандартныеРеквизиты = Новый Массив; @@ -654,6 +654,10 @@ Возврат Описание; КонецФункции +// Параметры: +// Источник - РегистрСведенийНаборЗаписей +// МетаданныеИсточника - ОбъектМетаданныхРегистрСведений +// Функция ОписаниеНабора(Источник, МетаданныеИсточника) Описание = Новый Структура; Описание.Вставить("Источник", Источник); diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl index 2e735967a..f39b40c49 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовКлиент/Module.bsl @@ -11,21 +11,21 @@ // Начинает интерактивное удаление помеченных объектов. // // Параметры: -// УдаляемыеОбъекты - Массив из ЛюбаяСсылка - перечень удаляемых объектов. -// ПараметрыУдаления - см. ПараметрыИнтерактивногоУдаления +// УдаляемыеОбъекты - Массив из ЛюбаяСсылка - перечень удаляемых объектов. +// ПараметрыУдаления - см. ПараметрыИнтерактивногоУдаления // -// Владелец - ФормаКлиентскогоПриложения -// - Неопределено - форма, из которой начата операция удаления. +// Владелец - ФормаКлиентскогоПриложения +// - Неопределено - форма, из которой начата операция удаления. // Если не указан, то в обработку оповещения о закрытии // не будет передана подробная информация об итогах удаления. // -// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - если указано, то при окончании удаления или +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - если указано, то при окончании удаления или // при закрытии формы в обработку оповещения будет передан результат // с полями: -// * Успешно - Булево - Истина, если все объекты удалены успешно. -// * УдаленныеКоличество - Число - количество удаленных объектов. -// * НеУдаленныеКоличество - Число - количество неудаленных объектов. -// * АдресРезультата - Строка - адрес временного хранилища. +// * Успешно - Булево - Истина, если все объекты удалены успешно. +// * УдаленныеКоличество - Число - количество удаленных объектов. +// * НеУдаленныеКоличество - Число - количество неудаленных объектов. +// * АдресРезультата - Строка - адрес временного хранилища. // - Неопределено - значение по умолчанию. // Процедура НачатьУдалениеПомеченных(УдаляемыеОбъекты, ПараметрыУдаления = Неопределено, Владелец = Неопределено, @@ -48,8 +48,8 @@ // Настройки интерактивного удаления. // // Возвращаемое значение: -// Структура: -// * Режим - Строка - способ удаления, может принимать значения: +// Структура: +// * Режим - Строка - способ удаления, может принимать значения: // "Стандартный" - удаление объектов с контролем ссылочной целостности и сохранением возможности // многопользовательской работы. // "Монопольный" - удаление объектов с контролем ссылочной целостности с установкой монопольного режима. @@ -68,10 +68,10 @@ // Открывает рабочее место Удаление помеченных. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТаблицаФормы - ТаблицаФормы -// - ДанныеФормыСтруктура -// - Неопределено - таблица формы, связанная с динамическим списком +// Форма - ФормаКлиентскогоПриложения +// ТаблицаФормы - ТаблицаФормы +// - ДанныеФормыСтруктура +// - Неопределено - таблица формы, связанная с динамическим списком // Процедура ПерейтиКПомеченнымНаУдаление(Форма, ТаблицаФормы = Неопределено) Экспорт @@ -89,9 +89,9 @@ // Изменяет видимость помеченных на удаление и сохраняет настройку пользователя. // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТаблицаФормы - ТаблицаФормы - таблица формы, связанная с динамическим списком. -// КнопкаФормы - КнопкаФормы - кнопка формы, связанная с командой Показать помеченные на удаление. +// Форма - ФормаКлиентскогоПриложения +// ТаблицаФормы - ТаблицаФормы - таблица формы, связанная с динамическим списком. +// КнопкаФормы - КнопкаФормы - кнопка формы, связанная с командой Показать помеченные на удаление. // Процедура ПоказатьПомеченныеНаУдаление(Форма, ТаблицаФормы, КнопкаФормы) Экспорт ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПоказатьПомеченныеНаУдаление", "ТаблицаФормы", ТаблицаФормы, Новый ОписаниеТипов("ТаблицаФормы")); @@ -105,7 +105,7 @@ // Не поддерживается на мобильном платформе. // // Параметры: -// ОповещениеОбИзменении - ОписаниеОповещения - обработчик изменения расписания регламентного задания. +// ОповещениеОбИзменении - ОписаниеОповещения - обработчик изменения расписания регламентного задания. // Процедура НачатьИзменениеРасписанияРегламентногоЗадания(ОповещениеОбИзменении = Неопределено) Экспорт СведенияОРегламентномЗаданииУдаленияПомеченных = УдалениеПомеченныхОбъектовСлужебныйВызовСервера.РежимУдалятьПоРасписанию(); @@ -188,7 +188,7 @@ // Обработчик подключенной команды. // // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыКоманды - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ВыполнитьПодключаемуюКомандуПоказатьПомеченныеНаУдаление(Знач МассивСсылок, @@ -204,7 +204,7 @@ // Обработчик подключенной команды. // // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыВыполнения - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ВыполнитьПодключаемуюКомандуПерейтиКПомеченным(МассивСсылок, ПараметрыВыполнения) Экспорт @@ -251,10 +251,10 @@ // Изменяет видимость помеченных на удаление в списке // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ТаблицаФормы - ТаблицаФормы +// Форма - ФормаКлиентскогоПриложения +// ТаблицаФормы - ТаблицаФормы // Возвращаемое значение: -// Булево - установленное значение отбора +// Булево - установленное значение отбора // Функция ИзменитьОтборПомеченныхНаУдаление(Форма, ТаблицаФормы) diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl index 943fe303b..1e9d45e86 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовПереопределяемый/Module.bsl @@ -13,7 +13,8 @@ // см. УдалениеПомеченныхОбъектовКлиент.ПоказатьПомеченныеНаУдаление и УдалениеПомеченныхОбъектовКлиент.ПерейтиКПомеченнымНаУдаление. // // Параметры: -// Объекты - Массив из ОбъектМетаданных - объекты метаданных, в формы списка которых будут добавлены команды скрытия помеченных на удаления. +// Объекты - Массив из ОбъектМетаданных - объекты метаданных, в формы списка которых будут добавлены команды скрытия +// помеченных на удаления. // // Пример: // Объекты.Добавить(Метаданные.Справочники._ДемоНоменклатура); diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl index d29f10dea..a0a1dc4c7 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебный/Module.bsl @@ -10,9 +10,7 @@ #Область ДляВызоваИзДругихПодсистем -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -23,6 +21,8 @@ КонецПроцедуры +// См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. +// // Параметры: // Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // @@ -35,32 +35,19 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("УдалениеПомеченных"); ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ОтключениеПроверкиИспользованияУдаляемыхОбъектов.Имя); КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// ИсключенияПоискаСсылок - Массив -// Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.УдаляемыеОбъекты); ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.НеудаленныеОбъекты); КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. -// -// Параметры: -// НастройкиФормы - Структура - сведения о форме, в которой выводятся команды. -// Источники - ДеревоЗначений - сведения о поставщиках команд этой формы. -// ПодключенныеОтчетыИОбработки - ТаблицаЗначений - отчеты и обработки, предоставляющие свои команды. -// Команды - ТаблицаЗначений - записать в этот параметр сформированные команды для вывода в подменю. -// Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт ПодключенныеОбъекты = Новый Массив; @@ -101,16 +88,6 @@ КонецПроцедуры // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд. -// -// Параметры: -// ВидыПодключаемыхКоманд - ТаблицаЗначений - поддерживаемые виды команд, где: -// * Имя - Строка - имя вида команд. -// * ИмяПодменю - Строка - имя подменю для размещения команд этого вида на формах объектов. -// * Заголовок - Строка - наименование подменю, выводимое пользователю. -// * Картинка - Картинка - картинка подменю. -// * Отображение - ОтображениеКнопки - режим отображения подменю. -// * Порядок - Число - порядок подменю в командной панели формы. -// Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт Если ВидыПодключаемыхКоманд.Найти("ОтображениеПомеченныхНаУдаление", "Имя") = Неопределено Тогда @@ -139,7 +116,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда @@ -194,9 +172,11 @@ КонецПроцедуры +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса. +// // Параметры: -// ИмяПараметра - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса -// УстановленныеПараметры - см. СтандартныеПодсистемыСервер.УстановкаПараметровСеанса.ИменаПараметровСеанса +// ИмяПараметра - Строка - имя параметра сеанса, который требуется установить. +// УстановленныеПараметры - Массив из Строка - имена параметров, которые уже установлены // Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт Если ИмяПараметра = "ВыполняетсяУдалениеОбъектов" Тогда @@ -205,24 +185,6 @@ КонецЕсли; КонецПроцедуры -Функция ПроверятьИспользованиеУдаляемыхОбъектов() Экспорт - ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено(); - ВОбластиДанных = ?(ЭтоМодельСервиса, ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(), Ложь); - Если ЭтоМодельСервиса И Не ВОбластиДанных Тогда - Возврат Ложь; - КонецЕсли; - - ПериодОбновленияЗначения = 60000; - - ДанныеКонстанты = УдалениеПомеченныхПовтИсп.ПроверятьИспользованиеУдаляемыхОбъектов(); - Если ТекущаяУниверсальнаяДатаВМиллисекундах() - ДанныеКонстанты.МеткаВремени > ПериодОбновленияЗначения Тогда - ДанныеКонстанты.Значение = Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Получить(); - ДанныеКонстанты.МеткаВремени = ТекущаяУниверсальнаяДатаВМиллисекундах(); - КонецЕсли; - - Возврат ДанныеКонстанты.Значение; -КонецФункции - // См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки. Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт @@ -291,10 +253,10 @@ // Возвращает Истина, если переданный тип является просты // // Параметры: -// Тип - Тип +// Тип - Тип // // Возвращаемое значение: -// Булево +// Булево // Функция ЭтоПростойТип(Тип) Экспорт Возврат (Тип = Неопределено Или Тип = Тип("Строка") Или Тип = Тип("Число") Или Тип = Тип("Булево") Или Тип = Тип( @@ -306,7 +268,7 @@ // // // Возвращаемое значение: -// Массив из ОбъектМетаданных +// Массив из ОбъектМетаданных // Функция ИсключенияПоискаСсылокРазрешающихУдаление() Экспорт Возврат УдалениеПомеченныхПовтИсп.ИсключенияПоискаСсылокРазрешающихУдаление(); @@ -350,7 +312,8 @@ ЗаписьЖурналаРегистрации( НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - НСтр("ru='Не удалось отключить проверку удаляемых объектов по причине:'") + ОписаниеОшибки()); + НСтр("ru='Не удалось отключить проверку удаляемых объектов по причине:'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; КонецЦикла; КонецПроцедуры @@ -372,11 +335,11 @@ // Формирует строковый ключ для сохранения настроек отображения помеченных на удаления. // // Параметры: -// ИмяФормы - Строка - имя формы -// ИмяСписка - Строка - имя списка +// ИмяФормы - Строка - имя формы +// ИмяСписка - Строка - имя списка // // Возвращаемое значение: -// Строка +// Строка // Функция КлючНастроек(ИмяФормы, ИмяСписка) Экспорт @@ -388,11 +351,11 @@ // Формирует дополнительную информацию о типе. // // Параметры: -// Тип - Тип -// КешИнформацииОТипах - Соответствие +// Тип - Тип +// КешИнформацииОТипах - Соответствие // // Возвращаемое значение: -// Структура: +// Структура: // * ПолноеИмя - Строка // * ПредставлениеЭлемента - Строка // * ПредставлениеСписка - Строка @@ -478,7 +441,7 @@ Информация.ТекстЗапросаПоПодчиненным = ""; Если ЭтоСправочник Или ЭтоПланВидовХарактеристик Или ЭтоПланОбмена Или ЭтоПланСчетов Или ЭтоПланВидовРасчета Тогда - ШаблонЗапроса = "ВЫБРАТЬ Ссылка, ПометкаУдаления ИЗ Справочник.&Имя ГДЕ Владелец = &УдаляемыйСсылка"; + ШаблонЗапроса = "ВЫБРАТЬ Ссылка, ПометкаУдаления ИЗ #Таблица ГДЕ Владелец = &УдаляемыйСсылка"; ТекстЗапроса = ""; Для Каждого Справочник Из Метаданные.Справочники Цикл @@ -490,7 +453,7 @@ Иначе ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС; КонецЕсли; - ТекстЗапроса = ТекстЗапроса + СтрЗаменить(ШаблонЗапроса, "&Имя", Справочник.Имя); + ТекстЗапроса = ТекстЗапроса + СтрЗаменить(ШаблонЗапроса, "#Таблица", "Справочник." + Справочник.Имя); КонецЦикла; Информация.ТекстЗапросаПоПодчиненным = ТекстЗапроса; @@ -557,12 +520,12 @@ КонецФункции // Параметры: -// Настройки - ТаблицаЗначений: +// Настройки - ТаблицаЗначений: // * Реквизит - Строка // * Метаданные - Строка // // Возвращаемое значение: -// Число +// Число // Функция ЧислоДополнительныхРеквизитов(Настройки) Экспорт Результат = 0; @@ -588,7 +551,7 @@ КонецФункции // Параметры: -// ТаблицаДействий - ТаблицаЗначений +// ТаблицаДействий - ТаблицаЗначений // // Возвращаемое значение: // см. РезультатОбработкиУдаляемыхОбъектов @@ -651,13 +614,13 @@ // из значения параметра. // // Параметры: -// ИсточникУдаляемыхОбъектов - ДеревоЗначений: -// * УдаляемыйСсылка - ЛюбаяСсылка +// ИсточникУдаляемыхОбъектов - ДеревоЗначений: +// * УдаляемыйСсылка - ЛюбаяСсылка // - СписокЗначений из ЛюбаяСсылка -// РежимУдаления - Строка -// НастройкиДополнительныхРеквизитов - ТаблицаЗначений -// АдресРезультатаПредыдущегоШага - Строка -// ИдентификаторЗадания - УникальныйИдентификатор - уникальный идентификатор формы, из которой запущено задание. +// РежимУдаления - Строка +// НастройкиДополнительныхРеквизитов - ТаблицаЗначений +// РезультатПредыдущегоШага - см. РезультатОбработкиУдаляемыхОбъектов +// ИдентификаторЗадания - УникальныйИдентификатор - уникальный идентификатор формы, из которой запущено задание. // используется для отмены блокировки при прерывания фонового задания // и закрытия формы. // @@ -693,7 +656,7 @@ // Не используется для неразделенного сеанса в модули сервиса. // // Параметры: -// Идентификатор - УникальныйИдентификатор +// Идентификатор - УникальныйИдентификатор // Процедура СнятьБлокировкуИспользованияУдаляемыхОбъектов(Идентификатор) Экспорт Если ОбщегоНазначения.РазделениеВключено() И НЕ ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -767,7 +730,7 @@ Метаданные.РегламентныеЗадания.ОтключениеПроверкиИспользованияУдаляемыхОбъектов); УстановитьПривилегированныйРежим(Истина); - + ЗаданиеПроверки = РегламентныеЗаданияСервер.НайтиЗадания(Фильтр); Для Каждого Задание Из ЗаданиеПроверки Цикл @@ -785,8 +748,8 @@ // Получить значение настроек отображения помеченных объектов из хранилища. // // Параметры: -// ИмяФормы - Строка -// ИмяСписка - Строка +// ИмяФормы - Строка +// ИмяСписка - Строка // Возвращаемое значение: // см. ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить // @@ -859,12 +822,12 @@ #Область ПоискПомеченныхНаУдаление // Параметры: -// УдаляемыеОбъекты - Массив из ЛюбаяСсылка -// Настройки - ТаблицаЗначений: -// * Реквизит - Строка -// * Метаданные - Строка -// * Представление - Строка -// Отмеченные - Массив из ЛюбаяСсылка +// УдаляемыеОбъекты - Массив из ЛюбаяСсылка +// Настройки - ТаблицаЗначений: +// * Реквизит - Строка +// * Метаданные - Строка +// * Представление - Строка +// Отмеченные - Массив из ЛюбаяСсылка // // Возвращаемое значение: // см. УниверсальноеДеревоУдаляемыхОбъектов @@ -931,11 +894,11 @@ КонецПроцедуры // Параметры: -// ДеревоЗначений - ДеревоЗначений -// Настройки - ТаблицаЗначений +// ДеревоЗначений - ДеревоЗначений +// Настройки - ТаблицаЗначений // // Возвращаемое значение: -// ДеревоЗначений +// ДеревоЗначений // Функция ДополнитьДеревоДополнительнымиРеквизитами(ДеревоЗначений, Настройки) Результат = ДеревоЗначений.Скопировать(); @@ -974,11 +937,11 @@ КонецПроцедуры // Параметры: -// ПомеченныеНаУдаление - Массив -// НастройкиДополнительныхРеквизитов - Массив из СтрокаТаблицыЗначений +// ПомеченныеНаУдаление - Массив +// НастройкиДополнительныхРеквизитов - Массив из СтрокаТаблицыЗначений // // Возвращаемое значение: -// Соответствие +// Соответствие // Функция ЗначенияДополнительныхРеквизитов(ПомеченныеНаУдаление, НастройкиДополнительныхРеквизитов) Результат = Новый Соответствие; @@ -1007,6 +970,8 @@ УдаляемыйОбъект = Элемент.ПолучитьОбъект(); УдаляемыйОбъект.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); + Ошибки = Новый Соответствие; + НачатьТранзакцию(); Попытка Блокировка = Новый БлокировкаДанных; @@ -1020,14 +985,31 @@ Описание = Результат.Добавить(); Описание.УдаляемыйСсылка = Элемент; Описание.ТребуетсяУдаление = Истина; + Исключение ОтменитьТранзакцию(); Описание = Результат.Добавить(); Описание.УдаляемыйСсылка = Элемент; - Описание.ТекстОшибки = ОписаниеОшибки(); + Ошибка = ИнформацияОбОшибке(); + Описание.ТекстОшибки =КраткоеПредставлениеОшибки(Ошибка); + Ошибки.Вставить(Элемент, ПодробноеПредставлениеОшибки(Ошибка)); КонецПопытки; КонецЦикла; - + + Если Ошибки.Количество() > 0 Тогда + + ТекстОшибки = Новый Массив; + Для каждого Ошибка Из Ошибки Цикл + ТекстОшибки.Добавить( + ОбщегоНазначения.ПредметСтрокой(Ошибка.Ключ) + ":" + Символы.ПС + Ошибка.Значение); + КонецЦикла; + ЗаписьЖурналаРегистрации( + НСтр("ru = 'Удаление помеченных'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , + НСтр("ru='Не удалось установить пометку удаления для объектов:'") + Символы.ПС + СтрСоединить(ТекстОшибки, Символы.ПС + Символы.ПС)); + + КонецЕсли; + Возврат Результат; КонецФункции @@ -1068,8 +1050,8 @@ КонецЕсли; ТипИсточника = ТипЗнч(Источник); - Если ТипИсточника = Тип("РегистрСведенийНаборЗаписей.УдаляемыеОбъекты") Или ТипИсточника = Тип( - "РегистрСведенийНаборЗаписей.НеудаленныеОбъекты") Тогда + Если ТипИсточника = Тип("РегистрСведенийНаборЗаписей.УдаляемыеОбъекты") + Или ТипИсточника = Тип("РегистрСведенийНаборЗаписей.НеудаленныеОбъекты") Тогда Возврат; КонецЕсли; @@ -1123,7 +1105,7 @@ #Область УдалениеПомеченныхОбъектов // Возвращаемое значение: -// Структура: +// Структура: // * Удаленные - Массив из ЛюбаяСсылка // * КоличествоНеУдаленных - Число // * КоличествоУдаленных - Число @@ -1192,7 +1174,7 @@ КонецФункции // Параметры: -// РезультатПредыдущегоШага - см. СвязиНеудаленных +// РезультатПредыдущегоШага - см. СвязиНеудаленных // // Возвращаемое значение: // см. СвязиНеудаленных @@ -1207,7 +1189,7 @@ ОшибкаПредыдущегоШага = СвязиНеудаленных.Добавить(); Если НЕ (Элемент.ТребуетсяУдаление) Тогда - ОшибкаПредыдущегоШага.УдаляемыйСсылка = Элемент.ОбнаруженныйСсылка; + ОшибкаПредыдущегоШага.УдаляемыйСсылка = Элемент.УдаляемыйСсылка; ОшибкаПредыдущегоШага.Представление = Элемент.ТекстОшибки; ОшибкаПредыдущегоШага.ОбнаруженныйСсылка = Элемент.ТекстОшибки; Иначе @@ -1225,13 +1207,13 @@ // при дополнительной обработке. // // Параметры: -// ИсточникУдаляемыхОбъектов - ДеревоЗначений: -// * УдаляемыйСсылка - ЛюбаяСсылка +// ИсточникУдаляемыхОбъектов - ДеревоЗначений: +// * УдаляемыйСсылка - ЛюбаяСсылка // - СписокЗначений из ЛюбаяСсылка -// РезультатОбработкиОшибок - см. ВыполнитьОбработкуПричинНеудаления +// РезультатОбработкиОшибок - см. ВыполнитьОбработкуПричинНеудаления // // Возвращаемое значение: -// Массив из ЛюбаяСсылка +// Массив из ЛюбаяСсылка // Функция УдаляемыеОбъектыИзДанныхФормы(ИсточникУдаляемыхОбъектов, РезультатОбработкиОшибок = Неопределено) @@ -1353,8 +1335,8 @@ СтрокаПрепятствующегоУдалению.ОбнаруженныйСсылка = Причина.Метаданные.ПолноеИмя(); СтрокаПрепятствующегоУдалению.ЭтоКонстанта = Истина; СтрокаПрепятствующегоУдалению.СсылочногоТипа = Ложь; - СтрокаПрепятствующегоУдалению.Представление = Причина.Метаданные.Синоним + " (" + НСтр( - "ru = 'Константа'") + ")"; + СтрокаПрепятствующегоУдалению.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + + " (" + НСтр("ru = 'Константа'") + ")"; Вид = "КОНСТАНТА"; Иначе ОбнаруженныйИнформация = ИнформацияОТипе(ОбнаруженныйТип, КешИнформацииОТипах); @@ -1372,13 +1354,13 @@ СтрокаПрепятствующегоУдалению.ПредставлениеУдаляемый = Строка(Причина.УдаляемыйСсылка); Если ОбщегоНазначения.ЭтоРегистр(Причина.Метаданные) Тогда - СтрокаПрепятствующегоУдалению.Представление = Причина.Метаданные.Синоним + " (" + НСтр( - "ru = 'Регистр'") + ")"; + СтрокаПрепятствующегоУдалению.Представление = ОбщегоНазначения.ПредставлениеОбъекта(Причина.Метаданные) + + " (" + НСтр("ru = 'Регистр'") + ")"; Иначе СтрокаПрепятствующегоУдалению.Представление = Строка(Причина.МестоИспользования) + " (" + ОбнаруженныйИнформация.ПредставлениеЭлемента + ")"; КонецЕсли; - + Вид = ОбнаруженныйИнформация.Вид; КонецЕсли; НомерКартинки = СтрокаПрепятствующегоУдалению.НомерКартинки; @@ -1475,13 +1457,13 @@ // Возвращает номер картинки из коллекции для отображения на форме // // Параметры: -// СсылкаИлиДанные - ЛюбаяСсылка -// СсылочногоТипа - Булево -// Вид - Строка -// Статус - Строка +// СсылкаИлиДанные - ЛюбаяСсылка +// СсылочногоТипа - Булево +// Вид - Строка +// Статус - Строка // // Возвращаемое значение: -// Число - номер картинки +// Число - номер картинки // Функция НомерКартинки(Знач СсылкаИлиДанные, Знач СсылочногоТипа, Знач Вид, Знач Статус) Экспорт @@ -1542,10 +1524,28 @@ КонецЕсли; КонецПроцедуры +Функция ПроверятьИспользованиеУдаляемыхОбъектов() + ЭтоМодельСервиса = ОбщегоНазначения.РазделениеВключено(); + ВОбластиДанных = ?(ЭтоМодельСервиса, ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных(), Ложь); + Если ЭтоМодельСервиса И Не ВОбластиДанных Тогда + Возврат Ложь; + КонецЕсли; + + ПериодОбновленияЗначения = 60000; + + ДанныеКонстанты = УдалениеПомеченныхПовтИсп.ПроверятьИспользованиеУдаляемыхОбъектов(); + Если ТекущаяУниверсальнаяДатаВМиллисекундах() - ДанныеКонстанты.МеткаВремени > ПериодОбновленияЗначения Тогда + ДанныеКонстанты.Значение = Константы.ПроверятьИспользованиеУдаляемыхОбъектов.Получить(); + ДанныеКонстанты.МеткаВремени = ТекущаяУниверсальнаяДатаВМиллисекундах(); + КонецЕсли; + + Возврат ДанныеКонстанты.Значение; +КонецФункции + #Область Конструкторы // Возвращаемое значение: -// ТаблицаЗначений: +// ТаблицаЗначений: // * Ссылка - ЛюбаяСсылка // * ТекстОшибки - Строка // * ТребуетсяУдаление - Булево @@ -1566,10 +1566,10 @@ // Представление коллекция ДеревоПомеченныхНаУдаление и НеУдаленные // // Параметры: -// ЧислоДополнительныхРеквизитов - Число +// ЧислоДополнительныхРеквизитов - Число // // Возвращаемое значение: -// ДеревоЗначений: +// ДеревоЗначений: // * Пометка - Булево // * УдаляемыйСсылка - ЛюбаяСсылка // - Строка @@ -1603,7 +1603,7 @@ КонецФункции // Возвращаемое значение: -// ТаблицаЗначений: +// ТаблицаЗначений: // * УдаляемыйСсылка - ЛюбаяСсылка // * ОбнаруженныйСсылка - ЛюбаяСсылка // - Строка @@ -1630,7 +1630,7 @@ // Ошибки при удалении объектов. // // Возвращаемое значение: -// ТаблицаЗначений: +// ТаблицаЗначений: // * УдаляемыйСсылка - ЛюбаяСсылка - удаляемый объект, колонка индексируется. // * ОбнаруженныйСсылка - ЛюбаяСсылка - объект, в котором есть ссылки на удаляемый объект. // - Строка - подробное описание ошибки, если возникла ошибка при удалении объекта. diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйВызовСервера/Module.bsl index fba932ff2..3cab10f32 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйВызовСервера/Module.bsl @@ -11,12 +11,12 @@ // Устанавливает режим автоматического удаления помеченных объектов // // Параметры: -// Изменения - Структура: -// * Использование - Булево - флаг использования регламентного задания -// * Расписание - РасписаниеРегламентногоЗадания - устанавливаемое расписание регламентного задания. +// Изменения - Структура: +// * Использование - Булево - флаг использования регламентного задания +// * Расписание - РасписаниеРегламентногоЗадания - устанавливаемое расписание регламентного задания. // // Возвращаемое значение: -// Булево +// Булево // Функция УстановитьРежимУдалятьПоРасписанию(Изменения) Экспорт @@ -47,7 +47,7 @@ // Возвращает расписание регламентного задания. // // Возвращаемое значение: -// Структура: +// Структура: // * ДетальныеРасписанияДня - Массив // * Использование - Булево // * РазделениеВключено - Булево diff --git a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйКлиентСервер/Module.bsl index 1caa23fae..1fe8da765 100644 --- a/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УдалениеПомеченныхОбъектовСлужебныйКлиентСервер/Module.bsl @@ -9,8 +9,8 @@ #Область СлужебныеПроцедурыИФункции // Параметры: -// Список - ДинамическийСписок -// ЗначениеОтбора - Булево +// Список - ДинамическийСписок +// ЗначениеОтбора - Булево // Процедура УстановитьОтборПоПометкеУдаления(Список, ЗначениеОтбора) Экспорт ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "ПометкаУдаления", Ложь,,,ЗначениеОтбора); @@ -19,7 +19,7 @@ // Формирует результат вызова метода УдалениеПомеченныхОбъектовКлиент.НачатьУдалениеПомеченных // // Возвращаемое значение: -// Структура: +// Структура: // * УдаленныеКоличество - Число // * НеУдаленныеКоличество - Число // * АдресРезультата - Строка diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl index 5c4740ac7..131ce2a59 100644 --- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -365,10 +365,15 @@ // Булево - если Истина, то настроено разрешение права с учетом всех разрешающих и // запрещающих настроек в иерархии. // -Функция ЕстьПраво(Право, СсылкаНаОбъект, Пользователь = Неопределено) Экспорт +Функция ЕстьПраво(Право, СсылкаНаОбъект, Знач Пользователь = Неопределено) Экспорт - Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Пользователи.АвторизованныйПользователь()); - Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда + УчитыватьПривилегированныйРежим = Истина; + Если ЗначениеЗаполнено(Пользователь) Тогда + УчитыватьПривилегированныйРежим = Ложь; + Иначе + Пользователь = Пользователи.АвторизованныйПользователь(); + КонецЕсли; + Если Пользователи.ЭтоПолноправныйПользователь(Пользователь,, УчитыватьПривилегированныйРежим) Тогда Возврат Истина; КонецЕсли; @@ -442,11 +447,15 @@ КонецФункции -// Проверяет, что на уровне записей (и на уровне прав) текущему пользователю +// Проверяет, что на уровне записей (и на уровне прав) указанному пользователю // разрешено чтение объекта из базы данных. // Когда указан набор записей проверяются все записи в базе данных, // которые соответствуют свойству Отбор. // +// Важно: если подсистема работает в режиме стандартного ограничения и +// указан пользователь, но не текущий пользователь, то будет вызвано +// исключение (для проверки предусмотрена функция ПроизводительныйВариант). +// // Параметры: // ОписаниеДанных - СправочникСсылка // - ДокументСсылка @@ -460,22 +469,36 @@ // - РегистрНакопленияКлючЗаписи // - РегистрБухгалтерииКлючЗаписи // - РегистрРасчетаКлючЗаписи - ключ записи, которую требуется проверить. +// - СправочникОбъект +// - ДокументОбъект +// - ПланВидовХарактеристикОбъект +// - ПланСчетовОбъект +// - ПланВидовРасчетаОбъект +// - БизнесПроцессОбъект +// - ЗадачаОбъект +// - ПланОбменаОбъект - объект в памяти и базе данных, который требуется проверить. // - РегистрСведенийНаборЗаписей // - РегистрНакопленияНаборЗаписей // - РегистрБухгалтерииНаборЗаписей // - РегистрРасчетаНаборЗаписей - набор записей с настроенным свойством Отбор, // по которому определяются записи в базе данных для проверки. // +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - Неопределено - текущий пользователь. +// Когда параметр указан, привилегированный режим не учитывается. +// Для проверки прав не текущего пользователя требуются административные права. +// // Возвращаемое значение: // Булево // -Функция ЧтениеРазрешено(ОписаниеДанных) Экспорт +Функция ЧтениеРазрешено(ОписаниеДанных, Пользователь = Неопределено) Экспорт - Возврат УправлениеДоступомСлужебный.ДоступРазрешен(ОписаниеДанных, Ложь); + Возврат УправлениеДоступомСлужебный.ДоступРазрешен(ОписаниеДанных, Ложь,,, Пользователь); КонецФункции -// Проверяет, что на уровне записей (и на уровне прав) текущему пользователю +// Проверяет, что на уровне записей (и на уровне прав) указанному пользователю // разрешено изменение объекта в базе данных на объект в памяти. // Для нового объекта проверяется только объект в памяти. // Если указана ссылка или ключ записи, проверятся только объект в базе данных. @@ -483,6 +506,8 @@ // Важно: если подсистема работает в режиме стандартного ограничения, // а не в режиме универсального ограничения, тогда проверяется право // Изменение на таблицу, а на уровне записей проверяется только право Чтение. +// Если указан пользователь, но не текущий пользователь, то будет вызвано +// исключение (для проверки предусмотрена функция ПроизводительныйВариант). // // Параметры: // ОписаниеДанных - СправочникСсылка @@ -511,12 +536,18 @@ // - РегистрРасчетаНаборЗаписей - набор записей в памяти и базе данных, // который требуется проверить. // +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - Неопределено - текущий пользователь. +// Когда параметр указан, привилегированный режим не учитывается. +// Для проверки прав не текущего пользователя требуются административные права. +// // Возвращаемое значение: // Булево // -Функция ИзменениеРазрешено(ОписаниеДанных) Экспорт +Функция ИзменениеРазрешено(ОписаниеДанных, Пользователь = Неопределено) Экспорт - Возврат УправлениеДоступомСлужебный.ДоступРазрешен(ОписаниеДанных, Истина); + Возврат УправлениеДоступомСлужебный.ДоступРазрешен(ОписаниеДанных, Истина,,, Пользователь); КонецФункции @@ -602,6 +633,20 @@ КонецФункции +// Возвращает вариант работы ограничений доступа на уровне записей. +// +// Требуется при расширенном использовании функций +// ЧтениеРазрешено и ИзменениеРазрешено в производительном варианте. +// +// Возвращаемое значение: +// Булево - если Ложь, стандартный вариант, иначе производительный. +// +Функция ПроизводительныйВариант() Экспорт + + Возврат УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые для настройки интерфейса управляемых форм. @@ -1029,7 +1074,7 @@ // // Параметры: // Список - ДинамическийСписок - динамический список, в который нужно установить отборы. -// ОписаниеОтборов - Соответствие: +// ОписаниеОтборов - Соответствие из КлючИЗначение: // * Ключ - Строка - имя поля основной таблицы динамического списка, для которого // нужно установить условие <Поле> В (&РазрешенныеЗначения). // * Значение - Тип - тип значений доступа, которые нужно включить в состав @@ -1141,7 +1186,7 @@ // объектов ссылочного типа, для которых нужно вернуть права. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - СправочникСсылка.ИдентификаторыОбъектовМетаданных - идентификатор типа; // * Значение - Структура: // * Ключ - Строка - имя права доступа ("Чтение", "Изменение", "Добавление"); @@ -1261,9 +1306,8 @@ // (элемент справочника, документ, бизнес-процесс, задача, план видов характеристик и т.п.), // для которого требуется заполнить наборы значений доступа. // -// Таблица - ТаблицаЗначений -// - Неопределено - возвращает в этом параметре подготовленные наборы значений -// доступа. Описание колонок см. в функции УправлениеДоступом.ТаблицаНаборыЗначенийДоступа. +// Таблица - см. УправлениеДоступом.ТаблицаНаборыЗначенийДоступа +// - Неопределено - возвращает в этом параметре подготовленные наборы значений доступа. // Если передано Неопределено, то будет создана и заполнена новая таблица наборов значений доступа. // // СсылкаНаПодчиненныйОбъект - ЛюбаяСсылка - используется, когда нужно заполнить наборы значений @@ -1679,7 +1723,7 @@ // Предназначена для вызова из оперативного обработчика обновления. // // Параметры: -// ЗаменяемыеРоли - Соответствие: +// ЗаменяемыеРоли - Соответствие из КлючИЗначение: // * Ключ - Строка - имя заменяемой роли, например "ЧтениеБазовойНСИ". Если роль была удалена, // то к имени нужно добавить приставку "? ", например "? ЧтениеБазовойНСИ". // @@ -2294,13 +2338,13 @@ // Возвращаемое значение: // Структура: // * ВнутренниеДанные - Структура - данные для передачи в функцию СтруктураОграничения. -// * ПоляТаблиц - Соответствие: +// * ПоляТаблиц - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя коллекции объектов метаданных, например, Справочники. -// ** Значение - Соответствие: +// ** Значение - Соответствие из КлючИЗначение: // *** Ключ - Строка - имя таблицы (объекта метаданных) в верхнем регистре. // *** Значение - Структура: // **** ТаблицаСуществует - Булево - Ложь (для заполнения Истина, если существует). -// **** Поля - Соответствие: +// **** Поля - Соответствие из КлючИЗначение: // ***** Ключ - Строка - имя реквизита в верхнем регистре, в том числе через точки, // например, "ВЛАДЕЛЕЦ.ОРГАНИЗАЦИЯ", "ТОВАРЫ.НОМЕНКЛАТУРА". // ***** Значение - Структура: @@ -2320,18 +2364,18 @@ // Поля после первой точки могут относится только к коллекциям: "Реквизиты", // "СтандартныеРеквизиты", "ПризнакиУчета", "РеквизитыАдресации". Для этих // частей имени поля не требуется уточнять коллекцию. -// ****** СодержитТипы - Соответствие: +// ****** СодержитТипы - Соответствие из КлючИЗначение: // ******* Ключ - Строка - полное имя ссылочной таблицы в верхнем регистре. // ******* Значение - Структура: // ******** ИмяТипа - Строка - имя типа, наличие которого нужно проверить. // ******** СодержитТип - Булево - Ложь (для заполнения Истина, // если у поля последнего поля есть тип). -// **** Предопределенные - Соответствие: +// **** Предопределенные - Соответствие из КлючИЗначение: // ***** Ключ - Строка - имя предопределенного элемента. // ***** Значение - Структура: // ****** ИмяСуществует - Булево - Ложь (для заполнения Истина, если предопределенный есть). // -// **** Расширения - Соответствие: +// **** Расширения - Соответствие из КлючИЗначение: // ***** Ключ - Строка - имя третьего имени таблицы, например, имя табличной части. // ***** Значение - Структура: // ****** ТаблицаСуществует - Булево - Ложь (для заполнения Истина, если существует). @@ -2446,7 +2490,7 @@ // *** Значение - Строка - полное имя таблицы // ** ПроверятьТипыКромеУказанных - Булево - если Истина, то все типы свойства Поле, // кроме указанных в свойстве Типы. -// ** УточненияСравнения - Соответствие: +// ** УточненияСравнения - Соответствие из КлючИЗначение: // *** Ключ - Строка - уточняемое значение "Неопределено", "Null", "ПустаяСсылка", // <полное имя таблицы>, "Число", "Строка", "Дата", "Булево". // *** Значение - Строка - результат "Ложь", "Истина". diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl index f17e4eb00..b0dd667f3 100644 --- a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl @@ -44,44 +44,31 @@ КонецПроцедуры -// Позволяет указать списки, у которых объекты метаданных содержат описание логики ограничения -// доступа в модулях менеджеров или переопределяемом модуле. +// Позволяет указать объекты метаданных, для которых задана логика ограничения доступа к данным. +// В модулях менеджеров указанных списков размещается процедура обработчика, например: // -// В модулях менеджеров указанных списков должна быть размещена процедура обработчика, -// в которую передаются следующие параметры. -// -// Ограничение - Структура - со свойствами: -// * Текст - Строка - ограничение доступа для пользователей. -// Если пустая строка, значит, доступ разрешен. -// * ТекстДляВнешнихПользователей - Строка - ограничение доступа для внешних пользователей. -// Если пустая строка, значит, доступ запрещен. -// * ПоВладельцуБезЗаписиКлючейДоступа - Неопределено - определить автоматически. -// - Булево - если Ложь, то всегда записывать ключи доступа, -// если Истина, тогда не записывать ключи доступа, -// а использовать ключи доступа владельца (требуется, -// чтобы ограничение было строго по объекту-владельцу). -/// * ПоВладельцуБезЗаписиКлючейДоступаДляВнешнихПользователей - Неопределено, Булево - см. -// описание предыдущего параметра. -// -// Далее пример процедуры для модуля менеджера. -// -//// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа. +//// Параметры: +//// Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение. +//// //Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт // -// Ограничение.Текст = -// "РазрешитьЧтениеИзменение -// |ГДЕ -// | ЗначениеРазрешено(Организация) -// | И ЗначениеРазрешено(Контрагент)"; +// Ограничение.Текст = +// "РазрешитьЧтениеИзменение +// |ГДЕ +// | ЗначениеРазрешено(Организация) +// | И ЗначениеРазрешено(Контрагент)"; // //КонецПроцедуры // +// Логика ограничения доступа к данным также может быть переопределена в процедуре +// УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа. +// // Параметры: -// Списки - Соответствие - списки с ограничением доступа: +// Списки - Соответствие из КлючИЗначение - списки с ограничением доступа: // * Ключ - ОбъектМетаданных - список с ограничением доступа. // * Значение - Булево - Истина - текст ограничения в модуле менеджера, -// Ложь - текст ограничения в этом переопределяемом. -// модуле в процедуре ПриЗаполненииОграниченияДоступа. +// Ложь - текст ограничения в этом переопределяемом +// модуле в процедуре ПриЗаполненииОграниченияДоступа. // Процедура ПриЗаполненииСписковСОграничениемДоступа(Списки) Экспорт @@ -172,15 +159,15 @@ // * НачальноеЗначение - Булево - начальное значение флажка права при добавлении новой строки // в форме "Права доступа". // -// * ТребуемыеПрава - Массив Из Строка - имена прав, требуемых для этого права - +// * ТребуемыеПрава - Массив из Строка - имена прав, требуемых для этого права - // например, право "ДобавлениеФайлов" требует права "ИзменениеФайлов". // -// * ЧтениеВТаблицах - Массив Из Строка - полные имена таблиц, для которых это право обозначает право Чтение. +// * ЧтениеВТаблицах - Массив из Строка - полные имена таблиц, для которых это право обозначает право Чтение. // Возможно использование символа "*", который обозначает "для всех остальных таблиц", // т.к. право Чтение может зависеть только от права Чтение, то имеет смысл только символ "*" // (требуется для работы шаблонов ограничения доступа). // -// * ИзменениеВТаблицах - Массив Из Строка - полные имена таблиц, для которых это право обозначает право Изменение. +// * ИзменениеВТаблицах - Массив из Строка - полные имена таблиц, для которых это право обозначает право Изменение. // Возможно использование символа "*", который обозначает "для всех остальных таблиц" // (требуется для работы шаблонов ограничения доступа). // @@ -217,8 +204,18 @@ // В процедуре ПриЗаполненииСписковСОграничениемДоступа нужно // указать для списка значение Ложь, иначе вызова не будет. // -// Ограничение - Структура - со свойствами, как для процедур в модулях менеджеров. См. свойства -// в комментарии к процедуре ПриЗаполненииСписковСОграничениемДоступа. +// Ограничение - Структура: +// * Текст - Строка - ограничение доступа для пользователей. +// Если пустая строка, значит, доступ разрешен. +// * ТекстДляВнешнихПользователей - Строка - ограничение доступа для внешних пользователей. +// Если пустая строка, значит, доступ запрещен. +// * ПоВладельцуБезЗаписиКлючейДоступа - Неопределено - определить автоматически. +// - Булево - если Ложь, то всегда записывать ключи доступа, +// если Истина, тогда не записывать ключи доступа, +// а использовать ключи доступа владельца (требуется, +// чтобы ограничение было строго по объекту-владельцу). +// * ПоВладельцуБезЗаписиКлючейДоступаДляВнешнихПользователей - Неопределено, Булево - также +// как у параметра ПоВладельцуБезЗаписиКлючейДоступа. // Процедура ПриЗаполненииОграниченияДоступа(Список, Ограничение) Экспорт diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl index ed58d2508..2988c0d04 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl @@ -556,6 +556,10 @@ Возврат; КонецЕсли; + Если ВключитьЗадание И ЭтоСеансФоновогоОбновленияДоступа() Тогда + Возврат; + КонецЕсли; + Если Не ТранзакцияАктивна() Или ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ИзменитьРегламентноеЗаданиеОбновленияДоступа(ВключитьЗадание); @@ -632,7 +636,7 @@ // Структура: // * ОграниченияВРолях - Структура: // ** ДляПользователей - Соответствие - со свойствами, как для внешних пользователей (ниже). -// ** ДляВнешнихПользователей - Соответствие: +// ** ДляВнешнихПользователей - Соответствие из КлючИЗначение: // *** Ключ - Строка - полное имя объекта метаданных (списка). Имя коллекции на английском. // В форме объекта должна вставка ПриЧтенииНаСервере. // *** Значение - Структура: @@ -641,7 +645,7 @@ // **** Параметры - Массив из Строка - параметры шаблона (для объекта 1, для регистра 6). // Например, имя поля "Владелец" или опорного поля регистра "Организация". // -// * ПредопределенныеИдентификаторы - Соответствие: +// * ПредопределенныеИдентификаторы - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя требуемого предопределенного элемента справочника // ИдентификаторыОбъектовМетаданных или ИдентификаторыОбъектовРасширений // в формате "<ИмяСправочника>.<ИмяПредопределенного>". @@ -657,19 +661,19 @@ // * ЗначенияДоступа - Массив - полные имена типов ссылки (имя коллекции на английском). // Для дополнения определяемого типа ЗначениеДоступа. // -// * ТипыИзмеренийРегистровКлючей - Соответствие - со свойствами: +// * ТипыИзмеренийРегистровКлючей - Соответствие из КлючИЗначение: // Для измерений с именем Поле регистра КлючиДоступаКРегистрам и регистров КлючиДоступаКРегистру<*>: // ** Ключ - Строка - имя регистра. // ** Значение - Структура: // *** ИменаТипов - Массив из Строка - полные имена типов (на английском). -// *** ПоляРегистров - Соответствие: +// *** ПоляРегистров - Соответствие из КлючИЗначение: // **** Ключ - Строка - полное имя регистра, который ограничивается. // **** Значение - Массив из Структура: // ***** Поле - Строка - имя поля регистра. // ***** Тип - ОписаниеТипов - типы поля регистра. // Порядок полей в массиве соответствуют // служебным полям Поле1, Поле2, ... -// *** ПоляРегистровПоТипам - Соответствие: +// *** ПоляРегистровПоТипам - Соответствие из КлючИЗначение: // **** Ключ - Строка - полное имя типа (на английском). // **** Значение - Массив из Строка - полные имена полей, например, // "РегистрСведений.ДополнительныеСведения.Свойство". @@ -766,7 +770,7 @@ // Параметры: // ПолноеИмя - Строка - полное имя объекта метаданных. // ДополнительныеПараметры - Неопределено - проверить и вернуть текущее ограничение. -// - Структура: +// - Структура: // * Текст - Строка - новый текст ограничения для пользователей. // * ТекстДляВнешнихПользователей - Строка - новый текст ограничения для внешних пользователей. // * УчитыватьЗависимости - Булево - учитывать зависимости между ограничениями объектов. @@ -791,8 +795,10 @@ // - Строка - текст ошибки. // * ОшибкаФормированияТекстовЗапросов - Неопределено // - Строка - текст ошибки. -// * ОграничениеПоВладельцуВозможно - Неопределено -// - Булево - свойство проверенного ограничения. +// * ОграничениеПоВладельцуВозможно - Неопределено +// - Булево - свойство проверенного ограничения. +// * ОграничениеПоВладельцуИспользуется - Неопределено +// - Булево - когда УчитыватьЗависимости указано Истина. // * ОграниченияВРолях - Неопределено // - Структура: // * ШаблонДляОбъекта - Булево - если Истина, тогда используется шаблон #ДляОбъекта, @@ -1145,8 +1151,37 @@ КонецФункции -// Только для внутреннего использования. -Процедура ЗапланироватьОбновлениеПараметровОграниченияДоступа(Описание) Экспорт +// Параметры: +// Описание - Строка - имя процедуры, которая вызвала планирование, +// используемое для расширенной регистрации в журнале. +// ЗапуститьОбновление - Булево - если Истина, то планирование будет +// негарантированным, так как при наличии транзакции +// выполняется в фоне "как есть" для возможности запуска обновления. +// +Процедура ЗапланироватьОбновлениеПараметровОграниченияДоступа(Описание, ЗапуститьОбновление = Ложь) Экспорт + + Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда + Возврат; + КонецЕсли; + + Если Не ТранзакцияАктивна() Или Не ЗапуститьОбновление Тогда + ЗаписатьПланированиеОбновленияПараметровОграниченияДоступа(Описание, ЗапуститьОбновление); + Возврат; + КонецЕсли; + + ПараметрыПроцедуры = Новый Массив; + ПараметрыПроцедуры.Добавить(Описание); + ПараметрыПроцедуры.Добавить(ЗапуститьОбновление); + + ФоновыеЗадания.Выполнить( + "УправлениеДоступомСлужебный.ЗаписатьПланированиеОбновленияПараметровОграниченияДоступа", + ПараметрыПроцедуры,, НСтр("ru = 'Управление доступом: планирование обновления доступа'", + ОбщегоНазначения.КодОсновногоЯзыка())); + +КонецПроцедуры + +// Только для процедуры ЗапланироватьОбновлениеПараметровОграниченияДоступа. +Процедура ЗаписатьПланированиеОбновленияПараметровОграниченияДоступа(Описание, ЗапуститьОбновление) Экспорт Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда Возврат; @@ -1159,6 +1194,9 @@ Идентификатор = СлужебныйИдентификатор("РегистрСведений.ПараметрыОграниченияДоступа"); Если Идентификатор <> Null Тогда ЗапланироватьОбновлениеДоступа(Идентификатор, ПараметрыПланирования); + Если ЗапуститьОбновление Тогда + ЗапуститьОбновлениеДоступа(); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -1194,6 +1232,40 @@ КонецПроцедуры +// Для функции ПраваРолейРасширений и функции ЗаполнитьВсеПараметрыРаботыРасширений +// модуля менеджера регистра сведений ПараметрыРаботыВерсийРасширений. +// +Процедура УстановитьЗаписьПараметровОграниченияДоступаВТекущемСеансе(Включить) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТекущиеПараметры = ПараметрыСеанса.ПараметрыОграниченияДоступа; + ИмяСвойства = "ЗаписьПараметровОграниченияДоступаВТекущемСеансе"; + + Если Не Включить И Не ТекущиеПараметры.Свойство(ИмяСвойства) Тогда + Возврат; + КонецЕсли; + + НовыеПараметры = Новый Структура(ТекущиеПараметры); + + Если Включить Тогда + Если Не НовыеПараметры.Свойство(ИмяСвойства) Тогда + НовыеПараметры.Вставить(ИмяСвойства, 0); + КонецЕсли; + НовыеПараметры[ИмяСвойства] = НовыеПараметры[ИмяСвойства] + 1; + Иначе + НовыеПараметры[ИмяСвойства] = НовыеПараметры[ИмяСвойства] - 1; + Если НовыеПараметры[ИмяСвойства] < 1 Тогда + НовыеПараметры.Удалить(ИмяСвойства); + КонецЕсли; + КонецЕсли; + + ПараметрыСеанса.ПараметрыОграниченияДоступа = Новый ФиксированнаяСтруктура(НовыеПараметры); + + УстановитьПривилегированныйРежим(Ложь); + +КонецПроцедуры + #КонецОбласти //////////////////////////////////////////////////////////////////////////////// @@ -1357,10 +1429,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт // Обработчики обновления неразделенных данных. @@ -1378,11 +1446,6 @@ Обработчик.РежимВыполнения = "Оперативно"; Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации"; - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "УправлениеДоступомСлужебный.ЗаполнитьНаименованиеПредопределенныхЭлементов"; - // Должен выполнятся после обработчика ЗаполнитьИдентификаторыПоставляемыхДанных. Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.0.0.1"; @@ -1412,6 +1475,11 @@ Обработчик.ЧитаемыеОбъекты = "Справочник.ГруппыДоступа"; Обработчик.ИзменяемыеОбъекты = "РегистрСведений.ТаблицыГруппДоступа,РегистрСведений.ЗначенияГруппДоступа,РегистрСведений.ЗначенияГруппДоступаПоУмолчанию"; + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); + НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить(); + НоваяСтрока.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию"; + НоваяСтрока.Порядок = "До"; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "3.1.3.135"; Обработчик.Процедура = "РегистрыСведений.ГруппыЗначенийДоступа.ОбработатьДанныеДляПереходаНаНовуюВерсию"; @@ -1436,6 +1504,18 @@ КонецПроцедуры +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек +// +// Параметры: +// Объекты - Массив из ОбъектМетаданных +// +Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт + + Объекты.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа); + Объекты.Добавить(Метаданные.Справочники.ГруппыДоступа); + +КонецПроцедуры + // См. ОбновлениеИнформационнойБазыБСП.ПослеОбновленияИнформационнойБазы. Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт @@ -1461,11 +1541,7 @@ КонецПроцедуры -// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок -// -// Параметры: -// ИсключенияПоискаСсылок - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// +// См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.РегистрыСведений.ГруппыЗначенийДоступа); @@ -2068,6 +2144,259 @@ КонецПроцедуры +// Процедуры и функции подсистемы ЦентрМониторинга. + +// Возвращает текст запроса для сбора статистической информации об использовании профилей групп доступа и ролей. +// +Функция ТекстЗапросаИспользованияРолей() Экспорт + + Возврат + "ВЫБРАТЬ + | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, + | СведенияОПользователях.Пользователь КАК Пользователь, + | ВЫБОР + | КОГДА РАЗНОСТЬДАТ(СведенияОПользователях.ДатаПоследнейАктивности, &ТекущаяДата, ДЕНЬ) <= 7 + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК АктивныхЗаНеделю, + | ВЫБОР + | КОГДА РАЗНОСТЬДАТ(СведенияОПользователях.ДатаПоследнейАктивности, &ТекущаяДата, ДЕНЬ) <= 30 + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК АктивныхЗаМесяц + |ПОМЕСТИТЬ ВТСоставыГруппИАктивность + |ИЗ + | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях + | ПО СоставыГруппПользователей.Пользователь = СведенияОПользователях.Пользователь + |ГДЕ + | СоставыГруппПользователей.Используется + | И НЕ СоставыГруппПользователей.Пользователь.ИдентификаторПользователяИБ = &ПустойУИД + | + |ИНДЕКСИРОВАТЬ ПО + | ГруппаПользователей, + | Пользователь + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПрофилиГруппДоступа.Ссылка КАК Профиль, + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, + | ПрофилиГруппДоступа.Наименование КАК Наименование, + | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа, + | ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) + | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = НЕОПРЕДЕЛЕНО КАК ОбщаяГруппаДоступа, + | ГруппыДоступаПользователи.Пользователь КАК ПользовательТЧ, + | СоставыГруппПользователей.Пользователь КАК ПользовательРС, + | СоставыГруппПользователей.АктивныхЗаНеделю КАК АктивныхЗаНеделю, + | СоставыГруппПользователей.АктивныхЗаМесяц КАК АктивныхЗаМесяц + |ПОМЕСТИТЬ ВТДанныеПрофилей + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСоставыГруппИАктивность КАК СоставыГруппПользователей + | ПО ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + | ПО (ПрофилиГруппДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль) + | И (НЕ ГруппыДоступаПользователи.Ссылка.Профиль.ПометкаУдаления) + |ГДЕ + | НЕ ГруппыДоступаПользователи.Ссылка.Профиль.ПометкаУдаления + | + |СГРУППИРОВАТЬ ПО + | ПрофилиГруппДоступа.Ссылка, + | ПрофилиГруппДоступа.Наименование, + | ГруппыДоступаПользователи.Пользователь, + | СоставыГруппПользователей.Пользователь, + | СоставыГруппПользователей.АктивныхЗаНеделю, + | СоставыГруппПользователей.АктивныхЗаМесяц, + | ГруппыДоступаПользователи.Ссылка, + | ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) + | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = НЕОПРЕДЕЛЕНО, + | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных, + | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВТДанныеПрофилей.Профиль КАК Профиль, + | ВТДанныеПрофилей.Наименование КАК Наименование, + | ВТДанныеПрофилей.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | ВТДанныеПрофилей.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен + |ПОМЕСТИТЬ Профили + |ИЗ + | ВТДанныеПрофилей КАК ВТДанныеПрофилей + | + |ИНДЕКСИРОВАТЬ ПО + | Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Профили.Профиль КАК Профиль, + | СУММА(ВЫБОР + | КОГДА НЕ ПрофилиГруппДоступаВидыДоступа.ВидДоступа ЕСТЬ NULL + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ВсегоВидовДоступа, + | СУММА(ВЫБОР + | КОГДА ЕСТЬNULL(ПрофилиГруппДоступаВидыДоступа.Предустановленный, ЛОЖЬ) + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ПредустановленныхВидовДоступа + |ПОМЕСТИТЬ ВидыДоступа + |ИЗ + | Профили КАК Профили + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа + | ПО Профили.Профиль = ПрофилиГруппДоступаВидыДоступа.Ссылка + | + |СГРУППИРОВАТЬ ПО + | Профили.Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Вложенный.Профиль КАК Профиль, + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Вложенный.ГруппаДоступа) КАК ГруппаДоступа, + | СУММА(ВЫБОР + | КОГДА НЕ Вложенный.ОбщаяГруппаДоступа + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ПерсональнаяГруппа + |ПОМЕСТИТЬ ГруппыДоступа + |ИЗ + | (ВЫБРАТЬ + | ВТДанныеПрофилей.Профиль КАК Профиль, + | ВТДанныеПрофилей.ГруппаДоступа КАК ГруппаДоступа, + | ВТДанныеПрофилей.ОбщаяГруппаДоступа КАК ОбщаяГруппаДоступа + | ИЗ + | ВТДанныеПрофилей КАК ВТДанныеПрофилей + | + | СГРУППИРОВАТЬ ПО + | ВТДанныеПрофилей.Профиль, + | ВТДанныеПрофилей.ГруппаДоступа, + | ВТДанныеПрофилей.ОбщаяГруппаДоступа) КАК Вложенный + | + |СГРУППИРОВАТЬ ПО + | Вложенный.Профиль + | + |ИНДЕКСИРОВАТЬ ПО + | Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Вложенный.Профиль КАК Профиль, + | СУММА(ВЫБОР + | КОГДА Вложенный.ПользовательТЧ ССЫЛКА Справочник.ГруппыПользователей + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ГруппПользователей, + | СУММА(ВЫБОР + | КОГДА Вложенный.ПользовательТЧ ССЫЛКА Справочник.ГруппыВнешнихПользователей + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ГруппВнешнихПользователей + |ПОМЕСТИТЬ ГруппыПользователей + |ИЗ + | (ВЫБРАТЬ + | ВТДанныеПрофилей.Профиль КАК Профиль, + | ВТДанныеПрофилей.ПользовательТЧ КАК ПользовательТЧ + | ИЗ + | ВТДанныеПрофилей КАК ВТДанныеПрофилей + | + | СГРУППИРОВАТЬ ПО + | ВТДанныеПрофилей.Профиль, + | ВТДанныеПрофилей.ПользовательТЧ) КАК Вложенный + | + |СГРУППИРОВАТЬ ПО + | Вложенный.Профиль + | + |ИНДЕКСИРОВАТЬ ПО + | Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Вложенный.Профиль КАК Профиль, + | СУММА(ВЫБОР + | КОГДА Вложенный.ПользовательРС ССЫЛКА Справочник.Пользователи + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК Пользователи, + | СУММА(ВЫБОР + | КОГДА Вложенный.ПользовательРС ССЫЛКА Справочник.ВнешниеПользователи + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ) КАК ВнешниеПользователи, + | СУММА(Вложенный.АктивныхЗаНеделю) КАК АктивныхЗаНеделю, + | СУММА(Вложенный.АктивныхЗаМесяц) КАК АктивныхЗаМесяц + |ПОМЕСТИТЬ ПользователиПрофиля + |ИЗ + | (ВЫБРАТЬ + | ВТДанныеПрофилей.Профиль КАК Профиль, + | ВТДанныеПрофилей.ПользовательРС КАК ПользовательРС, + | СУММА(ВТДанныеПрофилей.АктивныхЗаНеделю) КАК АктивныхЗаНеделю, + | СУММА(ВТДанныеПрофилей.АктивныхЗаМесяц) КАК АктивныхЗаМесяц + | ИЗ + | ВТДанныеПрофилей КАК ВТДанныеПрофилей + | + | СГРУППИРОВАТЬ ПО + | ВТДанныеПрофилей.Профиль, + | ВТДанныеПрофилей.ПользовательРС) КАК Вложенный + | + |СГРУППИРОВАТЬ ПО + | Вложенный.Профиль + | + |ИНДЕКСИРОВАТЬ ПО + | Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Профили.Профиль КАК Профиль, + | Профили.Наименование КАК Наименование, + | Профили.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, + | Профили.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, + | ЕСТЬNULL(ГруппыДоступа.ГруппаДоступа, 0) КАК ГруппаДоступа, + | ЕСТЬNULL(ГруппыДоступа.ПерсональнаяГруппа, 0) КАК ПерсональнаяГруппа, + | ЕСТЬNULL(ГруппыПользователей.ГруппПользователей, 0) КАК ГруппПользователей, + | ЕСТЬNULL(ГруппыПользователей.ГруппВнешнихПользователей, 0) КАК ГруппВнешнихПользователей, + | ЕСТЬNULL(ПользователиПрофиля.Пользователи, 0) КАК Пользователи, + | ЕСТЬNULL(ПользователиПрофиля.ВнешниеПользователи, 0) КАК ВнешниеПользователи, + | ЕСТЬNULL(ПользователиПрофиля.АктивныхЗаНеделю, 0) КАК АктивныхЗаНеделю, + | ЕСТЬNULL(ПользователиПрофиля.АктивныхЗаМесяц, 0) КАК АктивныхЗаМесяц, + | ЕСТЬNULL(ВидыДоступа.ВсегоВидовДоступа, 0) КАК ВсегоВидовДоступа, + | ЕСТЬNULL(ВидыДоступа.ПредустановленныхВидовДоступа, 0) КАК ПредустановленныхВидовДоступа + |ИЗ + | Профили КАК Профили + | ЛЕВОЕ СОЕДИНЕНИЕ ПользователиПрофиля КАК ПользователиПрофиля + | ПО Профили.Профиль = ПользователиПрофиля.Профиль + | ЛЕВОЕ СОЕДИНЕНИЕ ГруппыПользователей КАК ГруппыПользователей + | ПО Профили.Профиль = ГруппыПользователей.Профиль + | ЛЕВОЕ СОЕДИНЕНИЕ ГруппыДоступа КАК ГруппыДоступа + | ПО Профили.Профиль = ГруппыДоступа.Профиль + | ЛЕВОЕ СОЕДИНЕНИЕ ВидыДоступа КАК ВидыДоступа + | ПО Профили.Профиль = ВидыДоступа.Профиль + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | Профили.Профиль КАК Профиль, + | ЕСТЬNULL(ПрофилиГруппДоступаРоли.Роль.Имя, """") КАК РольИмя + |ИЗ + | Профили КАК Профили + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + | ПО Профили.Профиль = ПрофилиГруппДоступаРоли.Ссылка + | И (Профили.ИдентификаторПоставляемыхДанных = &ПустойУИД + | ИЛИ Профили.ПоставляемыйПрофильИзменен) + | + |УПОРЯДОЧИТЬ ПО + | Профиль"; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -2973,7 +3302,7 @@ КонецЦикла; - Если КоличествоДанных < 10000 И Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина) Тогда + Если КоличествоДанных < 10000 И Не УправлениеДоступом.ПроизводительныйВариант() Тогда // Заполнение регистра сведений НаборыЗначенийДоступа. ТипыОбъектов = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( @@ -3007,7 +3336,7 @@ КонецЕсли; // Обновление кэш-реквизитов в наборах значений доступа. - Если КоличествоДанных < 10000 И Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина) Тогда + Если КоличествоДанных < 10000 И Не УправлениеДоступом.ПроизводительныйВариант() Тогда ТипыЗначенийДоступа = СвойстваВидовДоступа.ПоТипамЗначений; ТипыЗначенийДоступаСГруппами = СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; @@ -4560,19 +4889,6 @@ КонецПроцедуры -// Заполняет наименования предопределенного профиля Администратор и группы Администраторы. -Процедура ЗаполнитьНаименованиеПредопределенныхЭлементов() Экспорт - - ПрофильАдминистратор = Справочники.ПрофилиГруппДоступа.Администратор.ПолучитьОбъект(); - ПрофильАдминистратор.Наименование = НСтр("ru = 'Администратор'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ПрофильАдминистратор); - - ГруппаАдминистраторы = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); - ГруппаАдминистраторы.Наименование = НСтр("ru = 'Администраторы'"); - ОбновлениеИнформационнойБазы.ЗаписатьОбъект(ГруппаАдминистраторы); - -КонецПроцедуры - // Только для внутреннего использования. Процедура ОбновитьВспомогательныеДанныеГруппДоступа(Параметры) Экспорт @@ -4590,7 +4906,14 @@ ПраваРолейРасширений = Неопределено; - ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений); + УстановитьЗаписьПараметровОграниченияДоступаВТекущемСеансе(Истина); + Попытка + ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(ПраваРолейРасширений); + Исключение + УстановитьЗаписьПараметровОграниченияДоступаВТекущемСеансе(Ложь); + ВызватьИсключение; + КонецПопытки; + УстановитьЗаписьПараметровОграниченияДоступаВТекущемСеансе(Ложь); Возврат ПраваРолейРасширений; @@ -4685,9 +5008,8 @@ НачатьТранзакцию(); Попытка Блокировка.Заблокировать(); - Если ПараметрыОбновления <> Неопределено // Не первое обновление. - И Справочники.ВерсииРасширений.РасширенияИзмененыДинамически() Тогда - ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияРасширенийПрограммы(); + Если ПараметрыОбновления <> Неопределено Тогда // Не первое обновление. + ПроверитьАктуальностьМетаданных(); КонецЕсли; Если УстановитьНовыеПраваРолейРасширений Тогда; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения( @@ -5351,7 +5673,7 @@ КонецЕсли; Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() - И Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина) Тогда + И Не УправлениеДоступом.ПроизводительныйВариант() Тогда Если Метаданные.НайтиПоТипу(ТипЗначенияОбъект).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда @@ -5665,6 +5987,7 @@ Если Константы.ИспользоватьВнешнихПользователей.Получить() Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИсключитьВнешнихПользователей", "Истина"); Иначе + // @query-part-2 Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИсключитьВнешнихПользователей", "ТИПЗНАЧЕНИЯ(ПроверяемыеПользователи.Пользователь) = ТИП(Справочник.Пользователи)"); КонецЕсли; @@ -6841,27 +7164,27 @@ // Возвращаемое значение: // ФиксированнаяСтруктура: // * Массив - ФиксированныйМассив из см. СвойстваВидаДоступа -// * ПоИменам - ФиксированноеСоответствие: +// * ПоИменам - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка // * Значение - см. СвойстваВидаДоступа -// * ПоСсылкам - ФиксированноеСоответствие: +// * ПоСсылкам - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - СправочникСсылка // * Значение - см. СвойстваВидаДоступа -// * ПоТипамЗначений - ФиксированноеСоответствие: +// * ПоТипамЗначений - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа -// * ПоТипамГруппИЗначений - ФиксированноеСоответствие: +// * ПоТипамГруппИЗначений - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа -// * ПоТипамЗначенийСИерархией - ФиксированноеСоответствие: +// * ПоТипамЗначенийСИерархией - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа -// * ЗначенияДоступаСГруппами - ФиксированноеСоответствие: +// * ЗначенияДоступаСГруппами - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. ЗначенияДоступаСГруппами // * БезГруппДляЗначенияДоступа - ФиксированныйМассив из Строка // * СОднойГруппойДляЗначенияДоступа - ФиксированныйМассив из Строка -// * ТипыЗначенийДоступаСГруппами - ФиксированноеСоответствие: +// * ТипыЗначенийДоступаСГруппами - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - СправочникСсылка // * ВладелецНаборовЗначенийДоступа - см. СтрокаДанныхДляХеширования. @@ -7089,17 +7412,17 @@ // // Возвращаемое значение: // Структура: -// * ПоТипам - Соответствие: +// * ПоТипам - Соответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа -// * ПоТипамСсылок - Соответствие: +// * ПоТипамСсылок - Соответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа // * ИменаТаблицДляОбновления - Массив из Строка -// * ТипыГруппЗначенийДляОбновления - Соответствие: +// * ТипыГруппЗначенийДляОбновления - Соответствие из КлючИЗначение: // * Ключ - Тип // * Значение - СправочникСсылка -// * ПоТипамСсылокДляОбновления - Соответствие: +// * ПоТипамСсылокДляОбновления - Соответствие из КлючИЗначение: // * Ключ - Тип // * Значение - см. СвойстваВидаДоступа // @@ -7361,7 +7684,7 @@ КонецПроцедуры // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Строка // @@ -7546,10 +7869,10 @@ // ТаблицаЗначений - если ДляПроверки = Ложь, состав колонок: // Таблица - Строка - имя таблицы объекта метаданных, например, Справочник.Файлы. // Право - Строка: "Чтение", "Изменение". -// ВидДоступа - Ссылка - пустая ссылка основного типа значений вида доступа, +// ВидДоступа - ЛюбаяСсылка - пустая ссылка основного типа значений вида доступа, // пустая ссылка владельца настроек прав. // - Неопределено - для вида доступа Объект. -// ТаблицаОбъекта - Ссылка - пустая ссылка объекта метаданных, через который ограничивается доступ, +// ТаблицаОбъекта - ЛюбаяСсылка - пустая ссылка объекта метаданных, через который ограничивается доступ, // используя наборы значений доступа, например, Справочник.ПапкиФайлов. // - Неопределено - если ВидДоступа <> Неопределено. // @@ -7724,7 +8047,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Строка // @@ -7978,14 +8301,29 @@ // Изменение - Булево // ВызыватьИсключение - Булево // ПроверитьТолькоСтаруюВерсию - Булево -// +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - Неопределено - проверить для текущего пользователя. +// // Возвращаемое значение: // Булево // Функция ДоступРазрешен(ОписаниеДанных, Изменение, ВызыватьИсключение = Ложь, - ПроверитьТолькоСтаруюВерсию = Ложь) Экспорт + ПроверитьТолькоСтаруюВерсию = Ложь, Знач Пользователь = Неопределено) Экспорт - Если Пользователи.ЭтоПолноправныйПользователь() Тогда + УчитыватьПривилегированныйРежим = Истина; + ПользовательИБ = Неопределено; + + Если Пользователь <> Неопределено + И Пользователь = Пользователи.АвторизованныйПользователь() Тогда + + Пользователь = Неопределено; + УчитыватьПривилегированныйРежим = Ложь; + ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); + КонецЕсли; + + Если Пользователь = Неопределено + И Пользователи.ЭтоПолноправныйПользователь(,, УчитыватьПривилегированныйРежим) Тогда Возврат Истина; КонецЕсли; @@ -7996,37 +8334,142 @@ |Ожидалась ссылка, объект, ключ записи или набор записей. |Передано значение: %3 (тип %4).'"), "ОписаниеДанных", - ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", - "УправлениеДоступом.ЧтениеРазрешено"), + ?(ВызыватьИсключение, + ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + "УправлениеДоступом.ПроверитьЧтениеРазрешено"), + ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + "УправлениеДоступом.ЧтениеРазрешено")), Строка(ОписаниеДанных), Строка(ТипЗнч(ОписаниеДанных))); ВызватьИсключение ТекстОшибки; КонецЕсли; - ИмяПраваДоступа = ?(Изменение, "Изменение", "Чтение"); + ПроизводительныйВариант = УправлениеДоступом.ПроизводительныйВариант(); + Если Пользователь <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр( + ?(ВызыватьИсключение, + ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + "УправлениеДоступом.ПроверитьЧтениеРазрешено"), + ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + "УправлениеДоступом.ЧтениеРазрешено")), + "Пользователь", + Пользователь, + Новый ОписаниеТипов("СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи")); + + Если Не ПроизводительныйВариант Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |В стандартном варианте ограничения доступа поддерживается только %3. + |Передано значение: %4 (тип %5).'"), + "Пользователь", + ?(ВызыватьИсключение, + ?(Изменение, "УправлениеДоступом.ПроверитьИзменениеРазрешено", + "УправлениеДоступом.ПроверитьЧтениеРазрешено"), + ?(Изменение, "УправлениеДоступом.ИзменениеРазрешено", + "УправлениеДоступом.ЧтениеРазрешено")), + "Неопределено", + Строка(Пользователь), + Строка(ТипЗнч(Пользователь))); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Если ВызыватьИсключение Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вызов исключения поддерживается только для текущего пользователя. + |В %1 + |- либо недопустимое значение параметра %2 + |передано значение: %3 (тип %4), + |- либо недопустимое значение параметра %5 + |передано значение: %6 (тип %7).'"), + "УправлениеДоступом.ДоступРазрешен", + "ВызыватьИсключение", + Строка(ВызыватьИсключение), + Строка(ТипЗнч(ВызыватьИсключение)), + "Пользователь", + Строка(Пользователь), + Строка(ТипЗнч(Пользователь))); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + Если Пользователи.ЭтоПолноправныйПользователь(Пользователь,, УчитыватьПривилегированныйРежим) Тогда + Возврат Истина; + КонецЕсли; + + ИдентификаторПользователяИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, + "ИдентификаторПользователяИБ"); + + Если ТипЗнч(ИдентификаторПользователяИБ) <> Тип("УникальныйИдентификатор") Тогда + Возврат Ложь; + КонецЕсли; + + ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ИдентификаторПользователяИБ); + + Если ПользовательИБ = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + ЛюбойОбъект = ОписаниеДанных; // СправочникОбъект + + Если Не Изменение Тогда + ИмяПраваДоступа = "Чтение"; + + ИначеЕсли ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) + И Не ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ЛюбойОбъект)) + И ЛюбойОбъект.ЭтоНовый() Тогда + + ИмяПраваДоступа = "Добавление"; + Иначе + ИмяПраваДоступа = "Изменение"; + КонецЕсли; + + ЕстьПраво = Истина; Если ВызыватьИсключение Тогда ВыполнитьПроверкуПравДоступа(ИмяПраваДоступа, ОбъектМетаданных); - ИначеЕсли Не ПравоДоступа(ИмяПраваДоступа, ОбъектМетаданных) Тогда + ИначеЕсли ПользовательИБ = Неопределено Тогда + ЕстьПраво = ПравоДоступа(ИмяПраваДоступа, ОбъектМетаданных); + + ИначеЕсли Пользователь = Неопределено Тогда + УстановитьОтключениеБезопасногоРежима(Истина); + УстановитьПривилегированныйРежим(Истина); + + ЕстьПраво = ПравоДоступа(ИмяПраваДоступа, ОбъектМетаданных, ПользовательИБ); + + УстановитьПривилегированныйРежим(Ложь); + УстановитьОтключениеБезопасногоРежима(Ложь); + Иначе + ЕстьПраво = ПравоДоступа(ИмяПраваДоступа, ОбъектМетаданных, ПользовательИБ); + КонецЕсли; + Если Не ЕстьПраво Тогда Возврат Ложь; КонецЕсли; ПолноеИмя = ОбъектМетаданных.ПолноеИмя(); - Если Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина) Тогда + Если Не ПроизводительныйВариант Тогда Возврат ЧтениеДоступно(ПолноеИмя, ОбъектМетаданных, ОписаниеДанных, ВызыватьИсключение); КонецЕсли; + Если ЗначениеЗаполнено(Пользователь) Тогда + ДляВнешнихПользователей = ТипЗнч(Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи"); + Иначе + ДляВнешнихПользователей = Неопределено; + КонецЕсли; ИдентификаторТранзакции = Новый УникальныйИдентификатор; - ПараметрыОграничения = ПараметрыОграничения(ПолноеИмя, ИдентификаторТранзакции); + ПараметрыОграничения = ПараметрыОграничения(ПолноеИмя, ИдентификаторТранзакции, ДляВнешнихПользователей); УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); ОбновитьРазрешенныеНаборыВПараметрахСеанса(); - Если ПараметрыОграничения.ОграничениеОтключено Тогда + Если ПараметрыОграничения.ОграничениеОтключено + Или Не Изменение + И ПараметрыОграничения.ОграничениеЧтенияОтключено Тогда + Возврат Истина; КонецЕсли; @@ -8038,7 +8481,7 @@ ДоступРазрешен = Ложь; Иначе Запрос = Новый Запрос; - УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос); + УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос, Пользователь); Запрос.Текст = ?(Изменение, ПараметрыОграничения.ТекстЗапросаПроверкиПравЧтениеИзменение, ПараметрыОграничения.ТекстЗапросаПроверкиПраваЧтение); @@ -8047,7 +8490,7 @@ СсылкаНаОбъект = ?(ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОписаниеДанных)), ОписаниеДанных, ОписаниеДанных.Ссылка); Запрос.УстановитьПараметр("Объект", СсылкаНаОбъект); - Если ПараметрыОграничения.ПолеВладельца <> Неопределено Тогда + Если ПараметрыОграничения.ИспользуетсяОграничениеПоВладельцу Тогда Запрос.УстановитьПараметр("ИдентификаторТаблицыНастроекПрав", ПараметрыОграничения.ИдентификаторТаблицыНастроекПрав); КонецЕсли; @@ -8062,11 +8505,26 @@ ИначеЕсли ОписаниеДанных <> СсылкаНаОбъект И Не ПроверитьТолькоСтаруюВерсию Тогда СтараяВерсия = Ложь; - Если ПараметрыОграничения.ПолеВладельца <> Неопределено Тогда + Если ПараметрыОграничения.ИспользуетсяОграничениеПоВладельцу Тогда + ПоляЧерезТочку = СтрРазделить(ПараметрыОграничения.ПолеВладельца.Имя, ".", Ложь); + ПолеОбъекта = ПоляЧерезТочку[0]; + ЗначениеПоляОбъекта = ОписаниеДанных[ПолеОбъекта]; + Если ПоляЧерезТочку.Количество() = 1 Тогда + ПараметрИзПамяти = "&Владелец"; + Иначе + ОбъектМетаданныхПоТипу = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеПоляОбъекта)); + Если ОбъектМетаданныхПоТипу = Неопределено Тогда + ПараметрИзПамяти = "&Владелец"; + ЗначениеПоляОбъекта = Null; + Иначе + ПоляЧерезТочку.Удалить(0); + ПараметрИзПамяти = "ВЫРАЗИТЬ(&Владелец КАК " + ОбъектМетаданныхПоТипу.ПолноеИмя() + + ")." + СтрСоединить(ПоляЧерезТочку, "."); + КонецЕсли; + КонецЕсли; Запрос.Текст = СтрЗаменить(Запрос.Текст, - ПараметрыОграничения.ПолеОбъектаВладельцаВЗапросеПроверкиПрав, "&Владелец"); - Запрос.УстановитьПараметр("Владелец", - ОписаниеДанных[ПараметрыОграничения.ПолеВладельца.Имя]); + ПараметрыОграничения.ПолеОбъектаВладельцаВЗапросеПроверкиПрав, ПараметрИзПамяти); + Запрос.УстановитьПараметр("Владелец", ЗначениеПоляОбъекта); Иначе МодельОбъектовВПамяти = МодельОбъектовВПамяти(ОписаниеДанных, ПараметрыОграничения); ПараметрыОбновления = Новый Структура(ПараметрыОграничения); @@ -8092,7 +8550,7 @@ ПроверкаДобавления = Ложь; ТекстЗапросаИзменения = Запрос.Текст; ЭтоНовый = ОписаниеДанных.ЭтоНовый(); - УточнитьПравоДобавление(Запрос,ЭтоНовый, ПараметрыОграничения, ПроверкаДобавления); + УточнитьПравоДобавление(Запрос, ЭтоНовый, ПараметрыОграничения, ПроверкаДобавления); ДоступРазрешен = Не Запрос.Выполнить().Пустой(); Если Не ДоступРазрешен И ПроверкаДобавления Тогда Запрос.Текст = ТекстЗапросаИзменения; @@ -8122,21 +8580,21 @@ И Не ПроверитьТолькоСтаруюВерсию Тогда СтараяВерсия = Ложь; - Если ПараметрыОграничения.ПолеВладельца <> Неопределено Тогда + Если ПараметрыОграничения.ИспользуетсяОграничениеПоВладельцу Тогда ПолеВладельца = ПараметрыОграничения.ПолеВладельца.Имя; - Комбинации = ОписаниеДанных.Выгрузить(, ПолеВладельца); + Комбинации = ОписаниеДанных.Выгрузить(, ПолеВладельца); // ТаблицаЗначений Комбинации.Свернуть(ПолеВладельца); Запрос.УстановитьПараметр("КомбинацииЗначенийОпорныхПолей", Комбинации); ТекстЗапросаПодготовкиКомбинаций = "ВЫБРАТЬ ТекущаяТаблица." + ПолеВладельца + " |ПОМЕСТИТЬ КомбинацииЗначенийОпорныхПолей - |ИЗ &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица"; + |ИЗ &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица"; // @query-part Иначе ТекстЗапросаПодготовкиКомбинаций = "ВЫБРАТЬ ТекущаяТаблица." + СтрСоединить(ПараметрыОграничения.ОпорныеПоля.Используемые, ", | ТекущаяТаблица.") + " |ПОМЕСТИТЬ КомбинацииЗначенийОпорныхПолей - |ИЗ &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица"; + |ИЗ &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица"; // @query-part ОписаниеДанных.ДополнительныеСвойства.Вставить("УправлениеДоступомИдентификаторТранзакции", ИдентификаторТранзакции); ОбновитьКлючиДоступаКНаборуЗаписей(ОписаниеДанных, Ложь, Ложь, @@ -8384,7 +8842,10 @@ Возврат; КонецЕсли; - Если Свойства.ПолеВладельца <> Неопределено Тогда + Если Свойства.ПолеВладельца <> Неопределено + И (Не Свойства.ПолеВладельца.Отключено + Или ЗначениеЗаполнено(ИмяТипаСсылки(ПолноеИмя, ТипыТаблицПоИменам))) Тогда + ПолеВладельца = Свойства.ПолеВладельца; // См. НовоеПолеВладельца ОграничениеВРоли.Параметры.Добавить(ПолеВладельца.Имя); Возврат; @@ -8521,7 +8982,7 @@ КонецЕсли; ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь() - Или Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина); + Или Не УправлениеДоступом.ПроизводительныйВариант(); Источник.ДополнительныеСвойства.Вставить("УправлениеДоступомИдентификаторТранзакции", Новый УникальныйИдентификатор); @@ -8551,7 +9012,7 @@ КонецЕсли; ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь() - Или Не ОграничиватьДоступНаУровнеЗаписейУниверсально(Ложь, Истина); + Или Не УправлениеДоступом.ПроизводительныйВариант(); // Проверка доступа к новой версии. ПроверитьДоступКИсточнику(Источник, Ложь, ЭтоНаборЗаписей, Замещение, ЭтоПолноправныйПользователь); @@ -8805,7 +9266,7 @@ Запрос.УстановитьПараметр("Объект", Источник.Ссылка); УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос); - Если ПараметрыОграничения.ПолеВладельца <> Неопределено Тогда + Если ПараметрыОграничения.ИспользуетсяОграничениеПоВладельцу Тогда Запрос.УстановитьПараметр("ИдентификаторТаблицыНастроекПрав", ПараметрыОграничения.ИдентификаторТаблицыНастроекПрав); КонецЕсли; @@ -8839,7 +9300,7 @@ // Для процедуры ПроверитьДоступКОбъекту и функции ДоступРазрешен. Процедура УточнитьПравоДобавление(Запрос, ЭтоНовый, ПараметрыОграничения, ПроверкаДобавления) - ПроверкаДобавления = ЭтоНовый И ПараметрыОграничения.ПолеВладельца = Неопределено; + ПроверкаДобавления = ЭтоНовый И Не ПараметрыОграничения.ИспользуетсяОграничениеПоВладельцу; Если Не ПроверкаДобавления Тогда Возврат; КонецЕсли; @@ -9909,6 +10370,7 @@ Или СвойстваОграничения = Неопределено Или СвойстваОграничения.ДоступЗапрещен Или СвойстваОграничения.ПолеВладельца <> Неопределено + И Не СвойстваОграничения.ПолеВладельца.Отключено Или Контекст.ПриИзмененииУчастниковГруппыДоступа И Не СвойстваОграничения.РассчитыватьПраваПользователей Тогда @@ -10012,6 +10474,8 @@ // в противном случае, наименование будет начинаться с "Запуск вручную", // блокировка обновления доступа будет снята, если была установлена, // выполнение будет продолжаться до полного завершения. +// ЭтоПерезапуск - Булево - если передать Истина, тогда текущий сеанс фонового задания не будет +// считаться незавершенным исполнителем. // // Возвращаемое значение: // Неопределено - обновление доступа не требуется или запрещено. @@ -10031,7 +10495,7 @@ // * ТекстПредупреждения - Неопределено - если запуска не было или запущено новое фоновое задание. // - Строка - описание, что обновление доступа уже запущено. // -Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь) Экспорт +Функция ЗапуститьОбновлениеДоступаНаУровнеЗаписей(ЭтоЗапускВручную = Ложь, ЭтоПерезапуск = Ложь) Экспорт УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); @@ -10058,13 +10522,25 @@ Возврат Неопределено; КонецЕсли; - Результат = Новый Структура("УжеВыполняется, ИдентификаторФоновогоЗадания, СвойстваСеанса, ТекстПредупреждения", Истина); - Исполнитель = ИсполнительОбновленияДоступа(ПоследнееОбновлениеДоступа); + ИдентификаторИсключаемогоЗадания = Неопределено; + Если ЭтоПерезапуск Тогда + ТекущееФоновоеЗадание = ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание(); + Если ТекущееФоновоеЗадание <> Неопределено Тогда + ИдентификаторИсключаемогоЗадания = ТекущееФоновоеЗадание.УникальныйИдентификатор; + КонецЕсли; + КонецЕсли; + Результат = Новый Структура("УжеВыполняется, ТекстПредупреждения, ИдентификаторФоновогоЗадания, СвойстваСеанса", Истина, ""); + Исполнитель = ИсполнительОбновленияДоступа(ПоследнееОбновлениеДоступа, ИдентификаторИсключаемогоЗадания); Если Исполнитель = Неопределено Тогда Результат.УжеВыполняется = Ложь; Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + Попытка + СтандартныеПодсистемыСервер.ПроверитьДинамическоеОбновлениеВерсииПрограммы(); + Исключение + Результат.ТекстПредупреждения = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; КонецЕсли; Если ЭтоЗапускВручную Тогда УстановитьЗапретОбновленияДоступа(Ложь); @@ -10073,18 +10549,28 @@ Иначе ПараметрыЗадания = Неопределено; КонецЕсли; + + ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы(); + НаименованиеЗадания = + ?(ЭтоЗапускВручную, + НСтр("ru = 'Запуск вручную'", ОбщегоНазначения.КодОсновногоЯзыка()), + НСтр("ru = 'Автозапуск'", ОбщегоНазначения.КодОсновногоЯзыка())) + + ": " + Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.Синоним + " (" + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'из сеанса %1 от %2'", ОбщегоНазначения.КодОсновногоЯзыка()), + Формат(ТекущийСеанс.НомерСеанса, "ЧГ="), + Формат(ТекущийСеанс.НачалоСеанса, "ДЛФ=DT")) + ")"; + ФоновоеЗадание = РасширенияКонфигурации.ВыполнитьФоновоеЗаданиеСРасширениямиБазыДанных( - Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.ИмяМетода, ПараметрыЗадания,, - ?(ЭтоЗапускВручную, НСтр("ru = 'Запуск вручную'"), НСтр("ru = 'Автозапуск'")) + ": " - + Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.Синоним); - + ИмяМетодаЗаданияОбновленияДоступа(), ПараметрыЗадания,, НаименованиеЗадания); + Результат.ИдентификаторФоновогоЗадания = ФоновоеЗадание.УникальныйИдентификатор; ИначеЕсли ТипЗнч(Исполнитель) = Тип("ФоновоеЗадание") И Исполнитель.УникальныйИдентификатор <> ПоследнееОбновлениеДоступа.ИдентификаторФоновогоЗадания Тогда Результат.ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось начать обновление доступа, так как оно уже запущено %1 в %2'"), + НСтр("ru = 'Не удалось начать обновление доступа, так как оно уже запущено %3 в %4'"), Формат(Исполнитель.Начало, "ДЛФ=D"), Формат(Исполнитель.Начало, "ДЛФ=T")); Иначе @@ -10142,7 +10628,7 @@ Отбор = Новый Структура; Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); - Отбор.Вставить("ИмяМетода", Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.ИмяМетода); + Отбор.Вставить("ИмяМетода", ИмяМетодаЗаданияОбновленияДоступа()); ОсновныеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); Для Каждого ОсновноеЗадание Из ОсновныеЗадания Цикл @@ -10212,6 +10698,7 @@ БлокировкаДанных = Новый БлокировкаДанных; БлокировкаДанных.Добавить("Константа.ПоследнееОбновлениеДоступа"); + ЕстьВнешняяТранзакция = ТранзакцияАктивна(); НачатьТранзакцию(); Попытка БлокировкаДанных.Заблокировать(); @@ -10240,8 +10727,7 @@ КонецЕсли; Если Записать Тогда - Константы.ПоследнееОбновлениеДоступа.Установить( - Новый ХранилищеЗначения(ПоследнееОбновлениеДоступа)); + УстановитьПоследнееОбновлениеДоступа(ПоследнееОбновлениеДоступа, ЕстьВнешняяТранзакция); КонецЕсли; ЗафиксироватьТранзакцию(); Исключение @@ -10317,6 +10803,7 @@ БлокировкаДанных = Новый БлокировкаДанных; БлокировкаДанных.Добавить("Константа.ПоследнееОбновлениеДоступа"); + ЕстьВнешняяТранзакция = ТранзакцияАктивна(); НачатьТранзакцию(); Попытка БлокировкаДанных.Заблокировать(); @@ -10334,8 +10821,7 @@ ПоследнееОбновлениеДоступа.ИмяКомпьютера = ТекущийСеанс.ИмяКомпьютера; ПоследнееОбновлениеДоступа.ИдентификаторФоновогоЗадания = ИдентификаторФоновогоЗадания; - Константы.ПоследнееОбновлениеДоступа.Установить( - Новый ХранилищеЗначения(ПоследнееОбновлениеДоступа)); + УстановитьПоследнееОбновлениеДоступа(ПоследнееОбновлениеДоступа, ЕстьВнешняяТранзакция); КонецЕсли; КонецЕсли; ЗафиксироватьТранзакцию(); @@ -10365,7 +10851,7 @@ И Исполнитель.УникальныйИдентификатор <> ПоследнееОбновлениеДоступа.ИдентификаторФоновогоЗадания Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось начать обновление доступа, так как оно уже запущено %3 в %4'"), + НСтр("ru = 'Не удалось начать обновление доступа, так как оно уже запущено %1 в %2'"), Формат(Исполнитель.Начало, "ДЛФ=D"), Формат(Исполнитель.Начало, "ДЛФ=T")); Иначе @@ -10388,14 +10874,17 @@ ПоследнееОбновлениеДоступа.ИдентификаторФоновогоЗадания = ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор(); + ПерезапускВозможен = ТекущееФоновоеЗадание <> Неопределено + И Не ОбновитьВсе + И Не ВызыватьИсключениеВместоРегистрацииОшибки + И СекундНеБолее = 0 + И Не ПослеОбновлениеИБ; + ТекстОшибкиПланирования = ""; ТекстВсехОшибок = ""; ТекстОшибкиЗавершения = ""; ДатаПолногоЗавершения = ПоследнееОбновлениеДоступа.ДатаПолногоЗавершения; Попытка - Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда - СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); - КонецЕсли; Если ОграничиватьДоступНаУровнеЗаписейУниверсально() Тогда ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа(); ЗапланироватьОбработкуУстаревшихЭлементов(ТекстОшибкиПланирования, @@ -10403,6 +10892,9 @@ ВыполнитьОбновлениеДоступа(ОбновитьВсе, ОписаниеОсновногоСеанса, ПоследнееОбновлениеДоступа.ОбновлениеОтменено, ТекстОшибкиЗавершения, СекундНеБолее, ПоследнееОбновлениеДоступа.ДатаПолногоЗавершения); + Если Не ПерезапускВозможен Тогда + ТребуетсяПерезапускСеанса(ТекстВсехОшибок); + КонецЕсли; Иначе УстановитьОбновлениеДоступа(Ложь); КонецЕсли; @@ -10410,7 +10902,11 @@ Если ТранзакцияАктивна() Тогда ВызватьИсключение; КонецЕсли; - ТекстВсехОшибок = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстВсехОшибок = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + Если ПерезапускВозможен И ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда + ТекстВсехОшибок = ""; + КонецЕсли; КонецПопытки; Попытка @@ -10453,17 +10949,21 @@ БлокировкаДанных.Заблокировать(); ЗначениеКонстанты = Константы.ПоследнееОбновлениеДоступа.Получить(); ТекущееПоследнееОбновлениеДоступа = ПоследнееОбновлениеДоступа(ЗначениеКонстанты); - + ПоследнееОбновлениеДоступа.ОбновлениеДоступаЗапрещено = ТекущееПоследнееОбновлениеДоступа.ОбновлениеДоступаЗапрещено; - Константы.ПоследнееОбновлениеДоступа.Установить(Новый ХранилищеЗначения(ПоследнееОбновлениеДоступа)); + УстановитьПоследнееОбновлениеДоступа(ПоследнееОбновлениеДоступа, ЕстьВнешняяТранзакция); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; + Если ПерезапускВозможен И ТребуетсяПерезапускСеанса() Тогда + ЗапуститьОбновлениеДоступаНаУровнеЗаписей(, Истина); + КонецЕсли; + Если Не ЗначениеЗаполнено(ТекстВсехОшибок) Тогда Возврат; КонецЕсли; @@ -10561,6 +11061,7 @@ Свойства.Вставить("ИмяКомпьютера", ""); Свойства.Вставить("ОбновлениеДоступаЗапрещено", Ложь); Свойства.Вставить("БалансировкаНагрузкиНаДиск", Истина); + Свойства.Вставить("ИдентификаторДоступа"); Свойства.Вставить("ИдентификаторФоновогоЗадания", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); Свойства.Вставить("ПоследнееПланированиеОбработкиУстаревшихЭлементов", '00010101'); @@ -10581,6 +11082,34 @@ КонецФункции +// Для процедур ВыполнитьОбновлениеДоступаНаУровнеЗаписей, +// УстановитьЗапретОбновленияДоступа и УстановитьБалансировкуНагрузкиНаДиск. +// +Процедура УстановитьПоследнееОбновлениеДоступа(Свойства, ЕстьВнешняяТранзакция) + + Если Не ЗначениеЗаполнено(Свойства.ИдентификаторДоступа) И Не ЕстьВнешняяТранзакция Тогда + Свойства.ИдентификаторДоступа = Новый УникальныйИдентификатор; + КонецЕсли; + + МенеджерЗначения = СлужебныйМенеджерЗначения(Константы.ПоследнееОбновлениеДоступа); + МенеджерЗначения.Значение = Новый ХранилищеЗначения(Свойства); + МенеджерЗначения.Записать(); + +КонецПроцедуры + +// Для константы ОграничиватьДоступНаУровнеЗаписейУниверсально. +Процедура ОчиститьПоследнееОбновлениеДоступа() Экспорт + + Свойства = ПоследнееОбновлениеДоступа(Null); + ЗаполнитьЗначенияСвойств(Свойства, ПоследнееОбновлениеДоступа(), + "ИдентификаторДоступа, ОбновлениеДоступаЗапрещено, БалансировкаНагрузкиНаДиск"); + + МенеджерЗначения = СлужебныйМенеджерЗначения(Константы.ПоследнееОбновлениеДоступа); + МенеджерЗначения.Значение = Новый ХранилищеЗначения(Свойства); + МенеджерЗначения.Записать(); + +КонецПроцедуры + // Для функции ЗапуститьОбновлениеДоступаНаУровнеЗаписей и // процедур ОбновлениеДоступаНаУровнеЗаписей, ОтменитьОбновлениеДоступаНаУровнеЗаписей и // формы ОбновлениеДоступаНаУровнеЗаписей. @@ -10617,7 +11146,7 @@ КонецЕсли; Отбор = Новый Структура("Состояние, ИмяМетода", СостояниеФоновогоЗадания.Активно, - Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.ИмяМетода); + ИмяМетодаЗаданияОбновленияДоступа()); НайденныеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); Для Каждого НайденноеЗадание Из НайденныеЗадания Цикл @@ -10660,9 +11189,6 @@ ДатаПроверкиПараметровОграниченияДоступа = '00010101'; КонецЕсли; - УстановитьПривилегированныйРежим(Ложь); - УстановитьОтключениеБезопасногоРежима(Ложь); - Если ДатаПроверкиПараметровОграниченияДоступа > ДатаСозданияПараметровОграниченияДоступа Тогда ДатаАктуальностиПараметровОграниченияДоступа = ДатаПроверкиПараметровОграниченияДоступа; Иначе @@ -10675,13 +11201,16 @@ Или ИспользованиеВидовДоступаИзменено(ДействующиеПараметры) Тогда ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений(); + Если ПараметрыСеанса.ПараметрыОграниченияДоступа.Версия > 100000000000000 Тогда + УменьшитьНомераВерсийПараметровОграниченияДоступа(); + КонецЕсли; + НоваяДатаПроверкиПараметровОграниченияДоступа = ТекущаяДатаСеанса(); ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Истина); + СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, + НоваяДатаПроверкиПараметровОграниченияДоступа, Истина); КонецЕсли; // Удаление устаревших параметров ограничения доступа. - УстановитьОтключениеБезопасногоРежима(Истина); - УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущаяВерсия", ПараметрыСеанса.ПараметрыОграниченияДоступа.Версия); Запрос.УстановитьПараметр("ДатаУстаревания", ТекущаяДатаСеанса() - 2 * 24 * 60 *60); @@ -10713,25 +11242,10 @@ Возврат; КонецЕсли; - НаименьшаяДатаНачалаСеанса = '39991231'; - Сеансы = ПолучитьСеансыИнформационнойБазы(); - Для Каждого Сеанс Из Сеансы Цикл - Если НаименьшаяДатаНачалаСеанса > Сеанс.НачалоСеанса Тогда - НаименьшаяДатаНачалаСеанса = Сеанс.НачалоСеанса; - КонецЕсли; - КонецЦикла; - - НаименьшаяДатаНачалаСеанса = НаименьшаяДатаНачалаСеанса - - (МестноеВремя('00010101', ЧасовойПояс()) - '00010101') - + (МестноеВремя('00010101', ЧасовойПоясСеанса()) - '00010101'); - НаборЗаписей = РегистрыСведений.ПараметрыОграниченияДоступа.СоздатьНаборЗаписей(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл - Если Выборка.ДатаСоздания >= НаименьшаяДатаНачалаСеанса Тогда - Продолжить; - КонецЕсли; НаборЗаписей.Отбор.Версия.Установить(Выборка.Версия); НаборЗаписей.Записать(); КонецЦикла; @@ -10741,6 +11255,34 @@ КонецПроцедуры +// Для процедуры ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа. +Процедура УменьшитьНомераВерсийПараметровОграниченияДоступа() + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить("РегистрСведений.ПараметрыОграниченияДоступа"); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + НаборЗаписей = РегистрыСведений.ПараметрыОграниченияДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Прочитать(); + Выгрузка = НаборЗаписей.Выгрузить(); + Выгрузка.Сортировать("Версия"); + ТекущаяВерсия = 1; + Для Каждого Строка Из Выгрузка Цикл + Строка.Версия = ТекущаяВерсия; + ТекущаяВерсия = ТекущаяВерсия + 1; + КонецЦикла; + НаборЗаписей.Загрузить(Выгрузка); + НаборЗаписей.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + // Для процедуры ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа. Функция ИспользованиеВидовДоступаИзменено(ДействующиеПараметры) @@ -10863,6 +11405,7 @@ Контекст.Вставить("ЕстьЗапущенноеЗадание", Истина); Контекст.Вставить("ОбработкаЗавершена", Ложь); Контекст.Вставить("ОбновлениеОтменено", Ложь); + Контекст.Вставить("ТребуетсяПерезапускСеанса",Ложь); Контекст.Вставить("МаксимумПорцийИзИсходной", 0); Контекст.Вставить("КоличествоДополнительныхПорций", 0); Контекст.Вставить("ЕстьДлительноеЗаданиеПолученияПорцийЭлементовДанных", Ложь); @@ -10904,7 +11447,7 @@ ЗаполнитьКоличествоПотоков(Контекст); ОбработатьВыполненныеЗадания(Контекст); - Если Контекст.ОбновлениеОтменено Тогда + Если Контекст.ОбновлениеОтменено Или Контекст.ТребуетсяПерезапускСеанса Тогда Контекст.ОбработкаЗавершена = Ложь; Прервать; КонецЕсли; @@ -10912,11 +11455,17 @@ РезультатыЗапроса = Запрос.ВыполнитьПакет(); ДобавитьЗаданияОбновленияДоступа(РезультатыЗапроса, Контекст); - Если Контекст.ОбработкаЗавершена Тогда + Если Контекст.ТребуетсяПерезапускСеанса Тогда + Контекст.ОбработкаЗавершена = Ложь; + Прервать; + ИначеЕсли Контекст.ОбработкаЗавершена Тогда + ОбновитьСоставИспользуемыхВерсийПараметровШаблонов(Контекст); + Если Не Контекст.ОбработкаЗавершена Тогда + Продолжить; + КонецЕсли; Прервать; - Иначе - Контекст.ДатаПолногоЗавершения = '00010101'; КонецЕсли; + Контекст.ДатаПолногоЗавершения = '00010101'; ОкончаниеТекущегоЗапуска = ТекущаяДатаСеанса() + 5; Контекст.Вставить("ПервыйПроход", Истина); @@ -10927,7 +11476,8 @@ Или ТекущаяДатаСеанса() > ОкончаниеТекущегоЗапуска Или ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) Или Задания.Количество() = 0 - Или Контекст.ОбновлениеОтменено Тогда + Или Контекст.ОбновлениеОтменено + Или Контекст.ТребуетсяПерезапускСеанса Тогда Прервать; КонецЕсли; @@ -10942,7 +11492,7 @@ Пока ЗанятыеПотоки.Количество() >= Контекст.КоличествоПотоков Цикл ОбработатьВыполненныеЗадания(Контекст); - Если Контекст.ОбновлениеОтменено Тогда + Если Контекст.ОбновлениеОтменено Или Контекст.ТребуетсяПерезапускСеанса Тогда ПрерватьПроход = Истина; Прервать; КонецЕсли; @@ -10966,7 +11516,9 @@ КонецЕсли; Если ЗанятыеПотоки.Количество() < Контекст.КоличествоПотоков Тогда ЗапуститьОбновлениеДоступаСписка(Задание, Контекст); - Если ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) Тогда + Если ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) + Или Контекст.ОбновлениеОтменено + Или Контекст.ТребуетсяПерезапускСеанса Тогда Прервать; КонецЕсли; КонецЕсли; @@ -10982,6 +11534,14 @@ КонецЦикла; КонецЦикла; + Если Не Контекст.ОбработкаЗавершена + И Не ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) + И Не Контекст.ОбновлениеОтменено + И Не Контекст.ТребуетсяПерезапускСеанса Тогда + + ОбновитьСоставИспользуемыхВерсийПараметровШаблонов(Контекст); + КонецЕсли; + ЗавершитьОбновлениеДоступа(Контекст); ТекстОшибкиЗавершения = Контекст.ТекстОшибкиЗавершения; @@ -11047,6 +11607,7 @@ БлокировкаДанных = Новый БлокировкаДанных; БлокировкаДанных.Добавить("Константа.ПоследнееОбновлениеДоступа"); + ЕстьВнешняяТранзакция = ТранзакцияАктивна(); НачатьТранзакцию(); Попытка БлокировкаДанных.Заблокировать(); @@ -11055,8 +11616,7 @@ Если ПоследнееОбновлениеДоступа.БалансировкаНагрузкиНаДиск <> Использование Тогда ПоследнееОбновлениеДоступа.БалансировкаНагрузкиНаДиск = Использование; - Константы.ПоследнееОбновлениеДоступа.Установить( - Новый ХранилищеЗначения(ПоследнееОбновлениеДоступа)); + УстановитьПоследнееОбновлениеДоступа(ПоследнееОбновлениеДоступа, ЕстьВнешняяТранзакция); КонецЕсли; ЗафиксироватьТранзакцию(); Исключение @@ -11333,7 +11893,17 @@ Кэш.Вставить("ОбъектыМетаданныхПоИдентификаторам", Новый Соответствие); КонецЕсли; - ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа(); + Попытка + ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа(); + Исключение + Если ТребуетсяПерезапускСеанса() Тогда + Контекст.ТребуетсяПерезапускСеанса = Истина; + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке()) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + ВызватьИсключение; + КонецПопытки; ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Ложь); Задания = Контекст.Задания; ИдентификаторыСписков = Новый Массив; @@ -11781,10 +12351,61 @@ КонецФункции +// Для процедуры ВыполнитьОбновлениеДоступа. +Процедура ОбновитьСоставИспользуемыхВерсийПараметровШаблонов(Контекст) + + Если Не Контекст.ОбработкаЗавершена + И ПараметрыСеанса.ПараметрыОграниченияДоступа.ДатаСоздания > ТекущаяДатаСеанса() - 5 * 60 Тогда + + Возврат; + КонецЕсли; + + Попытка + ПроверитьОбновитьДействующиеПараметрыОграниченияДоступа(); + ДействующиеПараметры = ДействующиеПараметрыОграниченияДоступа(Неопределено, Неопределено, Ложь); + Исключение + Если ТребуетсяПерезапускСеанса() Тогда + Контекст.ТребуетсяПерезапускСеанса = Истина; + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке()) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + ДополнительныйКонтекст = ДействующиеПараметры.ДополнительныйКонтекст; + + Если ИспользуетсяОдинВариантДоступа(ДополнительныйКонтекст.ДляПользователей) + И ИспользуетсяОдинВариантДоступа(ДополнительныйКонтекст.ДляВнешнихПользователей) Тогда + + Возврат; + КонецЕсли; + + ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(); + ОбщийКонтекст.Вставить("СпискиСУстаревшимиВариантамиДоступа", Новый Массив); + + Попытка + ДействующиеПараметрыОграниченияДоступа(Неопределено, ОбщийКонтекст, Истина); + Исключение + Если ТребуетсяПерезапускСеанса() Тогда + Контекст.ТребуетсяПерезапускСеанса = Истина; + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке()) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + Если ЗначениеЗаполнено(ОбщийКонтекст.СпискиСУстаревшимиВариантамиДоступа) Тогда + Контекст.ОбработкаЗавершена = Ложь; + КонецЕсли; + +КонецПроцедуры + // Для процедуры ВыполнитьОбновлениеДоступа. Процедура ЗавершитьОбновлениеДоступа(Контекст) - Если Не Контекст.ОбновлениеОтменено Тогда + Если Не Контекст.ОбновлениеОтменено И Не Контекст.ТребуетсяПерезапускСеанса Тогда Если ЗначениеЗаполнено(Контекст.ТекстОшибкиЗавершения) Тогда ГраницаОжидания = ТекущаяДатаСеанса() + 3; Иначе @@ -11825,7 +12446,23 @@ КонецПроцедуры -// Для процедуры ВыполнитьОбновлениеДоступа. +// Для процедуры ОбновитьСоставИспользуемыхВерсийПараметровШаблонов. +Функция ИспользуетсяОдинВариантДоступа(ДополнительныйКонтекст) + + ИспользуетсяНесколькоВариантов = Ложь; + + Для Каждого КлючИЗначение Из ДополнительныйКонтекст.ОсновныеВариантыДоступа Цикл + Если КлючИЗначение.Значение.Количество() > 1 Тогда + ИспользуетсяНесколькоВариантов = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат Не ИспользуетсяНесколькоВариантов; + +КонецФункции + +// Для процедуры ЗавершитьОбновлениеДоступа. Процедура ОтключитьРегламентноеЗаданиеЕслиНетНовыхЗаданий(Контекст) Запрос = Новый Запрос; @@ -12123,6 +12760,15 @@ КонецФункции +// Для процедур УстановитьОбновлениеДоступа, ЗапуститьОбновлениеДоступаНаУровнеЗаписей, +// ОтменитьОбновлениеДоступаНаУровнеЗаписей и функции ИсполнительОбновленияДоступа. +// +Функция ИмяМетодаЗаданияОбновленияДоступа() + + Возврат Метаданные.РегламентныеЗадания.ОбновлениеДоступаНаУровнеЗаписей.ИмяМетода; + +КонецФункции + // Для процедуры ВыполнитьОбновлениеДоступа, ЗавершитьОбновлениеДоступа. Процедура ПодождатьОсвобожденияПотока(Контекст, ЖдатьЗавершенияЗадания = Ложь) @@ -12630,6 +13276,14 @@ КонецЕсли; КонецЕсли; + Если Результат.Свойство("ТребуетсяПерезапускСеанса") Тогда + Контекст.ТребуетсяПерезапускСеанса = Истина; + Контекст.ОбработкаЗавершена = Ложь; + УстановитьТребуетсяПерезапускСеанса(Результат.ТребуетсяПерезапускСеанса); + СнятьПризнакОбрабатываетсяДляПорции(Результат, Задание); + Возврат; + КонецЕсли; + Если Результат.Свойство("ТекстОшибкиЗавершения") Тогда Если Не Результат.ОбработкаЗавершена Тогда Контекст.ОбработкаЗавершена = Ложь; @@ -12769,8 +13423,9 @@ ВыполнитьОбновлениеДоступаСпискаСПопыткамиПовтора(ОбщиеПараметрыОбновления, Контекст); Результат.ОбработкаЗавершена = ОбщиеПараметрыОбновления.ОбработкаЗавершена; - ВозвращаемыеСвойства = "НетЗаданий, ПерезапускОбновления, ПерезапускОбновленияСНачала, НаборПорций, - |НовыйПоследнийОбновленныйЭлемент, НачальноеОбновлениеЗавершено, ТекстОшибкиЗавершения"; + ВозвращаемыеСвойства = "НетЗаданий, ПерезапускОбновления, ПерезапускОбновленияСНачала, + |НаборПорций, НовыйПоследнийОбновленныйЭлемент, НачальноеОбновлениеЗавершено, + |ТекстОшибкиЗавершения, ТребуетсяПерезапускСеанса"; Для Каждого КлючИЗначение Из Новый Структура(ВозвращаемыеСвойства) Цикл Если ОбщиеПараметрыОбновления.Свойство(КлючИЗначение.Ключ) Тогда Результат.Вставить(КлючИЗначение.Ключ, ОбщиеПараметрыОбновления[КлючИЗначение.Ключ]); @@ -13466,16 +14121,24 @@ Если ТранзакцияАктивна() Тогда ВызватьИсключение; КонецЕсли; - ТекстОшибкиТекущейПопытки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ТекстОшибкиТекущейПопытки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); КонецПопытки; Если Показатели <> Неопределено И Не ЗначениеЗаполнено(ТекстОшибкиТекущейПопытки) Тогда СнятьПоказателиВыполненияЗадания(Показатели); КонецЕсли; + ТекстОшибкиТребуетсяПерезапуск = ""; + Если ТребуетсяПерезапускСеанса(ТекстОшибкиТребуетсяПерезапуск) Тогда + ОбщиеПараметрыОбновления.Вставить("ТребуетсяПерезапускСеанса", ТекстОшибкиТребуетсяПерезапуск); + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда + ТекстОшибкиТекущейПопытки = ""; + КонецЕсли; + КонецЕсли; Если ЗначениеЗаполнено(ТекстОшибкиТекущейПопытки) Тогда ВремяОшибкиТекущейПопытки = Формат(ТекущаяДатаСеанса(), "ДЛФ=DT"); ОшибкиПопытокВыполнения.Добавить(ВремяОшибкиТекущейПопытки + " " + ТекстОшибкиТекущейПопытки); ПопыткаВыполнения = ПопыткаВыполнения + 1; - Если ПопыткаВыполнения < 9 Тогда + Если ПопыткаВыполнения < 9 И Не ЗначениеЗаполнено(ТекстОшибкиТребуетсяПерезапуск) Тогда Для Счетчик = 1 По ПопыткаВыполнения Цикл Если ОбновлениеДоступаОтменено() Тогда Прервать; @@ -14571,7 +15234,7 @@ Или ПараметрыОбновления.СЗаписьюВсегдаРазрешенногоКлючаДоступа Тогда Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ " + МаркерРазмераПорции() + " + "ВЫБРАТЬ ПЕРВЫЕ 1 | КлючиДоступа.Ссылка КАК Ссылка |ИЗ | Справочник.КлючиДоступа КАК КлючиДоступа @@ -14583,6 +15246,7 @@ | |УПОРЯДОЧИТЬ ПО | КлючиДоступа.Ссылка"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "1", МаркерРазмераПорции()); ИначеЕсли ЭтоОбработкаУстаревшихЭлементов(ПараметрыОбновления) Тогда Запрос.УстановитьПараметр("ДатаУстаревания", ДатаУстаревания()); @@ -14716,7 +15380,7 @@ " |ПОМЕСТИТЬ ТекущийСписокПоВедущимОбъектам |ИЗ - | ")); + | ")); // @query-part Иначе ТекстыЗапросов = СтрСоединить(ЗапросыДанных, " @@ -15727,10 +16391,10 @@ КонецЕсли; ТекстЗапросаВыбораПорцииДляБлокировки = СтрЗаменить(ТекстЗапросаВыбораПорцииДляБлокировки, - "ТИП(Справочник.ГруппыДоступа)", "ТИП(Справочник." + ИмяСправочникаГрупп + ")"); + "ТИП(Справочник.ГруппыДоступа)", "ТИП(Справочник." + ИмяСправочникаГрупп + ")"); // @query-part @query-part-2 ТекстЗапросаВыбораПорцииДляОбновления = СтрЗаменить(ТекстЗапросаВыбораПорцииДляОбновления, - "ТИП(Справочник.ГруппыДоступа)", "ТИП(Справочник." + ИмяСправочникаГрупп + ")"); + "ТИП(Справочник.ГруппыДоступа)", "ТИП(Справочник." + ИмяСправочникаГрупп + ")"); // @query-part @query-part-2 ТекстЗапросаВыбораПорцииДляОбновления = СтрЗаменить(ТекстЗапросаВыбораПорцииДляОбновления, "СтарыеДанные.НаборГруппДоступа", "СтарыеДанные." + ИмяПоляНабораГрупп); @@ -17210,6 +17874,7 @@ КонецЕсли; ИменаИзмерений = Новый Массив; + ИменаИзмерений.Добавить("ВариантДоступа"); Для Каждого Колонка Из ЭлементыДанных.Колонки Цикл Если СтрНачинаетсяС(Колонка.Имя, "Поле") Тогда ИменаИзмерений.Добавить(Колонка.Имя); @@ -17220,14 +17885,14 @@ Индекс = 0; Пока Индекс < КоличествоЭлементов Цикл Если ПорцияЭлементовДанных = Неопределено Тогда - ТребуетсяПроверка = Не ПараметрыОбновления.БезЗаписиКлючейДоступа; + ТребуетсяПроверка = Ложь; ПорцияЭлементовДанных = ЭлементыДанных.Скопировать(Новый Массив); Блокировка = Новый БлокировкаДанных; КонецЕсли; ЭлементДанных = ЭлементыДанных[Индекс]; ЗаполнитьЗначенияСвойств(ПорцияЭлементовДанных.Добавить(), ЭлементДанных); - Если ТребуетсяПроверка И ЭлементДанных.Удалить Тогда - ТребуетсяПроверка = Ложь; + Если Не ПараметрыОбновления.БезЗаписиКлючейДоступа И Не ЭлементДанных.Удалить Тогда + ТребуетсяПроверка = Истина; КонецЕсли; ЭлементБлокировки = Блокировка.Добавить("РегистрСведений." + ИмяРегистра); @@ -17277,7 +17942,12 @@ КонецЕсли; Для Каждого ИмяИзмерения Из ИменаИзмерений Цикл ЭлементОтбора = НаборИзОднойЗаписи.Отбор[ИмяИзмерения]; // ЭлементОтбора - ЭлементОтбора.Установить(Строка[ИмяИзмерения]); + Если Строка[ИмяИзмерения] = Неопределено Тогда + ЭлементОтбора.Значение = Неопределено; + ЭлементОтбора.Использование = Истина; + Иначе + ЭлементОтбора.Установить(Строка[ИмяИзмерения]); + КонецЕсли; КонецЦикла; НаборИзОднойЗаписи.Записать(); КонецЦикла; @@ -17955,7 +18625,7 @@ Если Не ЗначениеЗаполнено(ПараметрыОбновления.ИмяОтдельногоРегистраКлючей) Тогда ЭлементБлокировки.УстановитьЗначение("Регистр", ПараметрыОбновления.ИдентификаторСписка); КонецЕсли; - ЭлементБлокировки.УстановитьЗначение("ДляВнешнихПользователей", ПараметрыОбновления.ДляВнешнихПользователей); + ЭлементБлокировки.УстановитьЗначение("ВариантДоступа", ПараметрыОбновления.ВариантДоступа); ЭлементДанных = ПорцияЭлементовДанных.Найти(ОписаниеКлючаДоступаОбъекта.ТекущаяСсылка, "ТекущаяСсылка"); Для НомерПоля = 1 По ПараметрыОбновления.ОпорныеПоля.Используемые.Количество() Цикл ИмяПоля = "Поле" + НомерПоля; @@ -17980,18 +18650,19 @@ НаборИзОднойЗаписи.Отбор.Регистр.Установить(ПараметрыОбновления.ИдентификаторСписка); Запись.Регистр = ПараметрыОбновления.ИдентификаторСписка; КонецЕсли; - НаборИзОднойЗаписи.Отбор.ДляВнешнихПользователей.Установить(ПараметрыОбновления.ДляВнешнихПользователей); - Запись.ДляВнешнихПользователей = ПараметрыОбновления.ДляВнешнихПользователей; + НаборИзОднойЗаписи.Отбор.ВариантДоступа.Установить(ПараметрыОбновления.ВариантДоступа); + Запись.ВариантДоступа = ПараметрыОбновления.ВариантДоступа; ЭлементДанных = ПорцияЭлементовДанных.Найти(ОписаниеКлючаДоступаОбъекта.ТекущаяСсылка, "ТекущаяСсылка"); ЗаполнитьЗначенияСвойств(Запись, ПустыеЗначенияОпорныхПолей); Для НомерПоля = 1 По ПараметрыОбновления.ОпорныеПоля.Используемые.Количество() Цикл ИмяПоля = "Поле" + НомерПоля; + ЭлементОтбора = НаборИзОднойЗаписи.Отбор[ИмяПоля]; // ЭлементОтбора Если ЭлементДанных[ИмяПоля] = Неопределено Тогда - НаборИзОднойЗаписи.Отбор[ИмяПоля].Значение = Неопределено; - НаборИзОднойЗаписи.Отбор[ИмяПоля].Использование = Истина; + ЭлементОтбора.Значение = Неопределено; + ЭлементОтбора.Использование = Истина; Иначе - НаборИзОднойЗаписи.Отбор[ИмяПоля].Установить(ЭлементДанных[ИмяПоля]); + ЭлементОтбора.Установить(ЭлементДанных[ИмяПоля]); КонецЕсли; Запись[ИмяПоля] = ЭлементДанных[ИмяПоля]; КонецЦикла; @@ -18030,7 +18701,6 @@ КонецЕсли; НаборИзОднойЗаписи = СлужебныйНаборЗаписей(РегистрыСведений[ИмяРегистраКлючей]); КоличествоИспользуемыхПолей = ПараметрыОбновления.ОпорныеПоля.Используемые.Количество(); - МаксимальноеКоличествоПолей = ПараметрыОбновления.ОпорныеПоля.МаксимальноеКоличество; Блокировка = Новый БлокировкаДанных; Для Каждого ЭлементДанных Из ПорцияЭлементовДанных Цикл @@ -18038,11 +18708,10 @@ Если Не ЗначениеЗаполнено(ПараметрыОбновления.ИмяОтдельногоРегистраКлючей) Тогда ЭлементБлокировки.УстановитьЗначение("Регистр", ПараметрыОбновления.ИдентификаторСписка); КонецЕсли; - ЭлементБлокировки.УстановитьЗначение("ДляВнешнихПользователей", ПараметрыОбновления.ДляВнешнихПользователей); - Для НомерПоля = 1 По МаксимальноеКоличествоПолей Цикл + ЭлементБлокировки.УстановитьЗначение("ВариантДоступа", ПараметрыОбновления.ВариантДоступа); + Для НомерПоля = 1 По КоличествоИспользуемыхПолей Цикл ИмяПоля = "Поле" + НомерПоля; - ЭлементБлокировки.УстановитьЗначение(ИмяПоля, ?(НомерПоля > КоличествоИспользуемыхПолей, - Перечисления.ДополнительныеЗначенияДоступа.Null, ЭлементДанных[ИмяПоля])); + ЭлементБлокировки.УстановитьЗначение(ИмяПоля, ЭлементДанных[ИмяПоля]); КонецЦикла; КонецЦикла; @@ -18053,17 +18722,15 @@ Если Не ЗначениеЗаполнено(ПараметрыОбновления.ИмяОтдельногоРегистраКлючей) Тогда НаборИзОднойЗаписи.Отбор.Регистр.Установить(ПараметрыОбновления.ИдентификаторСписка); КонецЕсли; - НаборИзОднойЗаписи.Отбор.ДляВнешнихПользователей.Установить(ПараметрыОбновления.ДляВнешнихПользователей); - Для НомерПоля = 1 По МаксимальноеКоличествоПолей Цикл + НаборИзОднойЗаписи.Отбор.ВариантДоступа.Установить(ПараметрыОбновления.ВариантДоступа); + Для НомерПоля = 1 По КоличествоИспользуемыхПолей Цикл ИмяПоля = "Поле" + НомерПоля; ЭлементОтбора = НаборИзОднойЗаписи.Отбор[ИмяПоля]; // ЭлементОтбора - ЗначениеОтбора = ?(НомерПоля > КоличествоИспользуемыхПолей, - Перечисления.ДополнительныеЗначенияДоступа.Null, ЭлементДанных[ИмяПоля]); - Если ЗначениеОтбора = Неопределено Тогда + Если ЭлементДанных[ИмяПоля] = Неопределено Тогда ЭлементОтбора.Значение = Неопределено; ЭлементОтбора.Использование = Истина; Иначе - ЭлементОтбора.Установить(ЗначениеОтбора); + ЭлементОтбора.Установить(ЭлементДанных[ИмяПоля]); КонецЕсли; КонецЦикла; НаборИзОднойЗаписи.Записать(); @@ -20528,6 +21195,19 @@ КонецФункции +// Создает менеджер значения служебной константы, которая не участвует в подписках на события. +Функция СлужебныйМенеджерЗначения(МенеджерКонстанты) + + МенеджерЗначения = МенеджерКонстанты.СоздатьМенеджерЗначения(); + МенеджерЗначения.ДополнительныеСвойства.Вставить("НеВыполнятьКонтрольУдаляемых"); + МенеджерЗначения.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + МенеджерЗначения.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + МенеджерЗначения.ОбменДанными.Загрузка = Истина; + + Возврат МенеджерЗначения; + +КонецФункции + // Для процедуры ЗаполнитьШаблоныЧастейЗапросаПроверкиОбъекта. Функция МаркерРазмераПорции() @@ -20959,6 +21639,10 @@ Возврат; КонецПроцедуры +Процедура ПриОшибкеПроверкиАктуальностиМетаданных(ТекстОшибки) + Возврат; +КонецПроцедуры + #КонецОбласти #КонецОбласти @@ -20977,7 +21661,7 @@ // // Возвращаемое значение: // Структура: -// * ЗависимыеСписки - Соответствие: +// * ЗависимыеСписки - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина // * ПоЗначениямПолей - см. ВедущийСписокПоЗначениямПолей @@ -21151,6 +21835,7 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТекущаяТаблицаЭлементовДанных", ПолноеИмя); + // @query-part-2 ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ПЕРВЫЕ 100", "ПЕРВЫЕ " + Формат( МаксимальноеКоличествоКомбинацийЗначенийВедущихПолейПриВычисленииСоставаИзмененных() * 10, "ЧГ=")); @@ -21265,7 +21950,7 @@ // Возвращаемое значение: // Структура: // * СвойстваВидовДоступа - см. ХранимоеОписаниеСвойствВидовДоступа -// * ТипыПользователя - Массив Из Тип +// * ТипыПользователя - Массив из Тип // * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие // * ОтдельныеТаблицыНастроекПрав - ФиксированноеСоответствие // * ВнешниеПользователиВключены - Булево @@ -21321,7 +22006,7 @@ // Для функций ОбщийКонтекстРасчетаПараметровОграничения и ИспользованиеВидовДоступаИзменено. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Булево - Истина // @@ -21371,7 +22056,7 @@ // Возвращаемое значение: // Структура: // * Версия - Строка -// * ВедущиеСписки - Соответствие: +// * ВедущиеСписки - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. СвойстваСпискаКакВедущего // * ДляПользователей - см. ПараметрыОграниченияПоСтруктуреОграничения @@ -21678,6 +22363,10 @@ Контекст.ВерсииОграниченийСписков.Вставить(ПолноеИмя, ДействующиеПараметры.ВерсииОграниченийСписков.Получить(ПолноеИмя)); КонецЕсли; + УстановитьОграничениеПоВладельцуИспользуется(ДляПользователей, + ПолноеИмя, ДействующиеПараметры.ДополнительныйКонтекст.ДляПользователей); + УстановитьОграничениеПоВладельцуИспользуется(ДляВнешнихПользователей, + ПолноеИмя, ДействующиеПараметры.ДополнительныйКонтекст.ДляВнешнихПользователей); Иначе Контекст.ВерсииОграниченийСписков.Вставить(ПолноеИмя, Истина); ДействующиеПараметры = Новый Структура; @@ -21701,6 +22390,19 @@ КонецФункции +// Для функции РезультатПроверкиОграниченияДоступаОбъекта +Процедура УстановитьОграничениеПоВладельцуИспользуется(Результат, ПолноеИмя, ДополнительныйКонтекст) + + Свойства = ДополнительныйКонтекст.СвойстваОграниченияСписков.Получить(ПолноеИмя); + Если Свойства = Неопределено Тогда + Возврат; + КонецЕсли; + + Результат.ОграничениеПоВладельцуИспользуется = + Свойства.ПолеВладельца <> Неопределено И Не Свойства.ПолеВладельца.Отключено; + +КонецПроцедуры + // Для функции РезультатПроверкиОграниченияДоступаОбъекта. Процедура УстановитьНастройкиВнедрения(НастройкиВнедрения, Данные, ТипыТаблицПоИменам) @@ -21819,6 +22521,7 @@ Свойства.Вставить("ОшибкаФормированияПараметровОграничения"); Свойства.Вставить("ОшибкаФормированияТекстовЗапросов"); Свойства.Вставить("ОграничениеПоВладельцуВозможно"); + Свойства.Вставить("ОграничениеПоВладельцуИспользуется"); Свойства.Вставить("ОграничениеВРолях"); Свойства.Вставить("ОграничениеВМодуле"); Свойства.Вставить("ПоВладельцуБезЗаписиКлючейДоступа"); @@ -22141,51 +22844,33 @@ ТекущиеПараметры = ПараметрыСеанса.ПараметрыОграниченияДоступа; // См. СеансовыеПараметрыОграниченияДоступа - Если Не ЗначениеЗаполнено(ТекущиеПараметры) Или ТекущиеПараметры.Параметры = Неопределено Тогда + Если Не ТекущиеПараметры.Свойство("Параметры") Или ТекущиеПараметры.Параметры = Неопределено Тогда ТекущиеПараметры = Новый Структура("Версия, ХешСумма", "", ""); // См. СеансовыеПараметрыОграниченияДоступа ИдентификаторыТранзакции = Новый Соответствие; Иначе ИдентификаторыТранзакции = КэшПараметровОграничения().ИдентификаторыТранзакции; КонецЕсли; - Если ТранзакцияАктивна() Тогда - Если ИдентификаторыТранзакции.Получить(ИдентификаторТранзакции) <> Неопределено Тогда - Возврат ТекущиеПараметры.Параметры; - КонецЕсли; + Если ТранзакцияАктивна() + И ИдентификаторыТранзакции.Получить(ИдентификаторТранзакции) <> Неопределено Тогда - ОписаниеВерсии = Новый Структура("Версия, ХешСумма", "", ""); - Если ЗначениеЗаполнено(ТекущиеПараметры.Версия) Тогда - ОписаниеВерсии.Версия = ТекущиеПараметры.Версия; - ОписаниеВерсии.ХешСумма = ТекущиеПараметры.ХешСумма; - КонецЕсли; - - Пока Истина Цикл - Если Не ЗначениеЗаполнено(ОписаниеВерсии.Версия) Тогда - ОписаниеВерсии = ОписаниеПоследнейВерсии(); - КонецЕсли; - Если Не ЗначениеЗаполнено(ОписаниеВерсии.Версия) Тогда - Прервать; - КонецЕсли; - БлокировкаДанных = Новый БлокировкаДанных; - ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.УстановитьЗначение("Версия", ОписаниеВерсии.Версия); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - БлокировкаДанных.Заблокировать(); - НовоеОписаниеВерсии = ОписаниеПоследнейВерсии(); - Если Не ЗначениеЗаполнено(НовоеОписаниеВерсии.Версия) Тогда - ОписаниеВерсии = НовоеОписаниеВерсии; - Прервать; - КонецЕсли; - Если ОписаниеВерсии.Версия = НовоеОписаниеВерсии.Версия - И ОписаниеВерсии.ХешСумма = НовоеОписаниеВерсии.ХешСумма Тогда - Прервать; - КонецЕсли; - ОписаниеВерсии = НовоеОписаниеВерсии; - КонецЦикла; - Иначе - ОписаниеВерсии = ОписаниеПоследнейВерсии(); + Возврат ТекущиеПараметры.Параметры; КонецЕсли; + Пока Истина Цикл + ОписаниеВерсии = ОписаниеПоследнейВерсии(); + Если ТекущиеПараметры.Версия = ОписаниеВерсии.Версия + И ТекущиеПараметры.ХешСумма = ОписаниеВерсии.ХешСумма Тогда + Прервать; + КонецЕсли; + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Прервать; + КонецЕсли; + Если ЗавершеныЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа() Тогда + Прервать; + КонецЕсли; + КонецЦикла; + Если Не УстановкаПараметровСеансаДляШаблонов И Не УстановкаПараметровДляОтчетаПраваДоступа И ТекущиеПараметры.Версия = ОписаниеВерсии.Версия @@ -22230,21 +22915,38 @@ КонецФункции +// Для функции НоваяВерсияПараметровОграниченияДоступа. +Функция ЗаписьПараметровОграниченияДоступаВТекущемСеансе() + + УстановитьПривилегированныйРежим(Истина); + ТекущиеПараметры = ПараметрыСеанса.ПараметрыОграниченияДоступа; + УстановитьПривилегированныйРежим(Ложь); + + Возврат ТекущиеПараметры.Свойство("ЗаписьПараметровОграниченияДоступаВТекущемСеансе"); + +КонецФункции + // Для функций ДействующиеПараметрыОграниченияДоступа, НоваяВерсияПараметровОграниченияДоступа. -Функция ОписаниеПоследнейВерсии() +Функция ОписаниеПоследнейВерсии(ПрочитатьВерсииПараметровШаблонов = Ложь) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ПараметрыОграниченияДоступа.Версия КАК Версия, | ПараметрыОграниченияДоступа.ХешСумма КАК ХешСумма, - | ПараметрыОграниченияДоступа.ДатаСоздания КАК ДатаСоздания + | ПараметрыОграниченияДоступа.ДатаСоздания КАК ДатаСоздания, + | ПараметрыОграниченияДоступа.ВерсииПараметровШаблонов КАК ВерсииПараметровШаблонов |ИЗ | РегистрСведений.ПараметрыОграниченияДоступа КАК ПараметрыОграниченияДоступа | |УПОРЯДОЧИТЬ ПО | ПараметрыОграниченияДоступа.Версия УБЫВ"; + Если Не ПрочитатьВерсииПараметровШаблонов Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ПараметрыОграниченияДоступа.ВерсииПараметровШаблонов", "Неопределено"); + КонецЕсли; + Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); @@ -22264,6 +22966,7 @@ | ПараметрыОграниченияДоступа.ДляШаблоновВСеансахПользователей КАК ДляШаблоновВСеансахПользователей, | ПараметрыОграниченияДоступа.ДляШаблоновВСеансахВнешнихПользователей КАК ДляШаблоновВСеансахВнешнихПользователей, | ПараметрыОграниченияДоступа.ДляЗаписиОбъектовИПроверкиПрав КАК ДляЗаписиОбъектовИПроверкиПрав, + | ПараметрыОграниченияДоступа.ВерсииПараметровШаблонов КАК ВерсииПараметровШаблонов, | ПараметрыОграниченияДоступа.ДляОтчетаПоПравамДоступа КАК ДляОтчетаПоПравамДоступа |ИЗ | РегистрСведений.ПараметрыОграниченияДоступа КАК ПараметрыОграниченияДоступа @@ -22273,6 +22976,8 @@ Если УстановкаПараметровСеансаДляШаблонов Или УстановкаПараметровДляОтчетаПраваДоступа Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "ПараметрыОграниченияДоступа.ДляЗаписиОбъектовИПроверкиПрав", "Неопределено"); + Запрос.Текст = СтрЗаменить(Запрос.Текст, + "ПараметрыОграниченияДоступа.ВерсииПараметровШаблонов", "Неопределено"); КонецЕсли; Если Не УстановкаПараметровДляОтчетаПраваДоступа Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, @@ -22306,14 +23011,24 @@ // Функция НоваяВерсияПараметровОграниченияДоступа(ОбщийКонтекст, ЕстьИзменения = Ложь) + Попытка + ПроверитьАктуальностьМетаданных(); + Исключение + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке()) Тогда + ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "НоваяВерсияПараметровОграниченияДоступа", Истина); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + УдалитьСтрокиВерсииХранимыхПараметров = Ложь; + Если РегистрироватьСтрокуВерсииПараметровОграниченияДоступа() Тогда Если ТипЗнч(ОбщийКонтекст) <> Тип("Структура") Тогда ОбновитьПовторноИспользуемыеЗначения(); ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(); КонецЕсли; - Если ОбщийКонтекст.Свойство("СтрокиВерсииХранимыхПараметров") Тогда - УдалитьСтрокиВерсииХранимыхПараметров = Ложь; - Иначе + Если Не ОбщийКонтекст.Свойство("СтрокиВерсииХранимыхПараметров") Тогда ОбщийКонтекст.Вставить("СтрокиВерсииХранимыхПараметров"); УдалитьСтрокиВерсииХранимыхПараметров = Истина; КонецЕсли; @@ -22323,100 +23038,445 @@ ХранимыеПараметры = ХранимыеПараметрыОграниченияДоступа(ОбщийКонтекст, ВерсииОграниченийСписков); ВерсииОграниченийСписков.Вставить("Справочник.НаборыГруппДоступа", "1"); - Если РегистрироватьСтрокуВерсииПараметровОграниченияДоступа() Тогда - СтрокиВерсии = ОбщийКонтекст.СтрокиВерсииХранимыхПараметров; - Если УдалитьСтрокиВерсииХранимыхПараметров Тогда - ОбщийКонтекст.Удалить("СтрокиВерсииХранимыхПараметров"); + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("ВерсииОграниченийСписков", ВерсииОграниченийСписков); + ПараметрыЗаписи.Вставить("ХранимыеПараметры", ХранимыеПараметры); + ПараметрыЗаписи.Вставить("ИдентификаторДоступа", ИдентификаторДоступа()); + + Если ОбщийКонтекст.Свойство("СпискиСУстаревшимиВариантамиДоступа") Тогда + ПараметрыЗаписи.Вставить("СпискиСУстаревшимиВариантамиДоступа", + ОбщийКонтекст.СпискиСУстаревшимиВариантамиДоступа); + Иначе + ПараметрыЗаписи.Вставить("СпискиСУстаревшимиВариантамиДоступа"); + КонецЕсли; + + Если ОбщийКонтекст.Свойство("СтрокиВерсииХранимыхПараметров") Тогда + ПараметрыЗаписи.Вставить("СтрокиВерсии", ОбщийКонтекст.СтрокиВерсииХранимыхПараметров); + КонецЕсли; + + Если Не ТранзакцияАктивна() + Или МонопольныйРежим() + Или ОбщийКонтекст.Свойство("ЗаписатьВТекущейТранзакции") + Или ОбщегоНазначения.ИнформационнаяБазаФайловая() + Или ЗаписьПараметровОграниченияДоступаВТекущемСеансе() Тогда + + Попытка + ОписаниеВерсии = ОписаниеНовойВерсииПараметровОграниченияДоступа(ПараметрыЗаписи); + Исключение + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке()) Тогда + ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "НоваяВерсияПараметровОграниченияДоступа", Истина); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + Иначе + ПараметрыЗаписиВХранилище = Новый ХранилищеЗначения(ПараметрыЗаписи); + ОписаниеВерсии = Неопределено; + Пока Истина Цикл + ОписаниеВерсии = ОписаниеНовойВерсииПараметровОграниченияДоступа( + ПараметрыЗаписиВХранилище.Получить(), Истина); + Если ОписаниеВерсии <> Неопределено Тогда + Прервать; + КонецЕсли; + Если ЗавершеныЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа() Тогда + Прервать; + КонецЕсли; + КонецЦикла; + Если ОписаниеВерсии = Неопределено Тогда + ИмяПроцедуры = ИмяПроцедурыЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа(); + АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено); + ПараметрыПроцедуры = Новый Массив; + ПараметрыПроцедуры.Добавить(АдресРезультата); + ПараметрыПроцедуры.Добавить(ПараметрыЗаписиВХранилище); + ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы(); + НаименованиеЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Управление доступом: Запись новой версии параметров ограничения доступа (из сеанса %1 от %2)'", + ОбщегоНазначения.КодОсновногоЯзыка()), + Формат(ТекущийСеанс.НомерСеанса, "ЧГ="), + Формат(ТекущийСеанс.НачалоСеанса, "ДЛФ=DT")); + ФоновоеЗадание = ФоновыеЗадания.Выполнить(ИмяПроцедуры, ПараметрыПроцедуры,, НаименованиеЗадания); + ФоновоеЗадание = ФоновоеЗадание.ОжидатьЗавершенияВыполнения(60); + Результат = ПолучитьИзВременногоХранилища(АдресРезультата); + ЗаголовокОшибки = НСтр("ru = 'Не удалось записать новую версию параметров ограничения доступа по причине:'"); + Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда + ФоновоеЗадание.Отменить(); + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'Фоновое задание выполняется более 60 секунд, поэтому отменено.'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'Фоновое задание отменено администратором.'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Завершено Тогда + Если ТипЗнч(ФоновоеЗадание.ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") Тогда + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + ПодробноеПредставлениеОшибки(ФоновоеЗадание.ИнформацияОбОшибке); + Иначе + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'Фоновое задание завершилось аварийно.'"); + КонецЕсли; + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + + НСтр("ru = 'Фоновое задание не вернуло результат.'"); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Если Результат.ТребуетсяПерезапускСеанса Тогда + ЗапланироватьОбновлениеПараметровОграниченияДоступа( + "НоваяВерсияПараметровОграниченияДоступа", Истина); + ПроверитьАктуальностьМетаданных(); + УстановитьТребуетсяПерезапускСеанса(Результат.ТекстОшибки); + ВызватьИсключение Результат.ТекстОшибки; + КонецЕсли; + Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда + ТекстОшибки = ЗаголовокОшибки + Символы.ПС + Результат.ТекстОшибки; + ВызватьИсключение ТекстОшибки; + КонецЕсли; + ОписаниеВерсии = Результат.ОписаниеВерсии; КонецЕсли; КонецЕсли; - НаборЗаписей = СлужебныйНаборЗаписей(РегистрыСведений.ПараметрыОграниченияДоступа); - Запись = НаборЗаписей.Добавить(); - ЗаполнитьЗначенияСвойств(Запись, ХранимыеПараметры); - - БлокировкаДанных = Новый БлокировкаДанных; - ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ПараметрыОграниченияДоступа"); - ЗаблокированнаяВерсия = 0; - - НачатьТранзакцию(); - Попытка - ОписаниеВерсии = ОписаниеПоследнейВерсии(); - Пока Истина Цикл - Если ОписаниеВерсии.ХешСумма = ХранимыеПараметры.ХешСумма Тогда - Если ОписаниеВерсии.Версия = ЗаблокированнаяВерсия Тогда - Прервать; - КонецЕсли; - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - ЭлементБлокировки.УстановитьЗначение("Версия", ОписаниеВерсии.Версия); - БлокировкаДанных.Заблокировать(); - ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ПараметрыОграниченияДоступа"); - ЗаблокированнаяВерсия = ОписаниеВерсии.Версия; - ОписаниеВерсии = ОписаниеПоследнейВерсии(); - Продолжить; - КонецЕсли; - Если ЗначениеЗаполнено(ОписаниеВерсии.Версия) Тогда - НоваяВерсия = ОписаниеВерсии.Версия + 1; - Иначе - НоваяВерсия = 1; - КонецЕсли; - ЭлементБлокировки.УстановитьЗначение("Версия", НоваяВерсия); - БлокировкаДанных.Заблокировать(); - НовоеОписаниеВерсии = ОписаниеПоследнейВерсии(); - - Если ОписаниеВерсии.Версия <> НовоеОписаниеВерсии.Версия - Или НовоеОписаниеВерсии.Версия = НоваяВерсия Тогда - - ОписаниеВерсии = НовоеОписаниеВерсии; - Продолжить; - КонецЕсли; - - ХранимыеПараметры.Вставить("Версия", НоваяВерсия); - - Запись.Версия = НоваяВерсия; - НаборЗаписей.Отбор.Версия.Установить(НоваяВерсия); - - Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда - СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); - КонецЕсли; - Если Справочники.ВерсииРасширений.РасширенияИзмененыДинамически() Тогда - ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияРасширенийПрограммы() - КонецЕсли; - НедоступныеСписки = Новый Массив; - Списки = СпискиСИзменениемВерсий(ВерсииОграниченийСписков, НедоступныеСписки); - ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(); - ПараметрыПланирования.ВерсииОграниченийСписков = ВерсииОграниченийСписков; - ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина; - ПараметрыПланирования.Описание = "НоваяВерсияПараметровОграниченияДоступа"; - ЗапланироватьОбновлениеДоступа(Списки, ПараметрыПланирования); - Если НедоступныеСписки.Количество() > 0 Тогда - ЗапланироватьОбновлениеДоступа(НедоступныеСписки, ПараметрыПланирования); - КонецЕсли; - - НаборЗаписей.Записать(); - ЕстьИзменения = Истина; - Если РегистрироватьСтрокуВерсииПараметровОграниченияДоступа() Тогда - ЗарегистрироватьСтрокуВерсииПараметровОграниченияДоступа(НаборЗаписей[0], СтрокиВерсии); - КонецЕсли; - Прервать; - КонецЦикла; - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Если Не ХранимыеПараметры.Свойство("Версия") Тогда - ХранимыеПараметры.Вставить("Версия", ОписаниеВерсии.Версия); - ХранимыеПараметры.Вставить("ДатаСоздания", ОписаниеВерсии.ДатаСоздания); + Если ОбщийКонтекст.Свойство("СпискиСУстаревшимиВариантамиДоступа") Тогда + ОбщийКонтекст.СпискиСУстаревшимиВариантамиДоступа = + ОписаниеВерсии.СпискиСУстаревшимиВариантамиДоступа; КонецЕсли; - Если ЕстьИзменения <> Истина И Не ТранзакцияАктивна() Тогда + Если УдалитьСтрокиВерсииХранимыхПараметров Тогда + ОбщийКонтекст.Удалить("СтрокиВерсииХранимыхПараметров"); + + ИначеЕсли ОбщийКонтекст.Свойство("СтрокиВерсииХранимыхПараметров") Тогда + ОбщийКонтекст.СтрокиВерсииХранимыхПараметров = ОписаниеВерсии.СтрокиВерсии; + КонецЕсли; + + Если ОписаниеВерсии.ЕстьИзменения Тогда + ЕстьИзменения = Истина; + КонецЕсли; + + Для Каждого КлючИЗначение Из ОписаниеВерсии.ЗаполняемыеСвойстваВерсии Цикл + ХранимыеПараметры.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; + + Возврат ХранимыеПараметры; + +КонецФункции + +// Для функций НоваяВерсияПараметровОграниченияДоступа и +// ДействующиеПараметрыОграниченияДоступа. +// +Функция ЗавершеныЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа() + + ОтборЗаданий = Новый Структура("ИмяМетода, Состояние", + ИмяПроцедурыЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа(), + СостояниеФоновогоЗадания.Активно); + + НайденныеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ОтборЗаданий); + + Если НайденныеЗадания.Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + + ФоновыеЗадания.ОжидатьЗавершенияВыполнения(НайденныеЗадания, 1); + + Возврат Ложь; + +КонецФункции + +// Для функций НоваяВерсияПараметровОграниченияДоступа и +// ЗавершеныЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа. +// +Функция ИмяПроцедурыЗаданияЗаписиНовойВерсииПараметровОграниченияДоступа() + + Возврат "УправлениеДоступомСлужебный.ЗаписатьНовуюВерсиюПараметровОграниченияДоступаВФоне"; + +КонецФункции + +// Для функции НоваяВерсияПараметровОграниченияДоступа. +Процедура ЗаписатьНовуюВерсиюПараметровОграниченияДоступаВФоне(АдресРезультата, ХранилищеПараметров) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ОписаниеВерсии", Новый Структура); + Результат.Вставить("ТекстОшибки", ""); + Результат.Вставить("ТребуетсяПерезапускСеанса", Ложь); + + УстановитьПривилегированныйРежим(Истина); + Попытка + Параметры = ХранилищеПараметров.Получить(); + Если Параметры.ИдентификаторДоступа = ИдентификаторДоступа() Тогда + Результат.ОписаниеВерсии = ОписаниеНовойВерсииПараметровОграниченияДоступа(Параметры); + Иначе + Результат.ТекстОшибки = НСтр("ru = 'Ошибка проверки доступа.'"); + КонецЕсли; + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + Если ТребуетсяПерезапускСеанса(Результат.ТекстОшибки) Тогда + Результат.ТребуетсяПерезапускСеанса = Истина; + КонецЕсли; + Если Не Результат.ТребуетсяПерезапускСеанса + Или Не ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда + Результат.ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецЕсли; + КонецПопытки; + УстановитьПривилегированныйРежим(Ложь); + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); + +КонецПроцедуры + +// Для функции НоваяВерсияПараметровОграниченияДоступа и +// процедуры ЗаписатьНовуюВерсиюПараметровОграниченияДоступаВФоне. +// +Функция ИдентификаторДоступа() + + Возврат ПоследнееОбновлениеДоступа().ИдентификаторДоступа; + +КонецФункции + +// Для функции НоваяВерсияПараметровОграниченияДоступа и +// процедуры ЗаписатьНовуюВерсиюПараметровОграниченияДоступаВФоне. +// +Функция ОписаниеНовойВерсииПараметровОграниченияДоступа(Параметры, БезЗаписи = Ложь) + + НаборЗаписей = СлужебныйНаборЗаписей(РегистрыСведений.ПараметрыОграниченияДоступа); + Запись = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(Запись, Параметры.ХранимыеПараметры); + + ЗаполняемыеСвойстваВерсии = Новый Структура("Версия, ДатаСоздания, ХешСумма, + |ВерсииПараметровШаблонов, ХешСуммаПостоянныхПараметров, ХешСуммаПараметровШаблонов, + |ДляШаблоновВСеансахПользователей, ДляШаблоновВСеансахВнешнихПользователей"); + + Результат = Новый Структура; + Результат.Вставить("ЕстьИзменения", Ложь); + Результат.Вставить("ЗаполняемыеСвойстваВерсии", ЗаполняемыеСвойстваВерсии); + Результат.Вставить("СпискиСУстаревшимиВариантамиДоступа", + Параметры.СпискиСУстаревшимиВариантамиДоступа); + Параметры.Вставить("СпискиСНовымОсновнымВариантомДоступа", Новый Массив); + Если Параметры.Свойство("СтрокиВерсии") Тогда + Результат.Вставить("СтрокиВерсии", Параметры.СтрокиВерсии); + КонецЕсли; + + Если БезЗаписи Тогда + ОписаниеВерсии = ОписаниеПоследнейВерсии(Истина); + ЗаполнитьПараметрыДляШаблонов(Запись, Параметры, ОписаниеВерсии); + Если ОписаниеВерсии.ХешСумма <> Запись.ХешСумма Тогда + Возврат Неопределено; + КонецЕсли; + Иначе + НачатьТранзакцию(); + Попытка + ОписаниеВерсии = ОписаниеПоследнейВерсии(Истина); + Пока Истина Цикл + ЗаполнитьПараметрыДляШаблонов(Запись, Параметры, ОписаниеВерсии); + Если ОписаниеВерсии.ХешСумма = Запись.ХешСумма Тогда + Прервать; + КонецЕсли; + + ПроверитьАктуальностьМетаданных(); + + Если ЗначениеЗаполнено(ОписаниеВерсии.Версия) Тогда + НоваяВерсия = ОписаниеВерсии.Версия + 1; + Иначе + НоваяВерсия = 1; + КонецЕсли; + + БлокировкаДанных = Новый БлокировкаДанных; + ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрСведений.ПараметрыОграниченияДоступа"); + ЭлементБлокировки.УстановитьЗначение("Версия", НоваяВерсия); + БлокировкаДанных.Заблокировать(); + НовоеОписаниеВерсии = ОписаниеПоследнейВерсии(Истина); + + Если ОписаниеВерсии.Версия <> НовоеОписаниеВерсии.Версия + Или НовоеОписаниеВерсии.Версия = НоваяВерсия Тогда + + ОписаниеВерсии = НовоеОписаниеВерсии; + Продолжить; + КонецЕсли; + + ПроверитьАктуальностьМетаданных(); + + Запись.Версия = НоваяВерсия; + НаборЗаписей.Отбор.Версия.Установить(НоваяВерсия); + ЗаполнитьЗначенияСвойств(ЗаполняемыеСвойстваВерсии, Запись); + + ЗапланироватьОбновлениеДоступаПриИзмененииПараметров(ОписаниеВерсии.Версия, Параметры); + НаборЗаписей.Записать(); + Результат.ЕстьИзменения = Истина; + + Если РегистрироватьСтрокуВерсииПараметровОграниченияДоступа() Тогда + ЗарегистрироватьСтрокуВерсииПараметровОграниченияДоступа(НаборЗаписей[0], + Параметры.СтрокиВерсии); + КонецЕсли; + + Прервать; + КонецЦикла; + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + + Если Не Результат.ЕстьИзменения Тогда + ЗаполнитьЗначенияСвойств(ЗаполняемыеСвойстваВерсии, ОписаниеВерсии, + "Версия, ДатаСоздания, ХешСумма, ВерсииПараметровШаблонов"); + ЗаполнитьЗначенияСвойств(ЗаполняемыеСвойстваВерсии, Запись, + "ХешСуммаПостоянныхПараметров, ХешСуммаПараметровШаблонов, + |ДляШаблоновВСеансахПользователей, ДляШаблоновВСеансахВнешнихПользователей"); + ИначеЕсли Не ТранзакцияАктивна() Тогда ИмяПараметра = "СтандартныеПодсистемы.УправлениеДоступом.ДатаПроверкиПараметровОграниченияДоступа"; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыРасширения(ИмяПараметра, ТекущаяДатаСеанса(), Истина); УстановитьОбновлениеДоступа(Истина); КонецЕсли; - Возврат ХранимыеПараметры; + Возврат Результат; + +КонецФункции + +// Для функции ОписаниеНовойВерсииПараметровОграниченияДоступа. +Процедура ЗапланироватьОбновлениеДоступаПриИзмененииПараметров(СтараяВерсия, Параметры) + + НедоступныеСписки = Новый Массив; + Списки = СпискиСИзменениемВерсий(СтараяВерсия, + Параметры.ВерсииОграниченийСписков, НедоступныеСписки); + + ПараметрыПланирования = ПараметрыПланированияОбновленияДоступа(); + ПараметрыПланирования.ВерсииОграниченийСписков = Параметры.ВерсииОграниченийСписков; + ПараметрыПланирования.ЭтоПродолжениеОбновления = Истина; + ПараметрыПланирования.Описание = "НоваяВерсияПараметровОграниченияДоступа"; + + ЗапланироватьОбновлениеДоступа(Списки, ПараметрыПланирования); + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Истина; + ЗапланироватьОбновлениеДоступа(Списки, ПараметрыПланирования); + + Если ЗначениеЗаполнено(НедоступныеСписки) Тогда + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Ложь; + ЗапланироватьОбновлениеДоступа(НедоступныеСписки, ПараметрыПланирования); + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Истина; + ЗапланироватьОбновлениеДоступа(НедоступныеСписки, ПараметрыПланирования); + КонецЕсли; + + Если ЗначениеЗаполнено(Параметры.СпискиСНовымОсновнымВариантомДоступа) Тогда + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Ложь; + ЗапланироватьОбновлениеДоступа(Параметры.СпискиСНовымОсновнымВариантомДоступа, + ПараметрыПланирования); + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Истина; + ЗапланироватьОбновлениеДоступа(Параметры.СпискиСНовымОсновнымВариантомДоступа, + ПараметрыПланирования); + КонецЕсли; + Если ЗначениеЗаполнено(Параметры.СпискиСУстаревшимиВариантамиДоступа) Тогда + ПараметрыПланирования.ЭтоОбработкаУстаревшихЭлементов = Истина; + ЗапланироватьОбновлениеДоступа(Параметры.СпискиСУстаревшимиВариантамиДоступа, + ПараметрыПланирования); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ОбновитьТаблицыГруппДоступаДляПодключенныхРасширений и +// функции НоваяВерсияПараметровОграниченияДоступа. +// +Процедура ПроверитьАктуальностьМетаданных() + + КонфигурацияИзменена = КонфигурацияБазыДанныхИзмененаДинамически(); + РасширенияИзменены = Справочники.ВерсииРасширений.РасширенияИзмененыДинамически(); + + Если Не КонфигурацияИзменена И Не РасширенияИзменены Тогда + Возврат; + КонецЕсли; + + Попытка + Попытка + Если КонфигурацияИзменена Тогда + СтандартныеПодсистемыСервер.ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияВерсииПрограммы(); + ИначеЕсли РасширенияИзменены Тогда + ПотребоватьПерезапускСеансаПоПричинеДинамическогоОбновленияРасширенийПрограммы(); + КонецЕсли; + Исключение + Если ЭтоСеансФоновогоОбновленияДоступа() Тогда + ВызватьИсключение; + КонецЕсли; + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось проверить или обновить права доступа по причине: + |%1 + | + |Повторите операцию через минуту, если ошибка повторится, перезапустите сеанс.'"), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстОшибки; + КонецПопытки; + Исключение + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + УстановитьТребуетсяПерезапускСеанса(ТекстОшибки); + ПриОшибкеПроверкиАктуальностиМетаданных(ТекстОшибки); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Для процедур ОбработатьРезультатЗадания и ПроверитьАктуальностьМетаданных. +Процедура УстановитьТребуетсяПерезапускСеанса(КраткоеПредставлениеОшибки) + + Если ТребуетсяПерезапускСеанса() Тогда + Возврат; + КонецЕсли; + + ТекущиеПараметры = Новый Структура(ПараметрыСеанса.ПараметрыОграниченияДоступа); + ТекущиеПараметры.Вставить("ТребуетсяПерезапускСеанса", КраткоеПредставлениеОшибки); + ПараметрыСеанса.ПараметрыОграниченияДоступа = Новый ФиксированнаяСтруктура(ТекущиеПараметры); + +КонецПроцедуры + +// Для процедур ВыполнитьОбновлениеДоступаНаУровнеЗаписей, +// ДобавитьЗаданияОбновленияДоступа, +// ВыполнитьОбновлениеДоступаСпискаСПопыткамиПовтора, +// УстановитьТребуетсяПерезапускСеанса и +// функции ЭтоОшибкаПроверкиАктуальностиМетаданных. +// +Функция ТребуетсяПерезапускСеанса(КраткоеПредставлениеОшибки = "") + + Если Не ПараметрыСеанса.ПараметрыОграниченияДоступа.Свойство("ТребуетсяПерезапускСеанса") Тогда + Возврат Ложь; + КонецЕсли; + + КраткоеПредставлениеОшибки = ПараметрыСеанса.ПараметрыОграниченияДоступа.ТребуетсяПерезапускСеанса; + + Возврат Истина; + +КонецФункции + +// Для процедур ВыполнитьОбновлениеДоступаНаУровнеЗаписей, +// ДобавитьЗаданияОбновленияДоступа, +// ВыполнитьОбновлениеДоступаСпискаСПопыткамиПовтора и +// функции НоваяВерсияПараметровОграниченияДоступа. +// +Функция ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) + + ТекстОшибки = ""; + Если Не ТребуетсяПерезапускСеанса(ТекстОшибки) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ТипЗнч(ИнформацияОбОшибке) = Тип("ИнформацияОбОшибке") + И ЗначениеЗаполнено(ТекстОшибки) + И СтрНачинаетсяС(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстОшибки); + +КонецФункции + +// Для процедуры УстановитьОбновлениеДоступа +Функция ЭтоСеансФоновогоОбновленияДоступа() + + Если ТекущийРежимЗапуска() <> Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + ТекущийСеанс = ПолучитьТекущийСеансИнформационнойБазы(); + ТекущееФоновоеЗадание = ТекущийСеанс.ПолучитьФоновоеЗадание(); + Если ТекущееФоновоеЗадание = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Возврат ТекущееФоновоеЗадание.ИмяМетода = ИмяМетодаПотокаОбновленияДоступа() + Или ТекущееФоновоеЗадание.ИмяМетода = ИмяМетодаЗаданияОбновленияДоступа(); КонецФункции @@ -22428,10 +23488,13 @@ "Версия = %1 |ДатаСоздания = %2 |ХешСумма = %3 - |", + |ХешСуммаПостоянныхПараметров = %4 + |ХешСуммаПараметровШаблонов = %5", Запись.Версия, Формат(Запись.ДатаСоздания, "ДЛФ=DT"), - Запись.ХешСумма)); + Запись.ХешСумма, + Запись.ХешСуммаПостоянныхПараметров, + Запись.ХешСуммаПараметровШаблонов)); Для Каждого Строка Из СтрокиВерсии.СтрокиВерсийСписков Цикл Состав.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -22449,6 +23512,12 @@ Состав.Добавить("[ВсеВидыОграниченийСтрокой] |" + СтрокиВерсии.ВсеВидыОграниченийСтрокой); + Состав.Добавить("[СпискиСОграничениемПоПолямВСеансахПользователей] + |" + СтрокиВерсии.СпискиСОграничениемПоПолямВСеансахПользователей); + + Состав.Добавить("[СпискиСОграничениемПоПолямВСеансахВнешнихПользователей] + |" + СтрокиВерсии.СпискиСОграничениемПоПолямВСеансахВнешнихПользователей); + Комментарий = СтрСоединить(Состав, Символы.ПС); ЗаписьЖурналаРегистрации( @@ -22456,19 +23525,19 @@ ОбщегоНазначения.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация, Метаданные.РегистрыСведений.ПараметрыОграниченияДоступа,, - Комментарий); + Комментарий, + РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); КонецПроцедуры // Для функции НоваяВерсияПараметровОграниченияДоступа. -Функция СпискиСИзменениемВерсий(НовыеВерсииОграниченийСписков, НедоступныеСписки) +Функция СпискиСИзменениемВерсий(Версия, НовыеВерсииОграниченийСписков, НедоступныеСписки) - ОписаниеВерсии = ОписаниеПоследнейВерсии(); - Если Не ЗначениеЗаполнено(ОписаниеВерсии.Версия) Тогда + Если Не ЗначениеЗаполнено(Версия) Тогда Возврат Неопределено; КонецЕсли; - ВерсияПараметров = ВерсияПараметров(ОписаниеВерсии.Версия, Ложь, Ложь); + ВерсияПараметров = ВерсияПараметров(Версия, Ложь, Ложь); ПараметрыЗаписиХранилище = ВерсияПараметров.ДляЗаписиОбъектовИПроверкиПрав; Если ТипЗнч(ПараметрыЗаписиХранилище) <> Тип("ХранилищеЗначения") Тогда @@ -22583,7 +23652,7 @@ // Число нужно увеличивать при внесении изменений в состав параметров кэша // (в том числе при изменении версии шаблонов). - Возврат "20"; + Возврат "21"; КонецФункции @@ -22596,8 +23665,8 @@ Функция ВерсииШаблоновОграниченияДоступа() Возврат - ",ДляОбъекта7, - |,ДляРегистра7, + ",ДляОбъекта8, + |,ДляРегистра8, |,ПоЗначениям17, |,ПоЗначениямРасширенный17, |,ПоЗначениямИНаборамРасширенный17, @@ -22605,6 +23674,21 @@ КонецФункции +// Для процедур УстановитьВерсиюПараметров, ЗаполнитьПараметрыДляШаблонов и +// функции НоваяСтруктураХранимыхВерсийПараметровШаблонов. +// +// +// Возвращаемое значение: +// Строка +// +Функция ВерсияСтруктурыВерсийПараметровШаблонов() + + // Число нужно увеличивать только при внесении изменений + // в состав параметра ВерсииПараметровШаблонов. + Возврат "1"; + +КонецФункции + // Для функции ДействующиеПараметрыОграниченияДоступа. Процедура ОбновитьИдентификаторыТранзакции(ИдентификаторТранзакции) @@ -22650,6 +23734,20 @@ ДляЗаписиОбъектовИПроверкиПрав = Неопределено; КонецЕсли; + Если ТипЗнч(ВерсияПараметров.ВерсииПараметровШаблонов) = Тип("ХранилищеЗначения") Тогда + ВерсииПараметровШаблонов = СтруктураХранимыхВерсийПараметровШаблонов( + ВерсияПараметров.ВерсииПараметровШаблонов.Получить()); + + Если ВерсииПараметровШаблонов.ВерсияСтруктурыВерсий <> ВерсияСтруктурыВерсийПараметровШаблонов() Тогда + ВерсияПараметров = НоваяВерсияПараметровОграниченияДоступа(ОбщийКонтекст); + УстановитьВерсиюПараметров(ВерсияПараметров, ИдентификаторТранзакции, ОбщийКонтекст, + УстановкаПараметровСеансаДляШаблонов, Истина); + Возврат; + КонецЕсли; + Иначе + ВерсииПараметровШаблонов = Неопределено; + КонецЕсли; + Если ТипЗнч(ВерсияПараметров.ДляОтчетаПоПравамДоступа) = Тип("ХранилищеЗначения") Тогда ДляОтчетаПоПравамДоступа = СтруктураХранимыхПараметровОтчета( ВерсияПараметров.ДляОтчетаПоПравамДоступа.Получить()); @@ -22667,13 +23765,13 @@ Если УстановкаПараметровСеансаДляШаблонов Или ПараметрыСеанса.ПараметрыОграниченияДоступа.Свойство("ПараметрыСеансаДляШаблоновУстановлены") Тогда - ХранилищеДляШаблоновОграниченияДоступа = ?(Пользователи.ЭтоСеансВнешнегоПользователя(), + ХранилищеДляШаблоновВСеансах = ?(Пользователи.ЭтоСеансВнешнегоПользователя(), ВерсияПараметров.ДляШаблоновВСеансахВнешнихПользователей, ВерсияПараметров.ДляШаблоновВСеансахПользователей); - Если ТипЗнч(ХранилищеДляШаблоновОграниченияДоступа) = Тип("ХранилищеЗначения") Тогда + Если ТипЗнч(ХранилищеДляШаблоновВСеансах) = Тип("ХранилищеЗначения") Тогда ДляШаблоновОграниченияДоступа = СтруктураХранимыхПараметровШаблонов( - ХранилищеДляШаблоновОграниченияДоступа.Получить()); + ХранилищеДляШаблоновВСеансах.Получить()); Если ДляШаблоновОграниченияДоступа.ВерсияСтруктурыКэша <> ВерсияСтруктурыКэша() Тогда ВерсияПараметров = НоваяВерсияПараметровОграниченияДоступа(ОбщийКонтекст); @@ -22713,7 +23811,7 @@ ОбновитьРазрешенныеНаборыВПараметрахСеанса(УстановкаПараметровСеансаДляШаблонов, Истина); Параметры = СеансовыеПараметрыОграниченияДоступа(ВерсияПараметров, - ДляЗаписиОбъектовИПроверкиПрав, УстановкаПараметровСеансаДляШаблонов); + ДляЗаписиОбъектовИПроверкиПрав, ВерсииПараметровШаблонов, УстановкаПараметровСеансаДляШаблонов); ПараметрыСеанса.ПараметрыОграниченияДоступа = Параметры; КонецПроцедуры @@ -22728,19 +23826,42 @@ // * Параметры - см. СтруктураХранимыхПараметровЗаписи // Функция СеансовыеПараметрыОграниченияДоступа(ВерсияПараметров, ДляЗаписиОбъектовИПроверкиПрав, - УстановкаПараметровСеансаДляШаблонов) + ВерсииПараметровШаблонов, УстановкаПараметровСеансаДляШаблонов) ПараметрыОграничения = Новый Структура; ПараметрыОграничения.Вставить("Версия", ВерсияПараметров.Версия); ПараметрыОграничения.Вставить("ХешСумма", ВерсияПараметров.ХешСумма); ПараметрыОграничения.Вставить("ДатаСоздания", ВерсияПараметров.ДатаСоздания); - ПараметрыОграничения.Вставить("Параметры", ДляЗаписиОбъектовИПроверкиПрав); + + Если ДляЗаписиОбъектовИПроверкиПрав = Неопределено Тогда + Параметры = Неопределено; + Иначе + ПрочитанныеПараметры = Новый Структура(ДляЗаписиОбъектовИПроверкиПрав); + ДополнительныйКонтекст = Новый Структура(ПрочитанныеПараметры.ДополнительныйКонтекст); + ДляПользователей = Новый Структура(ДополнительныйКонтекст.ДляПользователей); + ДляПользователей.ОсновныеВариантыДоступа = Новый ФиксированноеСоответствие( + ВерсииПараметровШаблонов.ДляПользователей.ОсновныеВариантыДоступа); + ДополнительныйКонтекст.ДляПользователей = Новый ФиксированнаяСтруктура(ДляПользователей); + ДляВнешнихПользователей = Новый Структура(ДополнительныйКонтекст.ДляВнешнихПользователей); + ДляВнешнихПользователей.ОсновныеВариантыДоступа = Новый ФиксированноеСоответствие( + ВерсииПараметровШаблонов.ДляВнешнихПользователей.ОсновныеВариантыДоступа); + ДополнительныйКонтекст.ДляВнешнихПользователей = Новый ФиксированнаяСтруктура(ДляВнешнихПользователей); + ПрочитанныеПараметры.ДополнительныйКонтекст = Новый ФиксированнаяСтруктура(ДополнительныйКонтекст); + Параметры = Новый ФиксированнаяСтруктура(ПрочитанныеПараметры); + КонецЕсли; + + ПараметрыОграничения.Вставить("Параметры", Параметры); Если УстановкаПараметровСеансаДляШаблонов Или ПараметрыСеанса.ПараметрыОграниченияДоступа.Свойство("ПараметрыСеансаДляШаблоновУстановлены") Тогда ПараметрыОграничения.Вставить("ПараметрыСеансаДляШаблоновУстановлены"); КонецЕсли; + Если ПараметрыСеанса.ПараметрыОграниченияДоступа.Свойство("ЗаписьПараметровОграниченияДоступаВТекущемСеансе") Тогда + ПараметрыОграничения.Вставить("ЗаписьПараметровОграниченияДоступаВТекущемСеансе", + ПараметрыСеанса.ПараметрыОграниченияДоступа.ЗаписьПараметровОграниченияДоступаВТекущемСеансе); + КонецЕсли; + Возврат Новый ФиксированнаяСтруктура(ПараметрыОграничения); КонецФункции @@ -22777,36 +23898,8 @@ КонецЕсли; ПоследняяПроверка.Дата = ТекущаяДатаСеанса(); - ПустойНаборГруппДоступа = Справочники.НаборыГруппДоступа.ПустаяСсылка(); - Состав = Новый Структура; - Состав.Вставить("РазрешенныйПользователь", ПустойНаборГруппДоступа); - Состав.Вставить("РазрешенныйНаборГруппДоступа", ПустойНаборГруппДоступа); - Состав.Вставить("РазрешенныйНаборГруппПользователей", ПустойНаборГруппДоступа); - Состав.Вставить("РазрешенныйПустойНаборГруппДоступа", - УправлениеДоступомСлужебныйПовтИсп.РазрешенныйПустойНаборГруппДоступа()); - - Если Не Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда - Состав.РазрешенныйПользователь = Справочники.НаборыГруппДоступа.ПолучитьСсылку( - Пользователи.АвторизованныйПользователь().УникальныйИдентификатор()); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("РазрешенныйПользователь", Состав.РазрешенныйПользователь); - Запрос.Текст = - "ВЫБРАТЬ - | НаборыГруппДоступа.РазрешенныйНаборГруппДоступа КАК РазрешенныйНаборГруппДоступа, - | НаборыГруппДоступа.РазрешенныйНаборГруппПользователей КАК РазрешенныйНаборГруппПользователей - |ИЗ - | Справочник.НаборыГруппДоступа КАК НаборыГруппДоступа - |ГДЕ - | НаборыГруппДоступа.Ссылка = &РазрешенныйПользователь"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - Состав.РазрешенныйНаборГруппДоступа = Выборка.РазрешенныйНаборГруппДоступа; - Состав.РазрешенныйНаборГруппПользователей = Выборка.РазрешенныйНаборГруппПользователей; - КонецЕсли; - КонецЕсли; + Состав = РазрешенныеНаборыПараметровЗапроса(); Если Не УстановкаПараметровСеансаДляШаблонов И ПараметрыСеанса.РазрешенныйПользователь = Состав.РазрешенныйПользователь @@ -22825,6 +23918,64 @@ КонецПроцедуры +// Для процедуры ОбновитьРазрешенныеНаборыВПараметрахСеанса и +// УстановитьРазрешенныеНаборыВПараметрыЗапроса. +// +// Параметры: +// Пользователь - СправочникСсылка.Пользователи +// - СправочникСсылка.ВнешниеПользователи +// - Неопределено - текущий пользователь. +// +// Возвращаемое значение: +// Структура: +// * РазрешенныйПользователь - СправочникСсылка.НаборыГруппДоступа +// * РазрешенныйНаборГруппДоступа - СправочникСсылка.НаборыГруппДоступа +// * РазрешенныйНаборГруппПользователей - СправочникСсылка.НаборыГруппДоступа +// * РазрешенныйПустойНаборГруппДоступа - СправочникСсылка.НаборыГруппДоступа +// +Функция РазрешенныеНаборыПараметровЗапроса(Знач Пользователь = Неопределено) + + ПустойНаборГруппДоступа = Справочники.НаборыГруппДоступа.ПустаяСсылка(); + + Состав = Новый Структура; + Состав.Вставить("РазрешенныйПользователь", ПустойНаборГруппДоступа); + Состав.Вставить("РазрешенныйНаборГруппДоступа", ПустойНаборГруппДоступа); + Состав.Вставить("РазрешенныйНаборГруппПользователей", ПустойНаборГруппДоступа); + Состав.Вставить("РазрешенныйПустойНаборГруппДоступа", + УправлениеДоступомСлужебныйПовтИсп.РазрешенныйПустойНаборГруппДоступа()); + + Если Пользователи.ЭтоПолноправныйПользователь(Пользователь,, Ложь) Тогда + Возврат Состав; + КонецЕсли; + + Если Пользователь = Неопределено Тогда + Пользователь = Пользователи.АвторизованныйПользователь(); + КонецЕсли; + + Состав.РазрешенныйПользователь = Справочники.НаборыГруппДоступа.ПолучитьСсылку( + Пользователь.УникальныйИдентификатор()); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("РазрешенныйПользователь", Состав.РазрешенныйПользователь); + Запрос.Текст = + "ВЫБРАТЬ + | НаборыГруппДоступа.РазрешенныйНаборГруппДоступа КАК РазрешенныйНаборГруппДоступа, + | НаборыГруппДоступа.РазрешенныйНаборГруппПользователей КАК РазрешенныйНаборГруппПользователей + |ИЗ + | Справочник.НаборыГруппДоступа КАК НаборыГруппДоступа + |ГДЕ + | НаборыГруппДоступа.Ссылка = &РазрешенныйПользователь"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Состав.РазрешенныйНаборГруппДоступа = Выборка.РазрешенныйНаборГруппДоступа; + Состав.РазрешенныйНаборГруппПользователей = Выборка.РазрешенныйНаборГруппПользователей; + КонецЕсли; + + Возврат Состав; + +КонецФункции + // Для процедуры ОбновитьРазрешенныеНаборыВПараметрахСеанса. Процедура УчестьНастройкиПравПриПостроенииПланаВыполненияЗапроса(Состав) @@ -22858,13 +24009,20 @@ КонецФункции // Для функции ДоступРазрешен и процедур ПроверитьДоступКОбъекту, ПроверитьДоступКНаборуЗаписей. -Процедура УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос) +Процедура УстановитьРазрешенныеНаборыВПараметрыЗапроса(Запрос, Знач Пользователь = Неопределено) - Запрос.УстановитьПараметр("РазрешенныйНаборГруппДоступа", ПараметрыСеанса.РазрешенныйНаборГруппДоступа); - Запрос.УстановитьПараметр("РазрешенныйПустойНаборГруппДоступа", ПараметрыСеанса.РазрешенныйПустойНаборГруппДоступа); - Запрос.УстановитьПараметр("РазрешенныйНаборГруппПользователей", ПараметрыСеанса.РазрешенныйНаборГруппПользователей); - Запрос.УстановитьПараметр("РазрешенныйПользователь", ПараметрыСеанса.РазрешенныйПользователь); - Запрос.УстановитьПараметр("АвторизованныйПользователь", Пользователи.АвторизованныйПользователь()); + Если Пользователь = Неопределено Тогда + Параметры = ПараметрыСеанса; + Пользователь = Пользователи.АвторизованныйПользователь(); + Иначе + Параметры = РазрешенныеНаборыПараметровЗапроса(Пользователь); + КонецЕсли; + + Запрос.УстановитьПараметр("РазрешенныйНаборГруппДоступа", Параметры.РазрешенныйНаборГруппДоступа); + Запрос.УстановитьПараметр("РазрешенныйПустойНаборГруппДоступа", Параметры.РазрешенныйПустойНаборГруппДоступа); + Запрос.УстановитьПараметр("РазрешенныйНаборГруппПользователей", Параметры.РазрешенныйНаборГруппПользователей); + Запрос.УстановитьПараметр("РазрешенныйПользователь", Параметры.РазрешенныйПользователь); + Запрос.УстановитьПараметр("АвторизованныйПользователь", Пользователь); КонецПроцедуры @@ -22876,15 +24034,23 @@ // // Возвращаемое значение: // Структура: -// * ДляШаблоновВСеансахПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов -// * ДляШаблоновВСеансахВнешнихПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов +// * ДатаСоздания - Дата // * ДляЗаписиОбъектовИПроверкиПрав - см. НоваяСтруктураХранимыхПараметровЗаписи // * ДляОтчетаПоПравамДоступа - см. НоваяСтруктураХранимыхПараметровОтчета -// * ХешСумма - Строка -// * ДатаСоздания - Дата +// * ХешСуммаПостоянныхПараметров - Строка +// * ДляШаблоновВСеансахПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов +// * ДляШаблоновВСеансахВнешнихПользователей - см. НоваяСтруктураХранимыхПараметровШаблонов +// * ВерсииПараметровШаблонов - см. НоваяСтруктураХранимыхВерсийПараметровШаблонов +// * ХешСуммаПараметровШаблонов - Строка - заполняется при записи после обновления +// параметра ВерсииПараметровШаблонов и заполнения свойства СпискиСОграничениемПоПолям +// параметров ДляШаблоновВСеансахПользователей, ДляШаблоновВСеансахВнешнихПользователей. +// * ХешСумма - Строка - заполняется при записи, +// вычисляется из хеш-сумм ХешСуммаПостоянныхПараметров и ХешСуммаПараметровШаблонов. // Функция ХранимыеПараметрыОграниченияДоступа(ОбщийКонтекст, ВерсииОграниченийСписков = Неопределено) + ДатаСоздания = ТекущаяДатаСеанса(); + Если ОбщийКонтекст = Неопределено Тогда ОбновитьПовторноИспользуемыеЗначения(); ОбщийКонтекст = ОбщийКонтекстРасчетаПараметровОграничения(); @@ -22930,11 +24096,13 @@ // Заполнение для пользователей. КонтекстДляПользователей = Новый Структура; КонтекстДляПользователей.Вставить("ДляВнешнихПользователей", Ложь); + КонтекстДляПользователей.Вставить("ДатаСоздания", ДатаСоздания); КонтекстДляПользователей.Вставить("ОбщийКонтекст", ОбщийКонтекст); КонтекстДляПользователей.Вставить("ДополнительныйКонтекст", ДополнительныйКонтекстДляПользователей); КонтекстДляПользователей.Вставить("ВедущиеСписки", Новый Соответствие); КонтекстДляПользователей.Вставить("ВерсииОграниченийСписков", Новый Соответствие); КонтекстДляПользователей.Вставить("ПараметрыШаблонов", НоваяСтруктураПараметровШаблонов()); + КонтекстДляПользователей.Вставить("ВерсииПараметровШаблонов", НовыеВерсииПараметровШаблонов()); КонтекстДляПользователей.Вставить("СпискиСДатой", СпискиСДатой); КонтекстДляПользователей.Вставить("ИдентификаторыСписков", ИдентификаторыСписков); КонтекстДляПользователей.Вставить("ВсеВидыОграниченийПрав", ВсеВидыОграниченийПрав); @@ -22944,11 +24112,13 @@ // Заполнение для внешних пользователей. КонтекстДляВнешнихПользователей = Новый Структура; КонтекстДляВнешнихПользователей.Вставить("ДляВнешнихПользователей", Истина); + КонтекстДляВнешнихПользователей.Вставить("ДатаСоздания", ДатаСоздания); КонтекстДляВнешнихПользователей.Вставить("ОбщийКонтекст", ОбщийКонтекст); КонтекстДляВнешнихПользователей.Вставить("ДополнительныйКонтекст", ДополнительныйКонтекстДляВнешнихПользователей); КонтекстДляВнешнихПользователей.Вставить("ВедущиеСписки", Новый Соответствие); КонтекстДляВнешнихПользователей.Вставить("ВерсииОграниченийСписков", Новый Соответствие); КонтекстДляВнешнихПользователей.Вставить("ПараметрыШаблонов", НоваяСтруктураПараметровШаблонов()); + КонтекстДляВнешнихПользователей.Вставить("ВерсииПараметровШаблонов", НовыеВерсииПараметровШаблонов()); КонтекстДляВнешнихПользователей.Вставить("СпискиСДатой", СпискиСДатой); КонтекстДляВнешнихПользователей.Вставить("ИдентификаторыСписков", ИдентификаторыСписков); КонтекстДляВнешнихПользователей.Вставить("ВсеВидыОграниченийПрав", ВсеВидыОграниченийПрав); @@ -23028,6 +24198,14 @@ ХранимыеПараметры.Вставить("ДляШаблоновВСеансахВнешнихПользователей", Новый ХранилищеЗначения(ОбщегоНазначения.ФиксированныеДанные(ХранимыеПараметрыШаблоновДляВнешнихПользователей))); + ХранимыхВерсииПараметровШаблонов = НоваяСтруктураХранимыхВерсийПараметровШаблонов(); + ХранимыхВерсииПараметровШаблонов.ДляПользователей.ВерсииПараметровШаблонов = + КонтекстДляПользователей.ВерсииПараметровШаблонов; + ХранимыхВерсииПараметровШаблонов.ДляВнешнихПользователей.ВерсииПараметровШаблонов = + КонтекстДляВнешнихПользователей.ВерсииПараметровШаблонов; + ХранимыеПараметры.Вставить("ВерсииПараметровШаблонов", + Новый ХранилищеЗначения(ХранимыхВерсииПараметровШаблонов)); + ХранимыеПараметры.Вставить("ДляЗаписиОбъектовИПроверкиПрав", Новый ХранилищеЗначения(ОбщегоНазначения.ФиксированныеДанные(ПараметрыЗаписи))); @@ -23048,8 +24226,8 @@ ХранимыеПараметры.Вставить("ДляОтчетаПоПравамДоступа", Новый ХранилищеЗначения(ОбщегоНазначения.ФиксированныеДанные(ХранимыеПараметрыОтчета))); - ХранимыеПараметры.Вставить("ХешСумма", Base64Строка(ХешированиеДанных.ХешСумма)); - ХранимыеПараметры.Вставить("ДатаСоздания", ТекущаяДатаСеанса()); + ХранимыеПараметры.Вставить("ХешСуммаПостоянныхПараметров", Base64Строка(ХешированиеДанных.ХешСумма)); + ХранимыеПараметры.Вставить("ДатаСоздания", ДатаСоздания); Если ОбщийКонтекст.Свойство("СтрокиВерсииХранимыхПараметров") Тогда СтрокиВерсийСписков.Сортировать("Список, ДляВнешнихПользователей"); @@ -23096,24 +24274,25 @@ // // Возвращаемое значение: // Структура: -// * ОписанияОграничений - Соответствие: +// * ОписанияОграничений - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. СокращенноеОписаниеОграничения -// * СвойстваОграниченияСписков - Соответствие: +// * СвойстваОграниченияСписков - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. НовыеСвойстваОграниченияСписка -// * СпискиСОграничениемПоВладельцу - Соответствие: +// * СпискиСОграничениемПоВладельцу - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - значение ПоВладельцу, кроме Неопределено. -// * СпискиСОтключеннымОграничением - Соответствие: +// * СпискиСОтключеннымОграничением - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСОтключеннымОграничениемЧтения - Соответствие: +// * СпискиСОтключеннымОграничениемЧтения - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие: +// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина +// * ОсновныеВариантыДоступа - см. НовыеОсновныеВариантыДоступа // Функция НовыйДополнительныйКонтекст() @@ -23124,6 +24303,7 @@ ДополнительныйКонтекст.Вставить("СпискиСОтключеннымОграничением", Новый Соответствие); ДополнительныйКонтекст.Вставить("СпискиСОтключеннымОграничениемЧтения", Новый Соответствие); ДополнительныйКонтекст.Вставить("СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей", Неопределено); + ДополнительныйКонтекст.Вставить("ОсновныеВариантыДоступа", Новый Соответствие); Возврат ДополнительныйКонтекст; @@ -23133,18 +24313,19 @@ // // Возвращаемое значение: // Структура: -// * СвойстваОграниченияСписков - Соответствие: +// * СвойстваОграниченияСписков - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. НовыеСвойстваОграниченияСписка -// * СпискиСОтключеннымОграничением - Соответствие: +// * СпискиСОтключеннымОграничением - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСОтключеннымОграничениемЧтения - Соответствие: +// * СпискиСОтключеннымОграничениемЧтения - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие: +// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина +// * ОсновныеВариантыДоступа - см. НовыеОсновныеВариантыДоступа // Функция НовыйХранимыйДополнительныйКонтекст() @@ -23153,6 +24334,7 @@ ДополнительныйКонтекст.Вставить("СпискиСОтключеннымОграничением", Новый Соответствие); ДополнительныйКонтекст.Вставить("СпискиСОтключеннымОграничениемЧтения", Новый Соответствие); ДополнительныйКонтекст.Вставить("СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей", Неопределено); + ДополнительныйКонтекст.Вставить("ОсновныеВариантыДоступа", Новый Соответствие); Возврат ДополнительныйКонтекст; @@ -23243,7 +24425,7 @@ Свойства.КлючиДоступаПользователей = Истина; УстановитьСвойствоОграничения(ПолноеИмя, "РассчитыватьПраваПользователей", Истина, Контекст); КонецЕсли; - Если Параметры.ИспользуетсяОграничениеПоВладельцу Тогда + Если Параметры.ПолеВладельца <> Неопределено Тогда УстановитьСвойствоОграничения(ПолноеИмя, "ПолеВладельца", Параметры.ПолеВладельца, Контекст); КонецЕсли; @@ -23271,7 +24453,7 @@ УстановитьСвойствоОграничения(ВедущийСписок, "РассчитыватьПраваПользователей", Истина, Контекст); КонецЕсли; - Если ПараметрыВедущего.ИспользуетсяОграничениеПоВладельцу Тогда + Если ПараметрыВедущего.ПолеВладельца <> Неопределено Тогда УстановитьСвойствоОграничения(ВедущийСписок, "ПолеВладельца", ПараметрыВедущего.ПолеВладельца, Контекст); КонецЕсли; @@ -23423,7 +24605,7 @@ Контекст.ВедущиеСписки.Вставить(ПолноеИмя, ВедущиеСписки); КонецЕсли; - НастроитьПараметрыШаблонов(СвойстваСписка, Контекст.ПараметрыШаблонов); + НастроитьПараметрыШаблонов(СвойстваСписка, Контекст); Если СвойстваСписка.Параметры.СписокСДатой Тогда Контекст.СпискиСДатой.Вставить(СвойстваСписка.ПолноеИмя, Истина); @@ -23552,7 +24734,8 @@ Продолжить; КонецЕсли; Если ЗависимыйСписокСОптимизацией Тогда - Если СвойстваВедущегоСписка.Параметры.ПолеВладельца <> Неопределено Тогда + Если СвойстваВедущегоСписка.Параметры.ПолеВладельца <> Неопределено + И Не СвойстваВедущегоСписка.Параметры.ПолеВладельца.Отключено Тогда Если СвойстваВедущегоСписка.Параметры.ТребуетсяОграничениеПоВладельцу Тогда ИмяПризнакаОптимизации = ?(Контекст.ДляВнешнихПользователей, "ПоВладельцуБезЗаписиКлючейДоступаДляВнешнихПользователей", "ПоВладельцуБезЗаписиКлючейДоступа"); @@ -23569,7 +24752,9 @@ ВызватьИсключение ТекстОшибки; Иначе СвойстваВедущегоСписка.ОграничениеПоВладельцуОтключено = Истина; - УстановитьСвойствоОграничения(СвойстваВедущегоСписка.ПолноеИмя, "ПолеВладельца", Неопределено, Контекст); + СвойстваВедущегоСписка.Параметры.ПолеВладельца.Отключено = Истина; + УстановитьСвойствоОграничения(СвойстваВедущегоСписка.ПолноеИмя, + "ПолеВладельца", СвойстваВедущегоСписка.Параметры.ПолеВладельца, Контекст); КонецЕсли; КонецЕсли; СвойстваВедущегоСписка.ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа = Истина; @@ -23752,7 +24937,7 @@ // // Возвращаемое значение: // Структура: -// * ЗависимыеСписки - Соответствие: +// * ЗависимыеСписки - Соответствие из КлючИЗначение: // * Ключ - Строка - полное имя списка // * Значение - Булево - Истина // * ПоЗначениямПолей - Структура - похожая на см. ВедущийСписокПоПоЗначениямПолей @@ -23818,13 +25003,33 @@ КонецПроцедуры // Для процедуры ДобавитьХранимыеПараметрыОграниченияДляВидаПользователей. -Процедура НастроитьПараметрыШаблонов(СвойстваСписка, ПараметрыШаблонов) +Процедура НастроитьПараметрыШаблонов(СвойстваСписка, Контекст) Параметры = СвойстваСписка.Параметры; Если Параметры.ДоступЗапрещен Тогда Возврат; КонецЕсли; + Если Не Параметры.ИспользуетсяОграничениеПоВладельцу + И Не Параметры.ЭтоСсылочныйТип + И Не Параметры.ОграничениеОтключено Тогда + + ОпорныеПоля = Параметры.ОпорныеПоля; + Версия = НоваяВерсияПараметровШаблонов(); + Версия.ДатаСоздания = Контекст.ДатаСоздания; + Версия.Список = СвойстваСписка.ПолноеИмя; + Версия.ПоляСоединения = СтрСоединить(ОпорныеПоля.Используемые, ","); + Версия.ПоляШаблона = СтрСоединить(ОпорныеПоля.Все, ","); + Версия.ВариантДоступа = ОпорныеПоля.Используемые.Количество() * 2 + + ?(Контекст.ДляВнешнихПользователей, 1, 0); + Версии = Новый Массив; + Версии.Добавить(Версия); + КлючТаблицы = КлючТаблицы(СвойстваСписка.ПолноеИмя, Параметры.Контекст.ИмяКоллекцииТипа); + Контекст.ВерсииПараметровШаблонов.Вставить(КлючТаблицы, Версии); + КонецЕсли; + + ПараметрыШаблонов = Контекст.ПараметрыШаблонов; + Если Параметры.ОграничениеЧтенияОтключено Тогда ПараметрыШаблонов.СпискиСОтключеннымОграничениемЧтения = ПараметрыШаблонов.СпискиСОтключеннымОграничениемЧтения @@ -23832,12 +25037,20 @@ Возврат; КонецЕсли; - Если Параметры.ИспользуетсяОграничениеПоВладельцу Тогда - ПолеВладельца = Параметры.ПолеВладельца; // См. НовоеПолеВладельца - Поля = ":" + ПолеВладельца.Имя; + ПолеВладельцаОтключено = ""; + + Если Параметры.ИспользуетсяОграничениеПоВладельцу + Или Параметры.ЭтоСсылочныйТип Тогда - ИначеЕсли Параметры.ЭтоСсылочныйТип Тогда - Поля = ":"; + ПолеВладельца = Параметры.ПолеВладельца; // См. НовоеПолеВладельца + Если ПолеВладельца <> Неопределено Тогда + Поля = ":" + ПолеВладельца.Имя; + Если Не Параметры.ИспользуетсяОграничениеПоВладельцу Тогда + ПолеВладельцаОтключено = ";-"; + КонецЕсли; + Иначе + Поля = ":"; + КонецЕсли; Иначе ОпорныеПоля = Параметры.ОпорныеПоля; Если ЗначениеЗаполнено(Параметры.ИмяОтдельногоРегистраКлючей) Тогда @@ -23848,20 +25061,10 @@ КонецЕсли; Поля = ":[" + Поля + "]"; Номер = 1; - НомерИспользуемого = 1; Для Каждого ИмяПоля Из ОпорныеПоля.Все Цикл Поля = Поля + ":" + ИмяПоля; - Если ОпорныеПоля.Используемые.Найти(ИмяПоля) <> Неопределено Тогда - ПараметрыШаблонов.СпискиСОграничениемПоПолям = ПараметрыШаблонов.СпискиСОграничениемПоПолям - + СвойстваСписка.ПолноеИмя + ":Поле" + НомерИспользуемого + "=Поле" + Номер + ";" + Символы.ПС; - НомерИспользуемого = НомерИспользуемого + 1; - КонецЕсли; Номер = Номер + 1; КонецЦикла; - Для Номер = НомерИспользуемого По ОпорныеПоля.МаксимальноеКоличество Цикл - ПараметрыШаблонов.СпискиСОграничениемПоПолям = ПараметрыШаблонов.СпискиСОграничениемПоПолям - + СвойстваСписка.ПолноеИмя + ":Поле" + Номер + "=Null;" + Символы.ПС; - КонецЦикла; НомерПустогоПоля = ОпорныеПоля.Все.Количество() + 1; Для Номер = НомерПустогоПоля По ОпорныеПоля.МаксимальноДопустимоеКоличество Цикл Поля = Поля + ":"; @@ -23870,18 +25073,690 @@ ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаГруппДоступа = ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаГруппДоступа - + СвойстваСписка.ПолноеИмя + Поля + ";*" + Символы.ПС; + + СвойстваСписка.ПолноеИмя + Поля + ";*" + ПолеВладельцаОтключено + Символы.ПС; Если СвойстваСписка.КлючиДоступаПользователейИГруппДоступа Или СвойстваСписка.КлючиДоступаПользователей Тогда ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаПользователей = ПараметрыШаблонов.СпискиСОграничениемЧерезКлючиДоступаПользователей - + СвойстваСписка.ПолноеИмя + Поля + ";+" + Символы.ПС; + + СвойстваСписка.ПолноеИмя + Поля + ";+" + ПолеВладельцаОтключено + Символы.ПС; КонецЕсли; КонецПроцедуры +// Для процедуры НастроитьПараметрыШаблонов. +// +// Параметры: +// ПолноеИмя - Строка +// ИмяКоллекцииТипа - Строка +// ТипыТаблицПоИменам - Соответствие +// +// Возвращаемое значение: +// Строка +// +Функция КлючТаблицы(ПолноеИмя, ИмяКоллекцииТипа = Неопределено, ТипыТаблицПоИменам = Неопределено) + + Если ИмяКоллекцииТипа = Неопределено Тогда + СвойстваТипа = ТипыТаблицПоИменам.Получить(ВРег(СтрРазделить(ПолноеИмя, ".", Ложь)[0])); + ИмяКоллекцииТипа = СвойстваТипа.ИмяКоллекции; + КонецЕсли; + + Если ИмяКоллекцииТипа = "РегистрыСведений" + Или ИмяКоллекцииТипа = "РегистрыНакопления" + Или ИмяКоллекцииТипа = "РегистрыБухгалтерии" + Или ИмяКоллекцииТипа = "РегистрыРасчета" Тогда + + ТипКлючаТаблицы = ТипКлючаЗаписиПоПолномуИмениМетаданных(ПолноеИмя); + + ИначеЕсли ИмяКоллекцииТипа = "Последовательности" Тогда + ТипКлючаТаблицы = ТипНабораЗаписейПоПолномуИмениМетаданных(ПолноеИмя); + + ИначеЕсли ИмяКоллекцииТипа = "ЖурналыДокументов" Тогда + ТипКлючаТаблицы = ТипМенеджераОбъектаПоПолномуИмениМетаданных(ПолноеИмя); + Иначе + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неизвестный нессылочный объект метаданных + |""%1"" + |с поддержкой ограничений на уровне записей.'"), ПолноеИмя); + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); + СтрокаДляХеширования = СтрокаДанныхДляХеширования(ТипКлючаТаблицы); + ХешированиеДанных.Добавить(СтрокаДляХеширования); + + Возврат Base64Строка(ХешированиеДанных.ХешСумма); + +КонецФункции + +// Для процедуры ОписаниеНовойВерсииПараметровОграниченияДоступа. +Процедура ЗаполнитьПараметрыДляШаблонов(Запись, ПараметрыЗаписи, ОписаниеВерсии) + + Если ТипЗнч(ОписаниеВерсии.ДатаСоздания) = Тип("Дата") Тогда + СтараяДатаСоздания = ОписаниеВерсии.ДатаСоздания; + Иначе + СтараяДатаСоздания = '00010101'; + КонецЕсли; + + ХранимыеТекущиеВерсии = НоваяСтруктураХранимыхВерсийПараметровШаблонов(); + ТекущиеСвойстваОграниченияСписковДляПользователей = Новый Соответствие; + ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей = Новый Соответствие; + + Если ТипЗнч(ОписаниеВерсии.ВерсииПараметровШаблонов) = Тип("ХранилищеЗначения") Тогда + СодержимоеХранилища = ОписаниеВерсии.ВерсииПараметровШаблонов.Получить(); + Если ЗначениеЗаполнено(СодержимоеХранилища) Тогда + ХранимыеТекущиеВерсии = СтруктураХранимыхВерсийПараметровШаблонов(СодержимоеХранилища); + Если ХранимыеТекущиеВерсии.ВерсияСтруктурыВерсий = ВерсияСтруктурыВерсийПараметровШаблонов() Тогда + ТекущиеСвойстваОграниченияСписковДляПользователей = Неопределено; + ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей = Неопределено; + Иначе + ХранимыеТекущиеВерсии = НоваяСтруктураХранимыхВерсийПараметровШаблонов(); + КонецЕсли; + ИначеЕсли ТипЗнч(ОписаниеВерсии.Версия) = Тип("Число") Тогда + ТекущиеХранимыеПараметры = ВерсияПараметров(ОписаниеВерсии.Версия, Ложь, Ложь); + Если ТипЗнч(ТекущиеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав) = Тип("ХранилищеЗначения") Тогда + ТекущиеПараметрыЗаписи = СтруктураХранимыхПараметровЗаписи( + ТекущиеХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить()); + Если ТекущиеПараметрыЗаписи.ВерсияСтруктурыКэша = ВерсияСтруктурыКэша() + Или ТекущиеПараметрыЗаписи.ВерсияСтруктурыКэша = "20" Тогда + ТекущиеСвойстваОграниченияСписковДляПользователей = + ТекущиеПараметрыЗаписи.ДополнительныйКонтекст.ДляПользователей.СвойстваОграниченияСписков; + ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей = + ТекущиеПараметрыЗаписи.ДополнительныйКонтекст.ДляВнешнихПользователей.СвойстваОграниченияСписков; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ПараметрыЗаписи.Свойство("СтрокиВерсии") Тогда + СтрокиВерсии = ПараметрыЗаписи.СтрокиВерсии; + Иначе + СтрокиВерсии = Новый Структура; + КонецЕсли; + СтрокиВерсии.Вставить("СпискиСОграничениемПоПолямВСеансахПользователей"); + СтрокиВерсии.Вставить("СпискиСОграничениемПоПолямВСеансахВнешнихПользователей"); + + Если ТекущиеСвойстваОграниченияСписковДляПользователей <> Неопределено Тогда + НовыеПараметрыЗаписи = ПараметрыЗаписи.ХранимыеПараметры.ДляЗаписиОбъектовИПроверкиПрав.Получить(); + НовыеСвойстваОграниченияСписковДляПользователей = + НовыеПараметрыЗаписи.ДополнительныйКонтекст.ДляПользователей.СвойстваОграниченияСписков; + НовыеСвойстваОграниченияСписковДляВнешнихПользователей = + НовыеПараметрыЗаписи.ДополнительныйКонтекст.ДляВнешнихПользователей.СвойстваОграниченияСписков; + КонецЕсли; + + ХранимыеНовыеВерсии = ПараметрыЗаписи.ХранимыеПараметры.ВерсииПараметровШаблонов.Получить(); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); + + Параметры = НоваяСтруктураДляЗаполненияПараметровШаблонов(); + Если ТипЗнч(ПараметрыЗаписи.СпискиСУстаревшимиВариантамиДоступа) = Тип("Массив") Тогда + Параметры.Вставить("ОтключитьДополнительныеВариантыДоступа"); + Иначе + ПараметрыЗаписи.СпискиСУстаревшимиВариантамиДоступа = Новый Массив; + КонецЕсли; + Параметры.Вставить("СтараяДатаСоздания", СтараяДатаСоздания); + Параметры.Вставить("ХешированиеДанных", ХешированиеДанных); + Параметры.Вставить("СпискиСНовымОсновнымВариантомДоступа", ПараметрыЗаписи.СпискиСНовымОсновнымВариантомДоступа); + Параметры.Вставить("СпискиСУстаревшимиВариантамиДоступа", ПараметрыЗаписи.СпискиСУстаревшимиВариантамиДоступа); + + Параметры.Вставить("ХранимыеТекущиеВерсии", ХранимыеТекущиеВерсии.ДляПользователей); + Параметры.Вставить("НовыеВерсииПолейСписков", ХранимыеНовыеВерсии.ДляПользователей.ВерсииПараметровШаблонов); + Параметры.Вставить("ТекущиеСвойстваОграниченияСписков", ТекущиеСвойстваОграниченияСписковДляПользователей); + Параметры.Вставить("НовыеСвойстваОграниченияСписков", НовыеСвойстваОграниченияСписковДляПользователей); + + ЗаполнитьПараметрыДляШаблоновДляВидаПользователей(Параметры, + Запись.ДляШаблоновВСеансахПользователей, + СтрокиВерсии.СпискиСОграничениемПоПолямВСеансахПользователей); + + Параметры.ХранимыеТекущиеВерсии = ХранимыеТекущиеВерсии.ДляВнешнихПользователей; + Параметры.НовыеВерсииПолейСписков = ХранимыеНовыеВерсии.ДляВнешнихПользователей.ВерсииПараметровШаблонов; + Параметры.ТекущиеСвойстваОграниченияСписков = ТекущиеСвойстваОграниченияСписковДляВнешнихПользователей; + Параметры.НовыеСвойстваОграниченияСписков = НовыеСвойстваОграниченияСписковДляВнешнихПользователей; + + ЗаполнитьПараметрыДляШаблоновДляВидаПользователей(Параметры, + Запись.ДляШаблоновВСеансахВнешнихПользователей, + СтрокиВерсии.СпискиСОграничениемПоПолямВСеансахВнешнихПользователей); + + Запись.ХешСуммаПараметровШаблонов = Base64Строка(ХешированиеДанных.ХешСумма); + Запись.ВерсииПараметровШаблонов = Новый ХранилищеЗначения(ХранимыеТекущиеВерсии); + + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.SHA256); + ХешированиеДанных.Добавить(Запись.ХешСуммаПостоянныхПараметров); + ХешированиеДанных.Добавить(Запись.ХешСуммаПараметровШаблонов); + Запись.ХешСумма = Base64Строка(ХешированиеДанных.ХешСумма); + +КонецПроцедуры + +// Для процедуры ЗаполнитьПараметрыДляШаблонов. +// +// Возвращаемое значение: +// Структура: +// * СтараяДатаСоздания - Дата +// * ХешированиеДанных - ХешированиеДанных +// * СпискиСНовымОсновнымВариантомДоступа - Массив из Строка +// * СпискиСУстаревшимиВариантамиДоступа - Массив из Строка +// * ХранимыеТекущиеВерсии - Структура: +// ** ВерсииПараметровШаблонов - см. НовыеВерсииПараметровШаблонов +// ** ОсновныеВариантыДоступа - см. НовыеОсновныеВариантыДоступа +// * НовыеВерсииПолейСписков - см. НовыеВерсииПараметровШаблонов +// * ТекущиеСвойстваОграниченияСписков - Соответствие из КлючИЗначение: +// ** Ключ - Строка - полное имя списка +// ** Значение - см. НовыеСвойстваОграниченияСписка +// * НовыеСвойстваОграниченияСписков - Соответствие из КлючИЗначение: +// ** Ключ - Строка - полное имя списка +// ** Значение - см. НовыеСвойстваОграниченияСписка +// +Функция НоваяСтруктураДляЗаполненияПараметровШаблонов() + + Возврат Новый Структура; + +КонецФункции + +// Для процедуры ЗаполнитьПараметрыДляШаблонов. +Процедура ЗаполнитьПараметрыДляШаблоновДляВидаПользователей(Параметры, + ХранилищеДляШаблоновВСеансах, СпискиСОграничениемПоПолям) + + МаксимальноеКоличествоВерсий = МаксимальноеКоличествоВерсийВВариантеДоступа(); + НастройкиОграниченийСписков = Новый СписокЗначений; + ТекущиеВерсииПолейСписков = Параметры.ХранимыеТекущиеВерсии.ВерсииПараметровШаблонов; + + Если Параметры.ТекущиеСвойстваОграниченияСписков <> Неопределено Тогда + ВариантыДоступаВБазеДанных = ВариантыДоступаВБазеДанных(Параметры); + Для Каждого КлючИЗначение Из Параметры.НовыеВерсииПолейСписков Цикл + ТекущиеВерсииПолейСписка = Новый Массив; + ДобавитьСуществующиеВерсииПолейСписка(ТекущиеВерсииПолейСписка, + КлючИЗначение.Значение[0], ВариантыДоступаВБазеДанных, Параметры); + Если ЗначениеЗаполнено(ТекущиеВерсииПолейСписка) Тогда + ТекущиеВерсииПолейСписков.Вставить(КлючИЗначение.Ключ, ТекущиеВерсииПолейСписка); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ВозможноНеиспользуемыеВерсииПолейСписков = Новый Массив; + + Для Каждого КлючИЗначение Из ТекущиеВерсииПолейСписков Цикл + ТекущиеВерсииПолейСписка = КлючИЗначение.Значение; + НовыеВерсииПолейСписка = Параметры.НовыеВерсииПолейСписков.Получить(КлючИЗначение.Ключ); + + Если НовыеВерсииПолейСписка = Неопределено Тогда + ИспользованиеОтключалось = Ложь; + Для Каждого Версия Из ТекущиеВерсииПолейСписка Цикл + Если Версия.Используется Тогда + Версия.Используется = Ложь; + ИспользованиеОтключалось = Истина; + КонецЕсли; + КонецЦикла; + Если ИспользованиеОтключалось И ТекущиеВерсииПолейСписка.Количество() > 0 Тогда + ПолноеИмя = ТекущиеВерсииПолейСписка[0].Список; + Если Метаданные.НайтиПоПолномуИмени(ПолноеИмя) <> Неопределено Тогда + Параметры.СпискиСУстаревшимиВариантамиДоступа.Добавить( + ТекущиеВерсииПолейСписка[0].Список); + КонецЕсли; + КонецЕсли; + Продолжить; + КонецЕсли; + + НоваяВерсия = НовыеВерсииПолейСписка[0]; + НоваяВерсияСуществует = Ложь; + Для Каждого Версия Из ТекущиеВерсииПолейСписка Цикл + Если ВРег(Версия.ПоляСоединения) = ВРег(НоваяВерсия.ПоляСоединения) + И Версия.ВариантДоступа > 1 Тогда + НоваяВерсияСуществует = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + ОсновнаяВерсияИзменена = Истина; + Если НоваяВерсияСуществует Тогда + Индекс = ТекущиеВерсииПолейСписка.Найти(Версия); + Если Индекс > 0 Тогда + ТекущиеВерсииПолейСписка.Удалить(Индекс); + ТекущиеВерсииПолейСписка.Вставить(0, Версия); + Иначе + ОсновнаяВерсияИзменена = Ложь; + КонецЕсли; + ЗаполнитьЗначенияСвойств(Версия, НоваяВерсия,, "ВариантДоступа"); + Иначе + ИспользуемыеНомераВерсий = Новый Массив(МаксимальноеКоличествоВерсий); + СамаяСтараяВерсия = Неопределено; + УдаляемыеВерсии = Новый Массив; + Для Каждого Версия Из ТекущиеВерсииПолейСписка Цикл + НомерВерсии = Цел(Версия.ВариантДоступа / 64); + Если НоваяВерсия.ВариантДоступа <> (Версия.ВариантДоступа - НомерВерсии * 64) Тогда + Продолжить; + КонецЕсли; + Если НомерВерсии < МаксимальноеКоличествоВерсий Тогда + ИспользуемыеНомераВерсий[НомерВерсии] = Версия; + СамаяСтараяВерсия = Версия; + Иначе + УдаляемыеВерсии.Добавить(Версия); + КонецЕсли; + КонецЦикла; + Для Индекс = 0 По МаксимальноеКоличествоВерсий - 1 Цикл + Если ИспользуемыеНомераВерсий[Индекс] = Неопределено Тогда + Прервать; + КонецЕсли; + КонецЦикла; + Если Индекс >= МаксимальноеКоличествоВерсий Тогда + УдаляемыеВерсии.Добавить(СамаяСтараяВерсия); + НоваяВерсия.ВариантДоступа = НоваяВерсия.ВариантДоступа + + ИспользуемыеНомераВерсий.Найти(СамаяСтараяВерсия) * 64; + Иначе + НоваяВерсия.ВариантДоступа = НоваяВерсия.ВариантДоступа + Индекс * 64; + КонецЕсли; + Для Каждого УдаляемаяВерсия Из УдаляемыеВерсии Цикл + ТекущиеВерсииПолейСписка.Удалить(ТекущиеВерсииПолейСписка.Найти(УдаляемаяВерсия)); + КонецЦикла; + ТекущиеВерсииПолейСписка.Вставить(0, НоваяВерсия); + КонецЕсли; + + Если ОсновнаяВерсияИзменена Тогда + Параметры.СпискиСНовымОсновнымВариантомДоступа.Добавить( + ТекущиеВерсииПолейСписка[0].Список); + КонецЕсли; + + ОбновитьИспользованиеВерсийПолейСписка(ТекущиеВерсииПолейСписка, ОсновнаяВерсияИзменена, + ВозможноНеиспользуемыеВерсииПолейСписков, Параметры); + КонецЦикла; + + ОтключитьИспользованиеВерсийКромеОсновнойДляОбновленныхСписков( + ВозможноНеиспользуемыеВерсииПолейСписков, Параметры); + + ОсновныеВариантыДоступа = Параметры.ХранимыеТекущиеВерсии.ОсновныеВариантыДоступа; + + Для Каждого КлючИЗначение Из Параметры.НовыеВерсииПолейСписков Цикл + ТекущиеВерсииПолейСписка = ТекущиеВерсииПолейСписков.Получить(КлючИЗначение.Ключ); + Если ТекущиеВерсииПолейСписка = Неопределено Тогда + ТекущиеВерсииПолейСписка = КлючИЗначение.Значение; + ТекущиеВерсииПолейСписков.Вставить(КлючИЗначение.Ключ, ТекущиеВерсииПолейСписка); + Параметры.СпискиСНовымОсновнымВариантомДоступа.Добавить( + ТекущиеВерсииПолейСписка[0].Список); + КонецЕсли; + ИспользуемыеВариантыДоступа = Новый Массив; + Для Каждого ВерсияПолейСписка Из ТекущиеВерсииПолейСписка Цикл + Если ВерсияПолейСписка.Используется Тогда + ИспользуемыйВариантДоступа = НовыйИспользуемыйВариантДоступа(); + ИспользуемыйВариантДоступа.ВариантДоступа = ВерсияПолейСписка.ВариантДоступа; + ИспользуемыйВариантДоступа.ПоляСоединения = ВерсияПолейСписка.ПоляСоединения; + ИспользуемыеВариантыДоступа.Добавить(Новый ФиксированнаяСтруктура(ИспользуемыйВариантДоступа)); + КонецЕсли; + КонецЦикла; + ОсновныеВариантыДоступа.Вставить(ТекущиеВерсииПолейСписка[0].Список, + Новый ФиксированныйМассив(ИспользуемыеВариантыДоступа)); + КонецЦикла; + + Для Каждого КлючИЗначение Из ТекущиеВерсииПолейСписков Цикл + ДобавитьПоляОграниченияСписка(НастройкиОграниченийСписков, КлючИЗначение.Значение); + КонецЦикла; + + НастройкиОграниченийСписков.СортироватьПоПредставлению(); + СпискиСОграничениемПоПолям = СтрСоединить(НастройкиОграниченийСписков.ВыгрузитьЗначения(), Символы.ПС); + Параметры.ХешированиеДанных.Добавить(СпискиСОграничениемПоПолям); + + ХранимыеПараметрыШаблонов = Новый Структура(ХранилищеДляШаблоновВСеансах.Получить()); + ПараметрыШаблонов = Новый Структура(ХранимыеПараметрыШаблонов.ПараметрыШаблонов); + ПараметрыШаблонов.СпискиСОграничениемПоПолям = СпискиСОграничениемПоПолям; + ХранимыеПараметрыШаблонов.ПараметрыШаблонов = Новый ФиксированнаяСтруктура(ПараметрыШаблонов); + ХранилищеДляШаблоновВСеансах = Новый ХранилищеЗначения( + Новый ФиксированнаяСтруктура(ХранимыеПараметрыШаблонов)); + +КонецПроцедуры + +// Для процедуры ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Процедура ОбновитьИспользованиеВерсийПолейСписка(ТекущиеВерсииПолейСписка, ОсновнаяВерсияИзменена, + ВозможноНеиспользуемыеВерсииПолейСписков, Параметры) + + МаксимальноеКоличествоВариантовСоединений = МаксимальноеКоличествоВариантовСоединений(); + НоваяВерсия = ТекущиеВерсииПолейСписка[0]; + ПоляШаблона = СтрРазделить(ВРег(НоваяВерсия.ПоляШаблона), ",", Ложь); + + КоличествоИспользуемыхВерсий = 0; + ИспользованиеОтключалось = Ложь; + + Для Каждого ТекущаяВерсия Из ТекущиеВерсииПолейСписка Цикл + Если Не ТекущаяВерсия.Используется Тогда + Продолжить; + КонецЕсли; + Если ВРег(ТекущаяВерсия.ПоляШаблона) <> ВРег(НоваяВерсия.ПоляШаблона) Тогда + ИменаПолей = СтрРазделить(ТекущаяВерсия.ПоляСоединения, ",", Ложь); + Для Каждого ИмяПоля Из ИменаПолей Цикл + Если ПоляШаблона.Найти(ВРег(ИмяПоля)) = Неопределено Тогда + ТекущаяВерсия.Используется = Ложь; + ИспользованиеОтключалось = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если Не ТекущаяВерсия.Используется Тогда + Продолжить; + КонецЕсли; + Если КоличествоИспользуемыхВерсий >= МаксимальноеКоличествоВариантовСоединений Тогда + ТекущаяВерсия.Используется = Ложь; + ИспользованиеОтключалось = Истина; + Иначе + КоличествоИспользуемыхВерсий = КоличествоИспользуемыхВерсий + 1; + КонецЕсли; + КонецЦикла; + + Если ИспользованиеОтключалось Тогда + Параметры.СпискиСУстаревшимиВариантамиДоступа.Добавить( + ТекущиеВерсииПолейСписка[0].Список); + КонецЕсли; + + Если Не ОсновнаяВерсияИзменена И КоличествоИспользуемыхВерсий > 1 Тогда + ВозможноНеиспользуемыеВерсииПолейСписков.Добавить(ТекущиеВерсииПолейСписка); + КонецЕсли; + +КонецПроцедуры + +// Для процедуры ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Процедура ДобавитьПоляОграниченияСписка(СпискиСОграничениемПоПолям, ТекущиеВерсииПолейСписка) + + НоваяВерсия = ТекущиеВерсииПолейСписка[0]; + ПолноеИмя = НоваяВерсия.Список; + ПоляШаблона = СтрРазделить(ВРег(НоваяВерсия.ПоляШаблона), ",", Ложь); + НастройкиОграниченийСписка = Новый Массив; + МаксимальноеКоличествоВариантов = МаксимальноеКоличествоВариантовСоединений(); + + НомерВарианта = 1; + Для Каждого Версия Из ТекущиеВерсииПолейСписка Цикл + Если Не Версия.Используется Тогда + Прервать; + КонецЕсли; + + НомерПоляСоединения = 1; + ИменаПолей = СтрРазделить(Версия.ПоляСоединения, ",", Ложь); + Для Каждого ИмяПоля Из ИменаПолей Цикл + НомерПоляШаблона = ПоляШаблона.Найти(ВРег(ИмяПоля)) + 1; + НастройкиОграниченийСписка.Добавить(СтрШаблон("%1:%2%3=%4;", + ПолноеИмя, + "Вариант" + XMLСтрока(НомерВарианта), + "Поле" + XMLСтрока(НомерПоляСоединения), + "Поле" + XMLСтрока(НомерПоляШаблона))); + НомерПоляСоединения = НомерПоляСоединения + 1; + КонецЦикла; + + Если Цел(Версия.ВариантДоступа / 2) = 0 Тогда + НастройкиОграниченийСписка.Добавить(СтрШаблон("%1:%2%3=0;", + ПолноеИмя, + "Вариант" + XMLСтрока(НомерВарианта), + "Версия" + XMLСтрока(НомерВарианта))); + Иначе + Остаток = Цел(Версия.ВариантДоступа / 64); + НомерБита = 0; + Пока Остаток > 0 Цикл + НовыйОстаток = Цел(Остаток / 2); + Если Остаток - НовыйОстаток * 2 > 0 Тогда + НастройкиОграниченийСписка.Добавить(СтрШаблон("%1:%2%3=1;", + ПолноеИмя, + "Версия" + XMLСтрока(НомерВарианта), + "Бит" + XMLСтрока(НомерБита))); + КонецЕсли; + Остаток = НовыйОстаток; + НомерБита = НомерБита + 1; + КонецЦикла; + КонецЕсли; + + НомерВарианта = НомерВарианта + 1; + Если НомерВарианта > МаксимальноеКоличествоВариантов Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + СпискиСОграничениемПоПолям.Добавить( + СтрСоединить(НастройкиОграниченийСписка, Символы.ПС), ПолноеИмя); + +КонецПроцедуры + +// Для процедуры ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Функция ВариантыДоступаВБазеДанных(Параметры) + + Если Не ЗначениеЗаполнено(Параметры.НовыеВерсииПолейСписков) Тогда + Возврат Новый Соответствие; + КонецЕсли; + + ТекстОбщегоЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТекущаяТаблица.Регистр КАК Регистр, + | ТекущаяТаблица.ВариантДоступа КАК ВариантДоступа + |ИЗ + | РегистрСведений.КлючиДоступаКРегистрам КАК ТекущаяТаблица + |ГДЕ + | ВЫБОР + | КОГДА ТекущаяТаблица.ВариантДоступа = 0 + | ТОГДА ЛОЖЬ + | ИНАЧЕ ТекущаяТаблица.ВариантДоступа - (ВЫРАЗИТЬ(ТекущаяТаблица.ВариантДоступа / 2 - 0.5 КАК ЧИСЛО(15, 0))) * 2 = 1 + | КОНЕЦ = &ДляВнешнихПользователей + | + |УПОРЯДОЧИТЬ ПО + | Регистр, + | ВариантДоступа"; + + ТекстыЗапросов = Новый Массив; + ТекстыЗапросов.Добавить(ТекстОбщегоЗапроса); + + ПолныеИмена = Новый Массив; + ИндексыРезультатовЗапроса = Новый Соответствие; + + Для Каждого КлючИЗначение Из Параметры.НовыеВерсииПолейСписков Цикл + Список = КлючИЗначение.Значение[0].Список; + СвойстваСписка = Параметры.НовыеСвойстваОграниченияСписков.Получить(Список); + Если СвойстваСписка = Неопределено + Или Не ЗначениеЗаполнено(СвойстваСписка.ОпорныеПоля) Тогда + Продолжить; + КонецЕсли; + ПолныеИмена.Добавить(Список); + Если ЗначениеЗаполнено(СвойстваСписка.ИмяОтдельногоРегистраКлючей) Тогда + ИндексыРезультатовЗапроса.Вставить(Список, ТекстыЗапросов.Количество()); + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТекущаяТаблица.ВариантДоступа КАК ВариантДоступа + |ИЗ + | &ТекущаяТаблица КАК ТекущаяТаблица + |ГДЕ + | ВЫБОР + | КОГДА ТекущаяТаблица.ВариантДоступа = 0 + | ТОГДА ЛОЖЬ + | ИНАЧЕ ТекущаяТаблица.ВариантДоступа - (ВЫРАЗИТЬ(ТекущаяТаблица.ВариантДоступа / 2 - 0.5 КАК ЧИСЛО(15, 0))) * 2 = 1 + | КОНЕЦ = &ДляВнешнихПользователей + | + |УПОРЯДОЧИТЬ ПО + | ВариантДоступа"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущаяТаблица", + "РегистрСведений." + СвойстваСписка.ИмяОтдельногоРегистраКлючей); + ТекстыЗапросов.Добавить(ТекстЗапроса); + Иначе + ИндексыРезультатовЗапроса.Вставить(Список, 0); + КонецЕсли; + КонецЦикла; + + ИдентификаторыСписков = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ПолныеИмена, Ложь); + + Запрос = Новый Запрос; + ВариантДоступа = КлючИЗначение.Значение[0].ВариантДоступа; + Запрос.УстановитьПараметр("ДляВнешнихПользователей", ВариантДоступа - Цел(ВариантДоступа / 2) * 2 > 0); + Запрос.Текст = СтрСоединить(ТекстыЗапросов, ОбщегоНазначения.РазделительПакетаЗапросов()); + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + Выгрузка = РезультатыЗапроса[0].Выгрузить(); + Выгрузка.Индексы.Добавить("Регистр"); + + Результат = Новый Соответствие; + + Для Каждого КлючИЗначение Из ИндексыРезультатовЗапроса Цикл + Если КлючИЗначение.Значение = 0 Тогда + ИдентификаторСписка = ИдентификаторыСписков.Получить(КлючИЗначение.Ключ); + НайденныеСтроки = Выгрузка.НайтиСтроки(Новый Структура("Регистр", ИдентификаторСписка)); + ВариантыДоступа = Новый Массив; + Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл + ВариантыДоступа.Добавить(НайденнаяСтрока.ВариантДоступа); + КонецЦикла; + Результат.Вставить(КлючИЗначение.Ключ, ВариантыДоступа); + Иначе + Результат.Вставить(КлючИЗначение.Ключ, + РезультатыЗапроса[КлючИЗначение.Значение].Выгрузить().ВыгрузитьКолонку("ВариантДоступа")); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Для процедуры ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Процедура ОтключитьИспользованиеВерсийКромеОсновнойДляОбновленныхСписков( + ВозможноНеиспользуемыеВерсииПолейСписков, Параметры) + + Если Не ЗначениеЗаполнено(ВозможноНеиспользуемыеВерсииПолейСписков) + Или Не Параметры.Свойство("ОтключитьДополнительныеВариантыДоступа") Тогда + Возврат; + КонецЕсли; + + Списки = Новый Массив; + ВерсииПолейСписков = Новый Соответствие; + Для Каждого ВерсииПолейСписка Из ВозможноНеиспользуемыеВерсииПолейСписков Цикл + Список = ВерсииПолейСписка[0].Список; + Списки.Добавить(Список); + ВерсииПолейСписков.Вставить(Список, ВерсииПолейСписка); + КонецЦикла; + + ДляВнешнихПользователей = ВерсииПолейСписка[0].ВариантДоступа + - Цел(ВерсииПолейСписка[0].ВариантДоступа / 2) * 2 = 1; + + ТипыИдентификаторов = Новый Массив; + ТипыИдентификаторов.Добавить(Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + ТипыИдентификаторов.Добавить(Тип("СправочникСсылка.ИдентификаторыОбъектовРасширений")); + + ИдентификаторыСписков = Новый ТаблицаЗначений; + ИдентификаторыСписков.Колонки.Добавить("ИдентификаторСписка", Новый ОписаниеТипов(ТипыИдентификаторов)); + + СпискиПоИдентификаторам = Новый Соответствие; + ИдентификаторыОбъектов = ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(Списки, Ложь); + + Для Каждого КлючИЗначение Из ИдентификаторыОбъектов Цикл + Если ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда + ИдентификаторыСписков.Добавить().ИдентификаторСписка = КлючИЗначение.Значение; + СпискиПоИдентификаторам.Вставить(КлючИЗначение.Значение, КлючИЗначение.Ключ); + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ДляВнешнихПользователей", ДляВнешнихПользователей); + Запрос.УстановитьПараметр("ИдентификаторыСписков", ИдентификаторыСписков); + Запрос.Текст = + "ВЫБРАТЬ + | ИдентификаторыСписков.ИдентификаторСписка КАК ИдентификаторСписка + |ПОМЕСТИТЬ ИдентификаторыСписков + |ИЗ + | &ИдентификаторыСписков КАК ИдентификаторыСписков + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ИдентификаторыСписков.ИдентификаторСписка КАК ИдентификаторСписка + |ИЗ + | ИдентификаторыСписков КАК ИдентификаторыСписков + |ГДЕ + | НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ОбновлениеКлючейДоступаКДанным КАК ОбновлениеКлючейДоступаКДанным + | ГДЕ + | ОбновлениеКлючейДоступаКДанным.Список = ИдентификаторыСписков.ИдентификаторСписка + | И ОбновлениеКлючейДоступаКДанным.ДляВнешнихПользователей = &ДляВнешнихПользователей + | И ОбновлениеКлючейДоступаКДанным.РазмерЗадания = 3)"; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + Список = СпискиПоИдентификаторам.Получить(Выборка.ИдентификаторСписка); + ВерсииПолейСписка = ВерсииПолейСписков.Получить(Список); + ОсновнаяВерсия = ВерсииПолейСписка[0]; + Для Каждого ВерсияПолейСписка Из ВерсииПолейСписка Цикл + Если ВерсияПолейСписка = ОсновнаяВерсия Тогда + Продолжить; + КонецЕсли; + Если ВерсияПолейСписка.Используется Тогда + ВерсияПолейСписка.Используется = Ложь; + Параметры.СпискиСУстаревшимиВариантамиДоступа.Добавить(Список); + КонецЕсли; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +// Для процедуры ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Процедура ДобавитьСуществующиеВерсииПолейСписка(ТекущиеВерсииПолейСписка, НоваяВерсия, + ВариантыДоступаВБазеДанных, Параметры) + + ВариантыДоступа = ВариантыДоступаВБазеДанных.Получить(НоваяВерсия.Список); + Если Не ЗначениеЗаполнено(ВариантыДоступа) Тогда + Возврат; + КонецЕсли; + + ТекущиеСвойстваСписка = Параметры.ТекущиеСвойстваОграниченияСписков.Получить(НоваяВерсия.Список); + ОпорныеПоля = ?(ТекущиеСвойстваСписка = Неопределено, Неопределено, ТекущиеСвойстваСписка.ОпорныеПоля); + Если ЗначениеЗаполнено(Параметры.СтараяДатаСоздания) И ЗначениеЗаполнено(ОпорныеПоля) Тогда + ТребуемыйВариантДоступа = ОпорныеПоля.Используемые.Количество() * 2 + + НоваяВерсия.ВариантДоступа - Цел(НоваяВерсия.ВариантДоступа / 2) * 2; + Иначе + ТребуемыйВариантДоступа = НоваяВерсия.ВариантДоступа; + КонецЕсли; + + Если ВариантыДоступа.Количество() = 1 + И (Не ЗначениеЗаполнено(Параметры.СтараяДатаСоздания) + Или ЗначениеЗаполнено(ОпорныеПоля)) + И ( ВариантыДоступа[0] < 2 + Или ВариантыДоступа[0] - Цел(ВариантыДоступа[0] / 64) * 64 = ТребуемыйВариантДоступа) Тогда + + // Переход с версий конфигурации без поля ВариантДоступа или восстановление + // либо после очистки регистра ПараметрыОграниченияДоступа, + // либо после изменения номера в функции ВерсияСтруктурыВерсийПараметровШаблонов. + Если Не ЗначениеЗаполнено(Параметры.СтараяДатаСоздания) Тогда + ПоляСоединения = НоваяВерсия.ПоляСоединения; + ПоляШаблона = НоваяВерсия.ПоляСоединения; + Иначе + ПоляСоединения = СтрСоединить(ОпорныеПоля.Используемые, ","); + ПоляШаблона = СтрСоединить(ОпорныеПоля.Все, ","); + КонецЕсли; + + ПредыдущаяВерсия = НоваяВерсияПараметровШаблонов(); + ПредыдущаяВерсия.ДатаСоздания = Параметры.СтараяДатаСоздания; + ПредыдущаяВерсия.Список = НоваяВерсия.Список; + ПредыдущаяВерсия.ПоляСоединения = ПоляСоединения; + ПредыдущаяВерсия.ПоляШаблона = ПоляШаблона; + ПредыдущаяВерсия.ВариантДоступа = ВариантыДоступа[0]; + + ТекущиеВерсииПолейСписка.Добавить(ПредыдущаяВерсия); + Иначе + // Несколько версий существующих одновременно не могут быть сопоставлены + // одному набору полей и не могут использоваться для новых наборов полей. + Для Каждого ВариантДоступа Из ВариантыДоступа Цикл + НеизвестнаяВерсия = НоваяВерсияПараметровШаблонов(); + НеизвестнаяВерсия.ДатаСоздания = Параметры.СтараяДатаСоздания; + НеизвестнаяВерсия.Список = НоваяВерсия.Список; + НеизвестнаяВерсия.ВариантДоступа = ВариантДоступа; + НеизвестнаяВерсия.Используется = Ложь; + + ТекущиеВерсииПолейСписка.Добавить(НеизвестнаяВерсия); + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// Для процедур ОбновитьИспользованиеВерсийПолейСписка и ДобавитьПоляОграниченияСписка. +Функция МаксимальноеКоличествоВариантовСоединений() + + // При изменении нужно синхронно изменить шаблон ограничения доступа ДляРегистра. + Возврат 3; + +КонецФункции + +// Для процедур ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +Функция МаксимальноеКоличествоВерсийВВариантеДоступа() + + Возврат 16; + +КонецФункции + // Для процедуры УстановитьВерсиюПараметров, и для функции ХранимыеПараметрыОграниченияДоступа. // // Возвращаемое значение: @@ -23930,13 +25805,13 @@ // Возвращаемое значение: // Структура: // * ВерсияСтруктурыКэша - см. ВерсияСтруктурыКэша -// * ВерсииОграниченийСписков - Соответствие: +// * ВерсииОграниченийСписков - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Строка - общая версия ограничения списка // первая строка - хеш-сумма свойств версии для пользователей и через Символы.ПС // вторая строка - хеш-сумма свойств версии для внешних пользователей. // -// * ВедущиеСписки - Соответствие: +// * ВедущиеСписки - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. СвойстваСпискаКакВедущего // @@ -23944,7 +25819,7 @@ // ** ДляПользователей - см. НовыйХранимыйДополнительныйКонтекст // ** ДляВнешнихПользователей - см. НовыйХранимыйДополнительныйКонтекст // -// * СпискиСДатой - Соответствие: +// * СпискиСДатой - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина // * ВнешниеПользователиВключены - Булево @@ -24070,6 +25945,141 @@ КонецФункции +// Для процедур УстановитьВерсиюПараметров и ЗаполнитьПараметрыДляШаблонов. +// +// Возвращаемое значение: +// см. НоваяСтруктураХранимыхВерсийПараметровШаблонов +// +Функция СтруктураХранимыхВерсийПараметровШаблонов(Значения) + + ХранимыеВерсийПараметровШаблонов = НоваяСтруктураХранимыхВерсийПараметровШаблонов(); + ХранимыеВерсийПараметровШаблонов.ВерсияСтруктурыВерсий = ""; + + Если ТипЗнч(Значения) = Тип("Структура") + И Значения.Свойство("ВерсияСтруктурыВерсий") + И ТипЗнч(Значения.ВерсияСтруктурыВерсий) = Тип("Строка") + И Значения.Свойство("ДляПользователей") + + И ТипЗнч(Значения.ДляПользователей) = Тип("Структура") + И Значения.ДляПользователей.Свойство("ВерсииПараметровШаблонов") + И ТипЗнч(Значения.ДляПользователей.ВерсииПараметровШаблонов) = Тип("Соответствие") + И Значения.ДляПользователей.Свойство("ОсновныеВариантыДоступа") + И ТипЗнч(Значения.ДляПользователей.ОсновныеВариантыДоступа) = Тип("Соответствие") + + И Значения.Свойство("ДляВнешнихПользователей") + И ТипЗнч(Значения.ДляВнешнихПользователей) = Тип("Структура") + И Значения.ДляВнешнихПользователей.Свойство("ВерсииПараметровШаблонов") + И ТипЗнч(Значения.ДляВнешнихПользователей.ВерсииПараметровШаблонов) = Тип("Соответствие") + И Значения.ДляВнешнихПользователей.Свойство("ОсновныеВариантыДоступа") + И ТипЗнч(Значения.ДляВнешнихПользователей.ОсновныеВариантыДоступа) = Тип("Соответствие") Тогда + + ЗаполнитьЗначенияСвойств(ХранимыеВерсийПараметровШаблонов, Значения); + КонецЕсли; + + Возврат ХранимыеВерсийПараметровШаблонов; + +КонецФункции + +// Для функций ХранимыеПараметрыОграниченияДоступа, СтруктураХранимыхВерсийПараметровШаблонов и +// процедуры ЗаполнитьПараметрыДляШаблонов. +// +// Возвращаемое значение: +// Структура: +// * ВерсияСтруктурыВерсий - см. ВерсияСтруктурыВерсийПараметровШаблонов +// * ДляПользователей - Структура: +// ** ВерсииПараметровШаблонов - см. НовыеВерсииПараметровШаблонов +// ** ОсновныеВариантыДоступа - см. НовыеОсновныеВариантыДоступа +// * ДляВнешнихПользователей - Структура: +// ** ВерсииПараметровШаблонов - см. НовыеВерсииПараметровШаблонов +// ** ОсновныеВариантыДоступа - см. НовыеОсновныеВариантыДоступа +// +Функция НоваяСтруктураХранимыхВерсийПараметровШаблонов() + + ДляПользователей = Новый Структура; + ДляПользователей.Вставить("ВерсииПараметровШаблонов", НовыеВерсииПараметровШаблонов()); + ДляПользователей.Вставить("ОсновныеВариантыДоступа", НовыеОсновныеВариантыДоступа()); + + ДляВнешнихПользователей = Новый Структура; + ДляВнешнихПользователей.Вставить("ВерсииПараметровШаблонов", НовыеВерсииПараметровШаблонов()); + ДляВнешнихПользователей.Вставить("ОсновныеВариантыДоступа", НовыеОсновныеВариантыДоступа()); + + ХранимыеПараметрыШаблонов = Новый Структура; + ХранимыеПараметрыШаблонов.Вставить("ВерсияСтруктурыВерсий", ВерсияСтруктурыВерсийПараметровШаблонов()); + ХранимыеПараметрыШаблонов.Вставить("ДляПользователей", ДляПользователей); + ХранимыеПараметрыШаблонов.Вставить("ДляВнешнихПользователей", ДляВнешнихПользователей); + + Возврат ХранимыеПараметрыШаблонов; + +КонецФункции + +// Для функций ХранимыеПараметрыОграниченияДоступа и +// НоваяСтруктураХранимыхВерсийПараметровШаблонов. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - полное имя регистра. +// * Значение - Массив из см. НоваяВерсияПараметровШаблонов +// +Функция НовыеВерсииПараметровШаблонов() + + Возврат Новый Соответствие; + +КонецФункции + +// Для функции НовыеВерсииПараметровШаблонов и процедуры НастроитьПараметрыШаблонов. +// +// Возвращаемое значение: +// Структура: +// * ДатаСоздания - Дата - момент добавления новой версии. +// * Список - Строка - полное имя объекта метаданных. +// * ПоляСоединения - Строка - список полей, используемых в соединении. +// * ПоляШаблона - Строка - список полей, указанных в шаблоне #ДляРегистра. +// * Используется - Булево - признак того, что версия используется в шаблонах. +// * ВариантДоступа - Число - значение поля ВариантДоступа в регистрах КлючиДоступаКРегистрам, +// КлючиДоступаКРегистру*. +// +Функция НоваяВерсияПараметровШаблонов() + + ВерсияПараметров = Новый Структура; + ВерсияПараметров.Вставить("ДатаСоздания", '00010101'); + ВерсияПараметров.Вставить("Список", ""); + ВерсияПараметров.Вставить("ПоляСоединения", ""); + ВерсияПараметров.Вставить("ПоляШаблона", ""); + ВерсияПараметров.Вставить("Используется", Истина); + ВерсияПараметров.Вставить("ВариантДоступа", 0); + + Возврат ВерсияПараметров; + +КонецФункции + +// Для функции НоваяСтруктураХранимыхВерсийПараметровШаблонов. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - Строка - полное имя регистра. +// * Значение - Массив из см. НовыйИспользуемыйВариантДоступа +// +Функция НовыеОсновныеВариантыДоступа() + + Возврат Новый Соответствие; + +КонецФункции + +// Для функции ЗаполнитьПараметрыДляШаблоновДляВидаПользователей. +// +// Возвращаемое значение: +// Структура: +// * ВариантДоступа - Число - значение поля ВариантДоступа +// в регистрах КлючиДоступаКРегистрам, КлючиДоступаКРегистру*, +// начиная с основного варианта доступа. +// * ПоляСоединения - Строка - имена полей соединения для варианта доступа через запятую. +// +Функция НовыйИспользуемыйВариантДоступа() + + Возврат Новый Структура("ВариантДоступа, ПоляСоединения"); + +КонецФункции + // Для процедуры УстановитьВерсиюПараметров. // // Возвращаемое значение: @@ -24168,19 +26178,20 @@ // * ИспользуемыеТипыЗначенийДоступа - Массив из Тип - описание типов значений доступа, // которые используются в ограничении доступа. // * ВсеВидыОграниченийПрав - Соответствие - все виды ограничений прав без учета использования. -// * ПоляТаблицОбъекта - Массив Из см. НовыеПоляТаблицыОбъекта +// * ПоляТаблицОбъекта - Массив из см. НовыеПоляТаблицыОбъекта // * ИмяОтдельногоРегистраКлючей - Строка - для регистров. // * ОпорныеПоля - см. НовоеОписаниеОпорныхПолей -// * СоставПолей - Число - число, описывающее реквизиты, используемые в ключе. -// * ЕстьОграничениеЧтения - Булево - установлено, если ограничение чтения отличается от "ГДЕ ИСТИНА". -// * ЕстьОграничениеИзменения - Булево - установлено, если ограничение изменения отличается от "ГДЕ ИСТИНА". -// * ЕстьОграничениеПоПользователям - Булево - установлено, если проверяются значения Пользователь +// * ВариантДоступа - Число - основной вариант доступа смотри также НовыеОсновныеВариантыДоступа. +// * СоставПолей - Число - число, описывающее реквизиты, используемые в ключе. +// * ЕстьОграничениеЧтения - Булево - установлено, если ограничение чтения отличается от "ГДЕ ИСТИНА". +// * ЕстьОграничениеИзменения - Булево - установлено, если ограничение изменения отличается от "ГДЕ ИСТИНА". +// * ЕстьОграничениеПоПользователям - Булево - установлено, если проверяются значения Пользователь // или ГруппаПользователей или ВнешнийПользователь // или ГруппаВнешнихПользователей для функций // ЗначениеРазрешено или ЭтоАвторизованныйПользователь. -// * СтруктураРасчетаПраваЧтение - см. СтруктураРасчетаПрава -// * СтруктураРасчетаПраваИзменение - см. СтруктураРасчетаПрава -// * Контекст - см. КонтекстПараметровПоСтруктуреОграничения +// * СтруктураРасчетаПраваЧтение - см. СтруктураРасчетаПрава +// * СтруктураРасчетаПраваИзменение - см. СтруктураРасчетаПрава +// * Контекст - см. КонтекстПараметровПоСтруктуреОграничения // Функция ПараметрыОграниченияПоСтруктуреОграничения(Список, СтруктураОграничения, ДляВнешнихПользователей, ОбщийКонтекст, ДополнительныйКонтекст) @@ -24212,6 +26223,7 @@ Результат.Вставить("ПоляТаблицОбъекта", Новый Массив); Результат.Вставить("ИмяОтдельногоРегистраКлючей", ""); Результат.Вставить("ОпорныеПоля"); + Результат.Вставить("ВариантДоступа"); Результат.Вставить("СоставПолей"); Результат.Вставить("ЕстьОграничениеЧтения", Ложь); Результат.Вставить("ЕстьОграничениеИзменения", Ложь); @@ -24279,8 +26291,9 @@ Если Контекст.СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей <> Неопределено Тогда Свойства = СвойстваОграниченияСписка(Контекст.Список, Контекст); - Результат.ИспользуетсяОграничениеПоВладельцу = Свойства.ПолеВладельца <> Неопределено; - Результат.РассчитыватьПраваПользователей = Свойства.РассчитыватьПраваПользователей; + Результат.РассчитыватьПраваПользователей = Свойства.РассчитыватьПраваПользователей; + Результат.ИспользуетсяОграничениеПоВладельцу = Свойства.ПолеВладельца <> Неопределено + И Не Свойства.ПолеВладельца.Отключено; Если Контекст.СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей.Получить(Список) <> Неопределено Тогда Результат.ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа = Истина; ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Список); @@ -24328,8 +26341,9 @@ Контекст.Вставить("ЕстьОграничениеПоПользователям", Результат.ЕстьОграничениеПоПользователям); Если Контекст.СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей = Неопределено Тогда - Результат.ИспользуетсяОграничениеПоВладельцу = Результат.ПолеВладельца <> Неопределено; Результат.РассчитыватьПраваПользователей = Результат.ЕстьОграничениеПоПользователям; + Результат.ИспользуетсяОграничениеПоВладельцу = Результат.ПолеВладельца <> Неопределено + И Не Результат.ПолеВладельца.Отключено; Контекст.Вставить("ИспользуетсяОграничениеПоВладельцу", Результат.ИспользуетсяОграничениеПоВладельцу); Контекст.Вставить("РассчитыватьПраваПользователей", Результат.РассчитыватьПраваПользователей); @@ -24417,9 +26431,10 @@ // * СписокСДатой - Булево // * СписокСПериодом - Булево // * ИмяКоллекцииТипа - Строка -// * СвойстваВерсии - Массив Из Строка +// * СвойстваВерсии - Массив из Строка // * ПоляТаблицОбъекта - см. НовоеОписаниеПолейТаблицОбъекта // * ОпорныеПоля - см. НовоеОписаниеОпорныхПолей +// * ВариантДоступа - Число - основной вариант доступа смотри также НовыеОсновныеВариантыДоступа. // * ИспользуетсяОграничениеПоВладельцу - Булево // * РассчитыватьПраваПользователей - Булево // * ЕстьЗависимыеСпискиБезЗаписиКлючейДоступа - Булево @@ -24436,59 +26451,59 @@ // * ЕстьОграничениеПоПользователям - Булево // * ИспользуетсяОграничениеПоВладельцу - Булево // * РассчитыватьПраваПользователей - Булево -// * СвойстваВсехПолей - Соответствие: +// * СвойстваВсехПолей - Соответствие из КлючИЗначение: // ** Ключ - см. ОписаниеУзла // ** Значение - см. СвойстваПоля -// * ОставшиесяПоляПослеУпрощения - Соответствие: +// * ОставшиесяПоляПослеУпрощения - Соответствие из КлючИЗначение: // ** Ключ - см. ОписаниеУзла // ** Значение - Массив из см. ОписаниеУзла // * ПоляКлючаДоступаПослеУпрощения - Массив из см. НовоеПолеКлючаДоступа -// * СвойстваПолейКлючаДоступа - Соответствие: +// * СвойстваПолейКлючаДоступа - Соответствие из КлючИЗначение: // ** Ключ - см. ОписаниеУзла // ** Значение - см. СвойстваПоля -// * ГруппыПолей - Соответствие: +// * ГруппыПолей - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя группы полей (Шапка?, ТабличнаяЧасть?) -// ** Значение - Массив Из см. СвойстваПоля -// * ПсевдонимыТабличныхЧастейОбъекта - Соответствие: +// ** Значение - Массив из см. СвойстваПоля +// * ПсевдонимыТабличныхЧастейОбъекта - Соответствие из КлючИЗначение: // ** Ключ - Число - номер табличной части ключа // ** Значение - Строка - псевдоним таблицы // * ГруппыДополнительныхТаблиц - см. ГруппыДополнительныхТаблиц // * КоличествоТабличныхЧастейКлюча - Число -// * ПоляУсловияСоединенияДополнительныхТаблиц - Массив Из Структура: +// * ПоляУсловияСоединенияДополнительныхТаблиц - Массив из Структура: // ** УзелПоле - см. ОписаниеУзла // ** ПсевдонимТаблицыУсловия - Строка // * ИмяПрава - Строка -// * ТребуемыеРеквизитыТабличныхЧастейКлюча - Соответствие: +// * ТребуемыеРеквизитыТабличныхЧастейКлюча - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя таблицы ключа (ИмяГруппыПолейКлючаДоступа) -// ** Значение - Массив Из Строка - имя реквизита таблицы ключа (ИмяРеквизитаГруппыПолейКлючаДоступа) -// * СтруктураРасчетаПраваСвойстваВерсии - Массив Из Строка +// ** Значение - Массив из Строка - имя реквизита таблицы ключа (ИмяРеквизитаГруппыПолейКлючаДоступа) +// * СтруктураРасчетаПраваСвойстваВерсии - Массив из Строка // -// Свойства из ОбщийКонтекст. +// Свойства из ОбщийКонтекст: // * СвойстваВидовДоступа - см. ХранимоеОписаниеСвойствВидовДоступа -// * ТипыПользователя - Массив Из Тип +// * ТипыПользователя - Массив из Тип // * ТипыВладельцевНастроекПрав - ФиксированноеСоответствие // * ОтдельныеТаблицыНастроекПрав - ФиксированноеСоответствие // * ИспользуемыеТипыЗначений - см. ИспользуемыеТипыЗначений // * СпискиСОграничением - см. УправлениеДоступомСлужебныйПовтИсп.СпискиСОграничением // * ВнешниеПользователиВключены - Булево // -// Свойства из ДополнительныйКонтекст. -// * ОписанияОграничений - Соответствие: +// Свойства из ДополнительныйКонтекст: +// * ОписанияОграничений - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. СокращенноеОписаниеОграничения -// * СвойстваОграниченияСписков - Соответствие: +// * СвойстваОграниченияСписков - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. НовыеСвойстваОграниченияСписка -// * СпискиСОграничениемПоВладельцу - Соответствие: +// * СпискиСОграничениемПоВладельцу - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - значение ПоВладельцу, кроме Неопределено. -// * СпискиСОтключеннымОграничением - Соответствие: +// * СпискиСОтключеннымОграничением - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСОтключеннымОграничениемЧтения - Соответствие: +// * СпискиСОтключеннымОграничениемЧтения - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина -// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие: +// * СпискиСЗаписьюКлючейДляЗависимыхСписковБезКлючей - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - Булево - Истина // @@ -24530,7 +26545,7 @@ // // Свойства узла Выбор (Иначе может быть Неопределено). // * Иначе - см. СтруктураРасчетаПрава -// * Когда - Массив Из Структура: +// * Когда - Массив из Структура: // ** Условие - см. СтруктураРасчетаПрава // ** Значение - см. СтруктураРасчетаПрава // @@ -24540,7 +26555,7 @@ // ЧтениеОбъектаРазрешено, ИзменениеОбъектаРазрешено, // ЧтениеСпискаРазрешено, ИзменениеСпискаРазрешено. // * Поле - см. СтруктураРасчетаПрава -// * УточненияСравнения - Соответствие: +// * УточненияСравнения - Соответствие из КлючИЗначение: // ** Ключ - Строка // - Тип - уточняемое значение "Неопределено", "Null", "ПустаяСсылка", // "Отключено", Тип (Ссылка, Число, Даты, Булево). @@ -24681,7 +26696,7 @@ // Возвращаемое значение: // Структура: -// * Результат - Массив Из см. НовыеПоляТаблицыОбъекта +// * Результат - Массив из см. НовыеПоляТаблицыОбъекта // * Состав - Структура: // ** Ключ - Строка - полное имя таблицы объекта. // ** Значение - Структура: @@ -24689,12 +26704,12 @@ // *** Значение - Структура: // **** Тип - ОписаниеТипов - типы поля. // **** Использование - Булево - использование поля. -// * ПоСвойствамПолей - Соответствие: +// * ПоСвойствамПолей - Соответствие из КлючИЗначение: // ** Ключ - см. НовыеСвойстваПоля // ** Значение - Структура: // *** Таблица - Строка - полное имя таблицы объекта. // *** Поле - Строка - имя поля. -// * ПоДополнительнымТаблицам - Соответствие: +// * ПоДополнительнымТаблицам - Соответствие из КлючИЗначение: // ** Ключ - Строка - дополнительная таблица // ** Значение - Структура: // *** Ключ - Строка - полное имя таблицы объекта. @@ -24716,11 +26731,20 @@ ОпорныеПоля = НовоеОписаниеОпорныхПолей(); Контекст.Вставить("ОпорныеПоля", ОпорныеПоля); + Контекст.Вставить("ВариантДоступа", Неопределено); Если Контекст.ЭтоСсылочныйТип Тогда Возврат; КонецЕсли; + Если Контекст.Свойство("ОсновныеВариантыДоступа") Тогда + ИспользуемыеВариантыДоступа = Контекст.ОсновныеВариантыДоступа.Получить(Контекст.Список); + Если ИспользуемыеВариантыДоступа <> Неопределено Тогда + Результат.ВариантДоступа = ИспользуемыеВариантыДоступа[0].ВариантДоступа; + КонецЕсли; + Контекст.Вставить("ВариантДоступа", Результат.ВариантДоступа); + КонецЕсли; + Если СтрРазделить(Контекст.Список, ".").Количество() > 1 Тогда ИмяОтдельногоРегистраКлючей = "КлючиДоступаКРегистру" + СтрРазделить(Контекст.Список, ".")[1]; Если Метаданные.РегистрыСведений.Найти(ИмяОтдельногоРегистраКлючей) = Неопределено Тогда @@ -24768,13 +26792,13 @@ // * ТипыИспользуемых - Массив // * МаксимальноеКоличество - Число // * МаксимальноДопустимоеКоличество - Число -// * ТипыПоИменамПолей - Соответствие: +// * ТипыПоИменамПолей - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя опорного поля // ** Значение - ОписаниеТипов - типы опорного поля -// * ПоСвойствамПолей - Соответствие: +// * ПоСвойствамПолей - Соответствие из КлючИЗначение: // ** Ключ - см. НовыеСвойстваПоля // ** Значение - Строка - имя опорного поля -// * ПоДополнительнымТаблицам - Соответствие: +// * ПоДополнительнымТаблицам - Соответствие из КлючИЗначение: // ** Ключ - Строка - дополнительная таблица // ** Значение - Массив из Строка - имена опорных полей // @@ -24826,17 +26850,16 @@ // Процедура ЗаполнитьОграничениеПоОбъектуВладельцу(Результат, Контекст) - ОграничениеПоВладельцу = Контекст.СпискиСОграничениемПоВладельцу.Получить(Контекст.Список); - Если ТипЗнч(ОграничениеПоВладельцу) = Тип("Булево") И Не ОграничениеПоВладельцу Тогда - Возврат; - КонецЕсли; - - ТребуетсяОграничениеПоВладельцу = ?(ТипЗнч(ОграничениеПоВладельцу) = Тип("Булево"), - ОграничениеПоВладельцу, Ложь); - - Результат.ТребуетсяОграничениеПоВладельцу = ТребуетсяОграничениеПоВладельцу; + НастройкаПоВладельцу = Контекст.СпискиСОграничениемПоВладельцу.Получить(Контекст.Список); ПолеВладельца = НовоеПолеВладельца(); + ТребуетсяОграничениеПоВладельцу = Ложь; + Если ТипЗнч(НастройкаПоВладельцу) = Тип("Булево") Тогда + ТребуетсяОграничениеПоВладельцу = НастройкаПоВладельцу; + ПолеВладельца.Отключено = Не НастройкаПоВладельцу; + КонецЕсли; + Результат.ТребуетсяОграничениеПоВладельцу = ТребуетсяОграничениеПоВладельцу; + ОграничениеЧтения = Контекст.СтруктураОграничения.ОграничениеЧтения; ОграничениеИзменения = Контекст.СтруктураОграничения.ОграничениеИзменения; @@ -25022,10 +27045,11 @@ // Структура: // * Имя - Строка // * ИзменениеКакЧтение - Булево +// * Отключено - Булево // Функция НовоеПолеВладельца() - Возврат Новый Структура("Имя, ИзменениеКакЧтение", "", Ложь); + Возврат Новый Структура("Имя, ИзменениеКакЧтение, Отключено", "", Ложь, Ложь); КонецФункции @@ -25633,15 +27657,15 @@ // // Возвращаемое значение: // Структура: -// * НомераПоПсевдонимам - Соответствие: +// * НомераПоПсевдонимам - Соответствие из КлючИЗначение: // ** Ключ - Строка - псевдоним дополнительной таблицы // ** Значение - Число - номер группы дополнительных таблиц // -// * ТаблицыПоГруппам - Соответствие: +// * ТаблицыПоГруппам - Соответствие из КлючИЗначение: // ** Ключ - Число - номер группы дополнительных таблиц -// ** Значение - Массив Из см. НовоеОписаниеСоединения +// ** Значение - Массив из см. НовоеОписаниеСоединения // -// * ПсевдонимыТаблицСПолями - Соответствие: +// * ПсевдонимыТаблицСПолями - Соответствие из КлючИЗначение: // ** Ключ - Строка - псевдоним дополнительной таблицы // с полями ключа доступа (кроме полей соединений). // ** Значение - Булево - Истина. @@ -26149,7 +28173,7 @@ ИмяПоля = ""; Для Каждого ИмяТипа Из УзелПоле.ТаблицыСледующегоПоля[0] Цикл - ТекущееИмяПоля = "ВЫРАЗИТЬ(" + ОпорноеПоле + " КАК " + ИмяТипа + ")." + ОстальныеПоля; + ТекущееИмяПоля = СтрШаблон("ВЫРАЗИТЬ (%1 КАК %2).%3", ОпорноеПоле, ИмяТипа, ОстальныеПоля); // @query-part-1 Если ЗначениеЗаполнено(ИмяПоля) Тогда ИмяПоля = "ЕСТЬNULL(" + ТекущееИмяПоля + ", @@ -27168,15 +29192,15 @@ // * СвойстваВложения - см. СвойстваПоля // * Чтение - Булево // * ПроверкаЕстьNull - Неопределено -// * ТипыСохраненияКлючейДоступа - Массив Из Тип -// * ТипыСохраненияГруппЗначений - Массив Из Тип -// * ТипыСохраненияЗначений - Массив Из Тип -// * ТипыСохраненияПустойСсылки - Массив Из Тип -// * ТипыСохраненияТипов - Массив Из Тип -// * ТипыСохраненияТипаЗапрещенный - Массив Из Тип -// * ТипыСохраненияТипаРазрешенный - Массив Из Тип -// * НеиспользуемыеТипыЗначенийДоступа - Массив Из Тип -// * ИспользуемыеТипыЗначенийДоступа - Массив Из Тип +// * ТипыСохраненияКлючейДоступа - Массив из Тип +// * ТипыСохраненияГруппЗначений - Массив из Тип +// * ТипыСохраненияЗначений - Массив из Тип +// * ТипыСохраненияПустойСсылки - Массив из Тип +// * ТипыСохраненияТипов - Массив из Тип +// * ТипыСохраненияТипаЗапрещенный - Массив из Тип +// * ТипыСохраненияТипаРазрешенный - Массив из Тип +// * НеиспользуемыеТипыЗначенийДоступа - Массив из Тип +// * ИспользуемыеТипыЗначенийДоступа - Массив из Тип // * НесколькоГруппЗначений - Булево // * ЭтоСписокЗначенийДоступаСГруппамиЗначений - Булево // * ЕстьУточнениеNull - Булево @@ -27184,9 +29208,9 @@ // * ЕстьТипВедущегоСписка - Булево // * ЕстьТипВладельцаНастроекПрав - Булево // * ЕстьПроверкаАвторизованногоПользователя - Булево -// * ТипыСохраненияТиповКонфигурации - Массив Из Тип -// * ТипыСохраненияТиповРасширений - Массив Из Тип -// * ТипыСохраненияТиповПростых - Массив Из Тип +// * ТипыСохраненияТиповКонфигурации - Массив из Тип +// * ТипыСохраненияТиповРасширений - Массив из Тип +// * ТипыСохраненияТиповПростых - Массив из Тип // * ИмяГруппыПолейКлючаДоступа - Строка // * ИмяРеквизитаГруппыПолейКлючаДоступа - Строка // @@ -27588,7 +29612,7 @@ Иначе ДополнительноеУсловие = ?(Не ЗначениеЗаполнено(Контекст.ИмяОтдельногоРегистраКлючей), " | И (ТекущийСписок.Регистр = &ИдентификаторРегистра)", "") + " - | И (ТекущийСписок.ДляВнешнихПользователей = " + ?(Контекст.ДляВнешнихПользователей, "ИСТИНА", "ЛОЖЬ") + ") + | И (ТекущийСписок.ВариантДоступа = &ВариантДоступа) | И (&УточнениеПланаЗапроса)"; КонецЕсли; @@ -27924,7 +29948,48 @@ КонецФункции -// Для функции ТипСсылкиПоПолномуИмениМетаданных. +// Для функции КлючТаблицы. +Функция ТипКлючаЗаписиПоПолномуИмениМетаданных(ПолноеИмя) + + Если ЭтоРусскийВариантВидаОбъектаМетаданных(ПолноеИмя) Тогда + ИмяТипаКлючаЗаписи = СтрЗаменить(ПолноеИмя, ".", "КлючЗаписи."); + Иначе + ИмяТипаКлючаЗаписи = СтрЗаменить(ПолноеИмя, ".", "RecordKey."); + КонецЕсли; + + Возврат Тип(ИмяТипаКлючаЗаписи); + +КонецФункции + +// Для функции КлючТаблицы. +Функция ТипНабораЗаписейПоПолномуИмениМетаданных(ПолноеИмя) + + Если ЭтоРусскийВариантВидаОбъектаМетаданных(ПолноеИмя) Тогда + ИмяТипаНабораЗаписей = СтрЗаменить(ПолноеИмя, ".", "НаборЗаписей."); + Иначе + ИмяТипаНабораЗаписей = СтрЗаменить(ПолноеИмя, ".", "RecordSet."); + КонецЕсли; + + Возврат Тип(ИмяТипаНабораЗаписей); + +КонецФункции + +// Для функции КлючТаблицы. +Функция ТипМенеджераОбъектаПоПолномуИмениМетаданных(ПолноеИмя) + + Если ЭтоРусскийВариантВидаОбъектаМетаданных(ПолноеИмя) Тогда + ИмяТипаМенеджера = СтрЗаменить(ПолноеИмя, ".", "Менеджер."); + Иначе + ИмяТипаМенеджера = СтрЗаменить(ПолноеИмя, ".", "Manager."); + КонецЕсли; + + Возврат Тип(ИмяТипаМенеджера); + +КонецФункции + +// Для функций ТипСсылкиПоПолномуИмениМетаданных, ТипКлючаЗаписиПоПолномуИмениМетаданных, +// ТипНабораЗаписейПоПолномуИмениМетаданных, ТипМенеджераОбъектаПоПолномуИмениМетаданных. +// Функция ЭтоРусскийВариантВидаОбъектаМетаданных(ПолноеИмя) ПервыйСимвол = Лев(ПолноеИмя, 1); @@ -28283,13 +30348,15 @@ ОсновнойОтбор = "КлючиДоступаКРегистрам.Регистр = &ИдентификаторРегистра"; КонецЕсли; - Если Результат.ДляВнешнихПользователей Тогда - ОсновнойОтбор = ОсновнойОтбор + ?(ОсновнойОтбор = "", "", " - | И ") + "КлючиДоступаКРегистрам.ДляВнешнихПользователей = ИСТИНА"; - Иначе - ОсновнойОтбор = ОсновнойОтбор + ?(ОсновнойОтбор = "", "", " - | И ") + "КлючиДоступаКРегистрам.ДляВнешнихПользователей = ЛОЖЬ"; - КонецЕсли; + ОсновнойОтбор = ОсновнойОтбор + ?(ОсновнойОтбор = "", "", " + | И "); + + ОтборПоВидуПользователей = "ВЫБОР + | КОГДА КлючиДоступаКРегистрам.ВариантДоступа = 0 + | ТОГДА ЛОЖЬ + | ИНАЧЕ КлючиДоступаКРегистрам.ВариантДоступа - (ВЫРАЗИТЬ(КлючиДоступаКРегистрам.ВариантДоступа / 2 - 0.5 КАК ЧИСЛО(15, 0))) * 2 = 1 + | КОНЕЦ = " + ?(Результат.ДляВнешнихПользователей, "ИСТИНА", "ЛОЖЬ"); + ОпорныеПоля = Контекст.ОпорныеПоля; Если ОпорныеПоля = Неопределено Тогда МаксимальноеКоличествоОпорныхПолей = @@ -28298,9 +30365,9 @@ МаксимальноеКоличествоОпорныхПолей = ОпорныеПоля.МаксимальноеКоличество; КонецЕсли; - ОпорныеПоляВыбора = ""; + ОпорныеПоляВыбора = "КлючиДоступаКРегистрам.ВариантДоступа КАК ВариантДоступа"; ОпорныеПоляДляОтбора = ""; - ОпорныеПоляДляУпорядочения = ""; + ОпорныеПоляДляУпорядочения = "КлючиДоступаКРегистрам.ВариантДоступа"; Для Номер = 1 По МаксимальноеКоличествоОпорныхПолей Цикл // Поля для выбора. @@ -28330,6 +30397,23 @@ ОпорныеПоляДляОтбора = ОпорныеПоляДляОтбора + ")"; КонецЕсли; + Если ЗначениеЗаполнено(Результат.ИмяОтдельногоРегистраКлючей) Тогда + ТекстЗапросаОчистки = + "ВЫБРАТЬ ПЕРВЫЕ " + МаркерРазмераПорции() + " + | " + ОпорныеПоляВыбора + " + |ИЗ + | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам + |ГДЕ + | КлючиДоступаКРегистрам.Регистр = &ИдентификаторРегистра + | И " + ОтборПоВидуПользователей + " + | И " + ОпорныеПоляДляОтбора + " + | И &УточнениеПланаЗапроса + | + |УПОРЯДОЧИТЬ ПО + | " + ОпорныеПоляДляУпорядочения; + Результат.Вставить("ТекстЗапросаУстаревшихЭлементовДанныхИзОбщегоРегистра", ТекстЗапросаОчистки); + КонецЕсли; + Если Результат.БезЗаписиКлючейДоступа Тогда ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ " + МаркерРазмераПорции() + " @@ -28337,28 +30421,13 @@ |ИЗ | РегистрСведений." + ИмяРегистра + " КАК КлючиДоступаКРегистрам |ГДЕ - | " + ОсновнойОтбор + " + | " + ОсновнойОтбор + ОтборПоВидуПользователей + " | И " + ОпорныеПоляДляОтбора + " | И &УточнениеПланаЗапроса | |УПОРЯДОЧИТЬ ПО | " + ОпорныеПоляДляУпорядочения; Иначе - Если ЗначениеЗаполнено(Результат.ИмяОтдельногоРегистраКлючей) Тогда - ТекстЗапросаОчистки = - "ВЫБРАТЬ ПЕРВЫЕ " + МаркерРазмераПорции() + " - | " + ОпорныеПоляВыбора + " - |ИЗ - | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - |ГДЕ - | КлючиДоступаКРегистрам.Регистр = &ИдентификаторРегистра - | И " + ОпорныеПоляДляОтбора + " - | И &УточнениеПланаЗапроса - | - |УПОРЯДОЧИТЬ ПО - | " + ОпорныеПоляДляУпорядочения; - Результат.Вставить("ТекстЗапросаУстаревшихЭлементовДанныхИзОбщегоРегистра", ТекстЗапросаОчистки); - КонецЕсли; Номер = 1; ОпорныеПоляВыбораПриПроверке = ""; ОпорныеПоляДляСравнения = ""; @@ -28372,39 +30441,48 @@ Номер = Номер + 1; КонецЦикла; - НачальныйНомер = ОпорныеПоля.Используемые.Количество() + 1; - ОтборНепустыхПолей = ""; - Для Номер = НачальныйНомер По ОпорныеПоля.МаксимальноеКоличество Цикл - ОтборНепустыхПолей = ОтборНепустыхПолей + ?(ОтборНепустыхПолей = "", "", " - | ИЛИ ") + "КлючиДоступаКРегистрам.Поле" + Номер + " <> ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.Null)"; - КонецЦикла; - ОтборНепустыхПолей = ?(ОтборНепустыхПолей = "", "ЛОЖЬ", ОтборНепустыхПолей); - ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ " + МаркерРазмераПорции() + " | " + ОпорныеПоляВыбора + ", - | " + ОтборНепустыхПолей + " КАК Удалить + | НЕ КлючиДоступаКРегистрам.ВариантДоступа В (&ИспользуемыеВариантыДоступа) КАК Удалить |ИЗ | РегистрСведений." + ИмяРегистра + " КАК КлючиДоступаКРегистрам |ГДЕ - | " + ОсновнойОтбор + " + | " + ОсновнойОтбор + ОтборПоВидуПользователей + " | И " + ОпорныеПоляДляОтбора + " - | И (" + ТекстСОтступом(ОтборНепустыхПолей, " ") + " - | ИЛИ НЕ ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | &ТекущийСписок КАК ТекущийСписок - | ГДЕ - | " + ТекстСОтступом(ОпорныеПоляДляСравнения, " ") + ")) + | И (НЕ КлючиДоступаКРегистрам.ВариантДоступа В (&ИспользуемыеВариантыДоступа) + | ИЛИ КлючиДоступаКРегистрам.ВариантДоступа = &ВариантДоступа + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | &ТекущийСписок КАК ТекущийСписок + | ГДЕ + | " + ТекстСОтступом(ОпорныеПоляДляСравнения, " ") + ")) | И &УточнениеПланаЗапроса | |УПОРЯДОЧИТЬ ПО | " + ОпорныеПоляДляУпорядочения; + ИспользуемыеВариантыДоступа = Контекст.ОсновныеВариантыДоступа.Получить(Контекст.Список); + ВариантыДоступаСтрокой = Новый Массив; + Если ИспользуемыеВариантыДоступа = Неопределено Тогда + ВариантыДоступаСтрокой.Добавить("NULL"); + Иначе + Для Каждого ИспользуемыйВариантДоступа Из ИспользуемыеВариантыДоступа Цикл + ВариантыДоступаСтрокой.Добавить(XMLСтрока(ИспользуемыйВариантДоступа.ВариантДоступа)); + КонецЦикла; + КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИспользуемыеВариантыДоступа", + СтрСоединить(ВариантыДоступаСтрокой, ",")); + + ВариантДоступаСтрокой = XMLСтрока(Контекст.ВариантДоступа); + ВариантДоступаСтрокой = ?(ЗначениеЗаполнено(ВариантДоступаСтрокой), ВариантДоступаСтрокой, "NULL"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВариантДоступа", ВариантДоступаСтрокой); + ТекстЗапросаПроверки = "ВЫБРАТЬ - | " + ОпорныеПоляВыбораПриПроверке + " + | &ОпорныеПоляВыбораПриПроверке |ПОМЕСТИТЬ КлючиДоступаКРегистрам |ИЗ | &КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам @@ -28412,7 +30490,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | " + ОпорныеПоляВыбораПриПроверке + " + | &ОпорныеПоляВыбораПриПроверке |ИЗ | КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам |ГДЕ @@ -28422,9 +30500,13 @@ | ИЗ | &ТекущийСписок КАК ТекущийСписок | ГДЕ - | " + ТекстСОтступом(ОпорныеПоляДляСравнения, " ") + ") + | &УсловиеОпорныеПоляДляСравнения) | И &УточнениеПланаЗапроса"; + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&ОпорныеПоляВыбораПриПроверке", ОпорныеПоляВыбораПриПроверке); + ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&УсловиеОпорныеПоляДляСравнения", + ТекстСОтступом(ОпорныеПоляДляСравнения, " ")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущийСписок", Результат.Список); ТекстЗапросаПроверки = СтрЗаменить(ТекстЗапросаПроверки, "&ТекущийСписок", Результат.Список); Результат.Вставить("ТекстЗапросаПроверкиУстаревшихЭлементовДанных", ТекстЗапросаПроверки); @@ -28532,7 +30614,7 @@ |ГДЕ | (КлючиДоступаКОбъектам.Объект ЕСТЬ NULL | ИЛИ #Условие) - | И &УточнениеПланаЗапроса"; + | И &УточнениеПланаЗапроса"; // @query-part Если Не Контекст.Свойство("ОписаниеЗапросовПроверкиПоВедущимОбъектам") Тогда Возврат; @@ -28586,22 +30668,20 @@ ОпорныеПоля.ДляОтбора = "ТекущийСписок.Регистр = &ИдентификаторРегистра"; КонецЕсли; - ОтборПоТипуПользователей = ?(Контекст.ДляВнешнихПользователей, "ИСТИНА", "ЛОЖЬ"); - // Для запроса новых комбинаций. ОпорныеПоляУсловиеСоединения = ОпорныеПоляУсловиеСоединения + ?(ОпорныеПоляУсловиеСоединения = "", "", " - | И ") + "(КлючиДоступаКРегистрам.ДляВнешнихПользователей = " + ОтборПоТипуПользователей + ")"; + | И ") + "(КлючиДоступаКРегистрам.ВариантДоступа = &ВариантДоступа)"; // Для запроса текущих ключей доступа. УсловиеОтбора = УсловиеОтбора + ?(УсловиеОтбора = "", "", " - | И ") + "ТекущийСписок.ДляВнешнихПользователей = " + ОтборПоТипуПользователей; + | И ") + "ТекущийСписок.ВариантДоступа = &ВариантДоступа"; // Для остальных запросов. ОпорныеПоля.УсловиеСоединения = ОпорныеПоля.УсловиеСоединения + ?(ОпорныеПоля.УсловиеСоединения = "", "", " - | И ") + "(ТекущийСписокИсточник.ДляВнешнихПользователей = " + ОтборПоТипуПользователей + ")"; + | И ") + "(ТекущийСписокИсточник.ВариантДоступа = &ВариантДоступа)"; ОпорныеПоля.ДляОтбора = ОпорныеПоля.ДляОтбора + ?(ОпорныеПоля.ДляОтбора = "", "", " - | И ") + "ТекущийСписок.ДляВнешнихПользователей = " + ОтборПоТипуПользователей; + | И ") + "ТекущийСписок.ВариантДоступа = &ВариантДоступа"; Номер = 0; Для Каждого ИмяОпорногоПоля Из ОпорныеПоля.Используемые Цикл @@ -28665,16 +30745,6 @@ ОпорныеПоля.ДляОтбора = ОпорныеПоля.ДляОтбора + ")"; КонецЕсли; - НачальныйНомер = Номер + 1; - Для Номер = НачальныйНомер По ОпорныеПоля.МаксимальноеКоличество Цикл - // Для запроса новых комбинаций. - ОпорныеПоляУсловиеСоединения = ОпорныеПоляУсловиеСоединения + ?(ОпорныеПоляУсловиеСоединения = "", "", " - | И ") + "(КлючиДоступаКРегистрам.Поле" + Номер + " = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.Null))"; - // Для запроса проверки. - ОпорныеПоля.ДляОтбора = ОпорныеПоля.ДляОтбора + ?(ОпорныеПоля.ДляОтбора = "", "", " - | И ") + "ТекущийСписок.Поле" + Номер + " = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.Null)"; - КонецЦикла; - // Установка шаблонов запросов. ТекстЗапросаПроверкиКомбинаций = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ " + МаркерРазмераПорции() + " @@ -28735,7 +30805,7 @@ | И (ТекущийРегистр.Период < &ДатаОкончания | ИЛИ ТекущийРегистр.Период = &ДатаОкончания | И " + ТекстСОтступом(ОпорныеПоляДляОтбора, " ") + ") - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL + | И КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL | И &УточнениеПланаЗапроса | |СГРУППИРОВАТЬ ПО @@ -28757,7 +30827,7 @@ | ПО " + ОпорныеПоляУсловиеСоединения + " |ГДЕ | " + ОпорныеПоляДляОтбора + " - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL + | И КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL | И &УточнениеПланаЗапроса | |УПОРЯДОЧИТЬ ПО @@ -28820,7 +30890,8 @@ "ВЫБРАТЬ | ТекущиеДанныеДляОтбора." + СтрСоединить(Поля, ", | ТекущиеДанныеДляОтбора.") + " - |ПОМЕСТИТЬ " + ВедущаяТаблицаБезТочек + " + |ПОМЕСТИТЬ " // @query-part + + ВедущаяТаблицаБезТочек + " |ИЗ | &" + ВедущаяТаблицаБезТочек + " КАК ТекущиеДанныеДляОтбора"; @@ -29447,7 +31518,7 @@ | &ТекущийСписок КАК КлючиДоступаКРегистрам |ГДЕ | КлючиДоступаКРегистрам.Регистр = &Список - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей = &ДляВнешнихПользователей + | И КлючиДоступаКРегистрам.ВариантДоступа = &ВариантДоступа | И КлючиДоступаКРегистрам.КлючДоступа > &ПоследнийКлючДоступа | И &УточнениеПланаЗапроса | @@ -29681,7 +31752,6 @@ | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам |ГДЕ | КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей = ИСТИНА | И КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1 | И (ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 @@ -29709,7 +31779,6 @@ | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам |ГДЕ | КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей = ЛОЖЬ | И КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1 | И (ИСТИНА В | (ВЫБРАТЬ ПЕРВЫЕ 1 @@ -29731,102 +31800,50 @@ | И РазрешенныеКлючиДоступа.Изменение))"; КонецЕсли; Иначе - Если Контекст.ДляВнешнихПользователей Тогда - ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК РазрешенныеКлючиДоступа - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ИСТИНА) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа) - | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) - | И (РазрешенныеКлючиДоступа.Изменение)"; - Иначе - ТекстЗапроса = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК РазрешенныеКлючиДоступа - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ЛОЖЬ) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа) - | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) - | И (РазрешенныеКлючиДоступа.Изменение)"; - КонецЕсли; + ТекстЗапроса = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаНаборовГруппДоступа КАК РазрешенныеКлючиДоступа + | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) + | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) + | И (РазрешенныеКлючиДоступа.КлючДоступа = КлючиДоступаКРегистрам.КлючДоступа) + | И (РазрешенныеКлючиДоступа.НаборГруппДоступа В (&РазрешенныйНаборГруппДоступа, &РазрешенныйПустойНаборГруппДоступа)) + | И (РазрешенныеКлючиДоступа.Изменение)"; КонецЕсли; УточнитьРегистрКлючейИУсловиеСоединения(ТекстЗапроса, Результат, Контекст); - Если Контекст.ДляВнешнихПользователей Тогда - ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейСуществующихЗаписей = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | &ТекущаяТаблицаПоле1 КАК Поле1 - |ИЗ - | &Список КАК ТекущаяТаблица - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ИСТИНА) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - |ГДЕ - | &ОтборПоИзмерениям - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL"; - ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейНовыхЗаписей = - "ВЫБРАТЬ - | &ТекущаяТаблицаПоле1 КАК ТекущаяТаблицаПоле1 - |ПОМЕСТИТЬ КомбинацииЗначенийОпорныхПолей - |ИЗ - | &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | &ТекущаяТаблицаПоле1 КАК Поле1 - |ИЗ - | КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ИСТИНА) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - |ГДЕ - | КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL"; - Иначе - ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейСуществующихЗаписей = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | &ТекущаяТаблицаПоле1 КАК Поле1 - |ИЗ - | &Список КАК ТекущаяТаблица - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ЛОЖЬ) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - |ГДЕ - | &ОтборПоИзмерениям - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL"; - ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейНовыхЗаписей = - "ВЫБРАТЬ - | &ТекущаяТаблицаПоле1 КАК ТекущаяТаблицаПоле1 - |ПОМЕСТИТЬ КомбинацииЗначенийОпорныхПолей - |ИЗ - | &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | &ТекущаяТаблицаПоле1 КАК Поле1 - |ИЗ - | КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам - | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) - | И (КлючиДоступаКРегистрам.ДляВнешнихПользователей = ЛОЖЬ) - | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) - |ГДЕ - | КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL"; - КонецЕсли; + ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейСуществующихЗаписей = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | &ТекущаяТаблицаПоле1 КАК Поле1 + |ИЗ + | &Список КАК ТекущаяТаблица + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам + | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) + | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) + |ГДЕ + | &ОтборПоИзмерениям + | И КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL"; + ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейНовыхЗаписей = + "ВЫБРАТЬ + | &ТекущаяТаблицаПоле1 КАК ТекущаяТаблицаПоле1 + |ПОМЕСТИТЬ КомбинацииЗначенийОпорныхПолей + |ИЗ + | &КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | &ТекущаяТаблицаПоле1 КАК Поле1 + |ИЗ + | КомбинацииЗначенийОпорныхПолей КАК ТекущаяТаблица + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КлючиДоступаКРегистрам КАК КлючиДоступаКРегистрам + | ПО (КлючиДоступаКРегистрам.Регистр = ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка)) + | И (КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1) + |ГДЕ + | КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL"; УточнитьРегистрКлючейИУсловиеСоединения(ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейСуществующихЗаписей, Результат, Контекст, Истина); УточнитьРегистрКлючейИУсловиеСоединения(ТекстЗапросаНовыхКомбинацийЗначенийОпорныхПолейНовыхЗаписей, @@ -29938,24 +31955,50 @@ Контекст.Список)); КонецЕсли; - УсловиеОтбора = ""; - УсловиеСоединения = ""; - НомерПоля = 1; - Для Каждого Поле Из Результат.ОпорныеПоля.Используемые Цикл - УсловиеОтбора = УсловиеОтбора + Символы.ПС - + "И КлючиДоступаКРегистрам.Поле" + НомерПоля + " = ТекущаяТаблица." + Поле; - УсловиеСоединения = УсловиеСоединения + Символы.ПС - + "И (КлючиДоступаКРегистрам.Поле" + НомерПоля + " = ТекущаяТаблица." + Поле + ")"; - НомерПоля = НомерПоля + 1; - КонецЦикла; - Для ТекущийНомер = НомерПоля По Результат.ОпорныеПоля.МаксимальноеКоличество Цикл - УсловиеОтбора = УсловиеОтбора + Символы.ПС - + "И КлючиДоступаКРегистрам.Поле" + ТекущийНомер - + " = Значение(Перечисление.ДополнительныеЗначенияДоступа.Null)"; - УсловиеСоединения = УсловиеСоединения + Символы.ПС - + "И (КлючиДоступаКРегистрам.Поле" + ТекущийНомер - + " = Значение(Перечисление.ДополнительныеЗначенияДоступа.Null))"; + ИспользуемыеВариантыДоступа = Контекст.ОсновныеВариантыДоступа.Получить(Контекст.Список); + Если ИспользуемыеВариантыДоступа = Неопределено Тогда + ИспользуемыйВариантДоступа = НовыйИспользуемыйВариантДоступа(); + ИспользуемыйВариантДоступа.ВариантДоступа = Результат.ВариантДоступа; + ИспользуемыйВариантДоступа.ПоляСоединения = СтрСоединить(Результат.ОпорныеПоля.Используемые, ","); + ИспользуемыеВариантыДоступа = Новый Массив; + ИспользуемыеВариантыДоступа.Добавить(ИспользуемыйВариантДоступа); + КонецЕсли; + Если ДобавитьПоляВыбора Тогда + ИспользуемыйВариантДоступа = ИспользуемыеВариантыДоступа[0]; + ИспользуемыеВариантыДоступа = Новый Массив; + ИспользуемыеВариантыДоступа.Добавить(ИспользуемыйВариантДоступа); + КонецЕсли; + + УсловияОтбора = Новый Массив; + УсловияСоединения = Новый Массив; + Для Каждого ИспользуемыйВариантДоступа Из ИспользуемыеВариантыДоступа Цикл + Условие = Новый Массив; + ВариантДоступаСтрокой = XMLСтрока(ИспользуемыйВариантДоступа.ВариантДоступа); + ВариантДоступаСтрокой = ?(ЗначениеЗаполнено(ВариантДоступаСтрокой), ВариантДоступаСтрокой, "NULL"); + Условие.Добавить("КлючиДоступаКРегистрам.ВариантДоступа = " + ВариантДоступаСтрокой); + НомерПоля = 1; + ИменаПолей = СтрРазделить(ИспользуемыйВариантДоступа.ПоляСоединения, ",", Ложь); + Для Каждого ИмяПоля Из ИменаПолей Цикл + Условие.Добавить("КлючиДоступаКРегистрам.Поле" + НомерПоля + " = ТекущаяТаблица." + ИмяПоля); + НомерПоля = НомерПоля + 1; + КонецЦикла; + Если ИспользуемыеВариантыДоступа.Количество() = 1 Тогда + УсловияОтбора.Добавить("И " + СтрСоединить(Условие, Символы.ПС + "И ")); + УсловияСоединения.Добавить("И (" + СтрСоединить(Условие, ")" + Символы.ПС + "И (") + ")"); + Иначе + УсловияОтбора.Добавить(СтрСоединить(Условие, Символы.ПС + " И ")); + УсловияСоединения.Добавить(СтрСоединить(Условие, Символы.ПС + " И ")); + КонецЕсли; КонецЦикла; + + Если ИспользуемыеВариантыДоступа.Количество() = 1 Тогда + УсловиеОтбора = УсловияОтбора[0]; + УсловиеСоединения = УсловияСоединения[0]; + Иначе + УсловиеОтбора = "И (" + СтрСоединить(УсловияОтбора, Символы.ПС + " ИЛИ ") + ")"; + УсловиеСоединения = "И (" + СтрСоединить(УсловияСоединения, Символы.ПС + " ИЛИ ") + ")"; + КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И КлючиДоступаКРегистрам.Поле1 = &ТекущаяТаблицаПоле1", ТекстСОтступом(СокрЛ(УсловиеОтбора), " ")); @@ -30011,6 +32054,8 @@ Иначе ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущийРегистр", Контекст.Список); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#КлючиДоступаКДанным", "ТекущийСписок"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТекущийСписок.Регистр = &ИдентификаторРегистра", "#1"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТекущийСписок.ВариантДоступа = &ВариантДоступа", "#2"); Номер = 0; Для Каждого ИмяОпорногоПоля Из Контекст.ОпорныеПоля.Используемые Цикл Номер = Номер + 1; @@ -30020,6 +32065,8 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТекущийСписокИсточник." + ИмяОпорногоПоля, "ТекущийСписокИсточник.Поле" + Номер); КонецЦикла; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#1", "ТекущийСписок.Регистр = &ИдентификаторРегистра"); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#2", "ТекущийСписок.ВариантДоступа = &ВариантДоступа"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекущийСписок", ?(Контекст.ИмяОтдельногоРегистраКлючей = "", "РегистрСведений.КлючиДоступаКРегистрам", "РегистрСведений." + Контекст.ИмяОтдельногоРегистраКлючей)); @@ -30027,6 +32074,7 @@ КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&СоставПолей", Формат(Контекст.СоставПолей, "ЧГ=")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ВариантДоступа", XMLСтрока(Контекст.ВариантДоступа)); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ДляВнешнихПользователей", ?(Контекст.ДляВнешнихПользователей, "ИСТИНА", "ЛОЖЬ")); @@ -30235,7 +32283,7 @@ | " + Контекст.ОпорныеПоля.ДляВыбора + " | ПОМЕСТИТЬ ТекущийСписок |ИЗ - | &ЗначенияОпорныхПолей КАК ТекущийСписок"; + | &ЗначенияОпорныхПолей КАК ТекущийСписок"; // @query-part Контекст.ЧастиЗапросаЗначенийИзОбъектов.Добавить(ТекстЗапроса); ИначеЕсли НомерШапки = 0 Тогда @@ -30244,7 +32292,8 @@ "ВЫБРАТЬ | ТекущаяТаблица." + СтрСоединить(ОписаниеТаблицы.Поля, ", | ТекущаяТаблица.") + " - | ПОМЕСТИТЬ " + ОписаниеТаблицы.ПолноеИмяТаблицы + " + | ПОМЕСТИТЬ " // @query-part + + ОписаниеТаблицы.ПолноеИмяТаблицы + " |ИЗ | &" + ОписаниеТаблицы.ПолноеИмяТаблицы + " КАК ТекущаяТаблица"; Контекст.ЧастиЗапросаЗначенийИзОбъектовВПамяти.Добавить(ТекстЗапроса); @@ -31333,7 +33382,7 @@ КонецФункции // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя коллекции объектов метаданных, например, Справочники. // * Значение - см. НовыйСоставКоллекции // @@ -31344,7 +33393,7 @@ КонецФункции // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя таблицы (объекта метаданных) в верхнем регистре. // * Значение - см. НовыеСвойстваТаблицы // @@ -31360,14 +33409,14 @@ // * ЭтоОсновнаяТаблица - Булево // * Источники - Массив // * ПервоеПоле - Неопределено -// * Поля - Соответствие: +// * Поля - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя реквизита в верхнем регистре, в том числе через точки, // например, "ВЛАДЕЛЕЦ.ОРГАНИЗАЦИЯ", "ТОВАРЫ.НОМЕНКЛАТУРА". // ** Значение - см. НовыеСвойстваПоля -// * Предопределенные - Соответствие: +// * Предопределенные - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя предопределенного элемента. // ** Значение - см. НовыеСвойстваПредопределенного -// * Расширения - Соответствие: +// * Расширения - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя третьего имени таблицы, например, имя табличной части. // ** Значение - см. НовыеСвойстваРасширения // @@ -31395,7 +33444,7 @@ // Поля после первой точки могут относится только к коллекциям: "Реквизиты", // "СтандартныеРеквизиты", "ПризнакиУчета", "РеквизитыАдресации". Для этих // частей имени поля не требуется уточнять коллекцию. -// * СодержитТипы - Соответствие: +// * СодержитТипы - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя ссылочной таблицы в верхнем регистре. // ** Значение - Структура: // *** ИмяТипа - Строка - имя типа, наличие которого нужно проверить. @@ -31427,7 +33476,7 @@ // * ТаблицаСуществует - Булево - Ложь (для заполнения Истина, если существует). // * Источники - Массив // * ПервоеПоле - Неопределено -// * Поля - Соответствие: +// * Поля - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя реквизита в верхнем регистре, в том числе через точки, // например, "ВЛАДЕЛЕЦ.ОРГАНИЗАЦИЯ", "ТОВАРЫ.НОМЕНКЛАТУРА". // ** Значение - см. НовыеСвойстваПоля @@ -31522,7 +33571,7 @@ // * ЕстьОшибки - Булево // * ТекстОшибок - Строка // * Ограничение - Строка -// * Ошибки - Массив Из см. СвойстваОшибки +// * Ошибки - Массив из см. СвойстваОшибки // * Дополнение - Строка // Функция ОписаниеОшибок() @@ -32104,7 +34153,7 @@ // Для функции СинтаксисЯзыка. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - символ // * Значение - Строка - вид символа // @@ -32159,7 +34208,7 @@ // Для функции СинтаксисЯзыка. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - символ // * Значение - Булево - Истина // @@ -32178,7 +34227,7 @@ // Для функции СинтаксисЯзыка. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - слово на русском и английском языках. // * Значение - см. СвойстваСлова // @@ -32186,90 +34235,166 @@ Слова = Новый Соответствие; - ДобавитьСловоЯзыка(Слова, "ПрисоединитьДополнительныеТаблицы", "AttachAdditionalTables", "Начало", Ложь); - ДобавитьСловоЯзыка(Слова, "ЭтотСписок", "ThisList", "НачалоСписок", Ложь); - ДобавитьСловоЯзыка(Слова, "РазрешитьЧтениеИзменение", "AllowReadUpdate", "Начало", Ложь); - ДобавитьСловоЯзыка(Слова, "РазрешитьЧтение", "AllowRead", "Начало", Ложь); - ДобавитьСловоЯзыка(Слова, "РазрешитьИзменениеЕслиРазрешеноЧтение", "AllowUpdateIfReadingAllowed", "Начало", Ложь); - ДобавитьСловоЯзыка(Слова, "Где", "Where", "НачалоГде"); + ДобавитьСловоЯзыка(Слова, "ПрисоединитьДополнительныеТаблицы", // @Non-NLS + "AttachAdditionalTables", "Начало", Ложь); + ДобавитьСловоЯзыка(Слова, "ЭтотСписок", // @Non-NLS + "ThisList", "НачалоСписок", Ложь); + ДобавитьСловоЯзыка(Слова, "РазрешитьЧтениеИзменение", // @Non-NLS + "AllowReadUpdate", "Начало", Ложь); + ДобавитьСловоЯзыка(Слова, "РазрешитьЧтение", // @Non-NLS + "AllowRead", "Начало", Ложь); + ДобавитьСловоЯзыка(Слова, "РазрешитьИзменениеЕслиРазрешеноЧтение", // @Non-NLS + "AllowUpdateIfReadingAllowed", "Начало", Ложь); + ДобавитьСловоЯзыка(Слова, "Где", // @Non-NLS + "Where", "НачалоГде"); - ДобавитьСловоЯзыка(Слова, "Левое", "Left", "Присоединение"); - ДобавитьСловоЯзыка(Слова, "Соединение", "Join", "Присоединение"); - ДобавитьСловоЯзыка(Слова, "По", "On", "Присоединение"); + ДобавитьСловоЯзыка(Слова, "Левое", // @Non-NLS + "Left", "Присоединение"); + ДобавитьСловоЯзыка(Слова, "Соединение", // @Non-NLS + "Join", "Присоединение"); + ДобавитьСловоЯзыка(Слова, "По", // @Non-NLS + "On", "Присоединение"); - ДобавитьСловоЯзыка(Слова, "И", "And", "Соединитель", , 2); - ДобавитьСловоЯзыка(Слова, "Или", "Or", "Соединитель", , 1); - ДобавитьСловоЯзыка(Слова, "В", "In", "Соединитель", , 5); - ДобавитьСловоЯзыка(Слова, "Как", "As", "Соединитель"); - ДобавитьСловоЯзыка(Слова, "Кроме", "Except", "Соединитель"); - ДобавитьСловоЯзыка(Слова, "Только", "Only", "Соединитель"); - ДобавитьСловоЯзыка(Слова, "Есть", "Is", "Соединитель", , 7); - ДобавитьСловоЯзыка(Слова, "Не", "Not", "Оператор", , 3); + ДобавитьСловоЯзыка(Слова, "И", // @Non-NLS + "And", "Соединитель", , 2); + ДобавитьСловоЯзыка(Слова, "Или", // @Non-NLS + "Or", "Соединитель", , 1); + ДобавитьСловоЯзыка(Слова, "В", // @Non-NLS + "In", "Соединитель", , 5); + ДобавитьСловоЯзыка(Слова, "Как", // @Non-NLS + "As", "Соединитель"); + ДобавитьСловоЯзыка(Слова, "Кроме", // @Non-NLS + "Except", "Соединитель"); + ДобавитьСловоЯзыка(Слова, "Только", // @Non-NLS + "Only", "Соединитель"); + ДобавитьСловоЯзыка(Слова, "Есть", // @Non-NLS + "Is", "Соединитель", , 7); + ДобавитьСловоЯзыка(Слова, "Не", // @Non-NLS + "Not", "Оператор", , 3); - ДобавитьСловоЯзыка(Слова, "Выбор", "Case", "СловоВыбора"); - ДобавитьСловоЯзыка(Слова, "Когда", "When", "СловоВыбора"); - ДобавитьСловоЯзыка(Слова, "Тогда", "Then", "СловоВыбора"); - ДобавитьСловоЯзыка(Слова, "Иначе", "Else", "СловоВыбора"); - ДобавитьСловоЯзыка(Слова, "Конец", "End", "СловоВыбора"); + ДобавитьСловоЯзыка(Слова, "Выбор", // @Non-NLS + "Case", "СловоВыбора"); + ДобавитьСловоЯзыка(Слова, "Когда", // @Non-NLS + "When", "СловоВыбора"); + ДобавитьСловоЯзыка(Слова, "Тогда", // @Non-NLS + "Then", "СловоВыбора"); + ДобавитьСловоЯзыка(Слова, "Иначе", // @Non-NLS + "Else", "СловоВыбора"); + ДобавитьСловоЯзыка(Слова, "Конец", // @Non-NLS + "End", "СловоВыбора"); - ДобавитьСловоЯзыка(Слова, "ЕстьNull", "IsNull", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "Выразить", "Cast", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "Значение", "Value", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ТипЗначения", "ValueType", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "Тип", "Type", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ЗначениеРазрешено", "ValueAllowed", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ЧтениеОбъектаРазрешено", "ObjectReadingAllowed", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ИзменениеОбъектаРазрешено", "ObjectUpdateAllowed", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ЧтениеСпискаРазрешено", "ListReadingAllowed", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ИзменениеСпискаРазрешено", "ListUpdateAllowed", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ДляВсехСтрок", "ForAllRows", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ДляОднойИзСтрок", "ForAtLeastOneRow", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ЭтоАвторизованныйПользователь", "IsAuthorizedUser", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ЕстьNull", // @Non-NLS + "IsNull", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "Выразить", // @Non-NLS + "Cast", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "Значение", // @Non-NLS + "Value", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ТипЗначения", // @Non-NLS + "ValueType", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "Тип", // @Non-NLS + "Type", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ЗначениеРазрешено", // @Non-NLS + "ValueAllowed", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ЧтениеОбъектаРазрешено", // @Non-NLS + "ObjectReadingAllowed", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ИзменениеОбъектаРазрешено", // @Non-NLS + "ObjectUpdateAllowed", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ЧтениеСпискаРазрешено", // @Non-NLS + "ListReadingAllowed", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ИзменениеСпискаРазрешено", // @Non-NLS + "ListUpdateAllowed", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ДляВсехСтрок", // @Non-NLS + "ForAllRows", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ДляОднойИзСтрок", // @Non-NLS + "ForAtLeastOneRow", "Функция", Ложь); + ДобавитьСловоЯзыка(Слова, "ЭтоАвторизованныйПользователь", // @Non-NLS + "IsAuthorizedUser", "Функция", Ложь); - ДобавитьСловоЯзыка(Слова, "ПустаяСсылка", "EmptyRef", "ЗначениеСравнения"); - ДобавитьСловоЯзыка(Слова, "Отключено", "Disabled", "ЗначениеСравнения"); - ДобавитьСловоЯзыка(Слова, "Неопределено", "Undefined", "ЗначениеСравнения"); - ДобавитьСловоЯзыка(Слова, "Null", "Null", "ЗначениеСравнения"); - ДобавитьСловоЯзыка(Слова, "Ложь", "False", "ЗначениеУточнения"); - ДобавитьСловоЯзыка(Слова, "Истина", "True", "ЗначениеУточнения"); + ДобавитьСловоЯзыка(Слова, "ПустаяСсылка", // @Non-NLS + "EmptyRef", "ЗначениеСравнения"); + ДобавитьСловоЯзыка(Слова, "Отключено", // @Non-NLS + "Disabled", "ЗначениеСравнения"); + ДобавитьСловоЯзыка(Слова, "Неопределено", // @Non-NLS + "Undefined", "ЗначениеСравнения"); + ДобавитьСловоЯзыка(Слова, "Null", // @Non-NLS + "Null", "ЗначениеСравнения"); + ДобавитьСловоЯзыка(Слова, "Ложь", // @Non-NLS + "False", "ЗначениеУточнения"); + ДобавитьСловоЯзыка(Слова, "Истина", // @Non-NLS + "True", "ЗначениеУточнения"); - ДобавитьСловоЯзыка(Слова, "Строка", "String", "ИмяТипа"); - ДобавитьСловоЯзыка(Слова, "Число", "Number", "ИмяТипа"); - ДобавитьСловоЯзыка(Слова, "Дата", "Date", "ИмяТипа"); - ДобавитьСловоЯзыка(Слова, "Булево", "Boolean", "ИмяТипа"); + ДобавитьСловоЯзыка(Слова, "Строка", // @Non-NLS + "String", "ИмяТипа"); + ДобавитьСловоЯзыка(Слова, "Число", // @Non-NLS + "Number", "ИмяТипа"); + ДобавитьСловоЯзыка(Слова, "Дата", // @Non-NLS + "Date", "ИмяТипа"); + ДобавитьСловоЯзыка(Слова, "Булево", // @Non-NLS + "Boolean", "ИмяТипа"); // Неподдерживаемые, зарезервированные слова. - ДобавитьСловоЯзыка(Слова, "Выбрать", "Select", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Первые", "Top", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Различные", "Distinct", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Из", "From", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Внутреннее", "Inner", "Присоединение", , , Истина); - ДобавитьСловоЯзыка(Слова, "Полное", "Full", "Присоединение", , , Истина); - ДобавитьСловоЯзыка(Слова, "Сгруппировать", "Group", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Имеющие", "Having", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Упорядочить", "Order", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Итоги", "Totals", "Неопределен", , , Истина); - ДобавитьСловоЯзыка(Слова, "Год", "Year", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Квартал", "Quarter", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Месяц", "Month", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "ДеньГода", "DayOfYear", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "День", "Day", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Неделя", "Week", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "ДеньНедели", "Weekday", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Час", "Hour", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Минута", "Minute", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Секунда", "Second", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "НачалоПериода", "BeginOfPeriod", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "КонецПериода", "EndOfPeriod", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "ДобавитьКДате", "DateAdd", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "РазностьДат", "DateDiff", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Сумма", "Sum", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Минимум", "Min", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Максимум", "Max", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Среднее", "Avg", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Количество", "Count", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "Представление", "Presentation", "Функция", Ложь, , Истина); - ДобавитьСловоЯзыка(Слова, "ПредставлениеСсылки", "RefPresentation", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Выбрать", // @Non-NLS + "Select", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Первые", // @Non-NLS + "Top", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Различные", // @Non-NLS + "Distinct", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Из", // @Non-NLS + "From", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Внутреннее", // @Non-NLS + "Inner", "Присоединение", , , Истина); + ДобавитьСловоЯзыка(Слова, "Полное", // @Non-NLS + "Full", "Присоединение", , , Истина); + ДобавитьСловоЯзыка(Слова, "Сгруппировать", // @Non-NLS + "Group", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Имеющие", // @Non-NLS + "Having", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Упорядочить", // @Non-NLS + "Order", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Итоги", // @Non-NLS + "Totals", "Неопределен", , , Истина); + ДобавитьСловоЯзыка(Слова, "Год", // @Non-NLS + "Year", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Квартал", // @Non-NLS + "Quarter", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Месяц", // @Non-NLS + "Month", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "ДеньГода", // @Non-NLS + "DayOfYear", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "День", // @Non-NLS + "Day", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Неделя", // @Non-NLS + "Week", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "ДеньНедели", // @Non-NLS + "Weekday", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Час", // @Non-NLS + "Hour", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Минута", // @Non-NLS + "Minute", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Секунда", // @Non-NLS + "Second", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "НачалоПериода", // @Non-NLS + "BeginOfPeriod", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "КонецПериода", // @Non-NLS + "EndOfPeriod", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "ДобавитьКДате", // @Non-NLS + "DateAdd", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "РазностьДат", // @Non-NLS + "DateDiff", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Сумма", // @Non-NLS + "Sum", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Минимум", // @Non-NLS + "Min", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Максимум", // @Non-NLS + "Max", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Среднее", // @Non-NLS + "Avg", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Количество", // @Non-NLS + "Count", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "Представление", // @Non-NLS + "Presentation", "Функция", Ложь, , Истина); + ДобавитьСловоЯзыка(Слова, "ПредставлениеСсылки", // @Non-NLS + "RefPresentation", "Функция", Ложь, , Истина); Возврат Новый ФиксированноеСоответствие(Слова); @@ -32278,7 +34403,7 @@ // Для функции СинтаксисЯзыка. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - слово на русском и английском языках. // * Значение - см. СвойстваСлова // @@ -32330,7 +34455,7 @@ Функция СвойстваСлова(ЯзыкРусский, ЯзыкАнглийский, ТипСлова, ВерхнийРегистр, Приоритет, ЭтоРезерв) СвойстваСлова = Новый Структура; - СвойстваСлова.Вставить("Идентификатор", ЯзыкРусский); + СвойстваСлова.Вставить("Идентификатор", ?(КодСимвола(Лев(ТипСлова, 1)) > 122, ЯзыкРусский, ЯзыкАнглийский)); СвойстваСлова.Вставить("ЯзыкРусский", ЯзыкРусский); СвойстваСлова.Вставить("ЯзыкАнглийский", ЯзыкАнглийский); СвойстваСлова.Вставить("Тип", ТипСлова); @@ -32346,10 +34471,10 @@ // // Возвращаемое значение: // Структура: -// * ПоИменам - Соответствие: +// * ПоИменам - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя типа таблиц на русском и на английском языках. // ** Значение - см. СвойстваТипаТаблиц -// * ПоКоллекциям - Соответствие: +// * ПоКоллекциям - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя коллекции на языке конфигурации (русском или английском). // ** Значение - см. СвойстваТипаТаблиц // @@ -32488,13 +34613,13 @@ // * ЭтоСсылочныйТип - Булево // * ЕстьОграничение - Булево // * ЕстьПредопределенные - Булево -// * КоллекцииПолей - Соответствие: +// * КоллекцииПолей - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя коллекции полей на языке конфигурации (русском или английском). // ** Значение - Строка - // "Разрешены" - можно использовать без ограничений. // "Недопустимы" - нельзя использовать в ограничении доступа платформы 1С:Предприятия. // -// * КоллекцииТабличныхЧастей - Соответствие: +// * КоллекцииТабличныхЧастей - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя коллекции табличных частей на языке конфигурации (русском или английском). // ** Значение - Строка - // "Разрешены" - можно использовать без ограничений. @@ -32510,11 +34635,11 @@ // "Недопустимы" - нельзя использовать в ограничении доступа платформы 1С:Предприятия. // "Отсутствуют" - не существуют у объекта метаданных. // -// * УточнениеПолей - Соответствие: +// * УточнениеПолей - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя поля таблиц на русском и на английском языках. // ** Значение - см. УточнениеПоля // -// * УточнениеТаблиц - Соответствие: +// * УточнениеТаблиц - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя расширения таблиц на русском и на английском языках. // ** Значение - см. УточнениеТаблиц // @@ -32650,6 +34775,9 @@ // Для функции РазобранноеОграничение. // +// Параметры: +// ВнутренниеДанные - см. НовыеВнутренниеДанные +// // Возвращаемое значение: // Структура: // * ДополнительныеТаблицы - Массив из см. НовоеОписаниеСоединения @@ -32686,7 +34814,7 @@ СвойстваЧастей = Новый Массив; // Массив Из см. НовыеСвойстваЧасти ИндексСтроки = 0; Для Каждого ИндексСтрокиРазделителя Из ИндексыСтрокРазделителя Цикл - СтрокиЧасти = Новый Массив; + СтрокиЧасти = Новый Массив; // см. ТаблицаНаборовСимволов Пока ИндексСтроки < ИндексСтрокиРазделителя Цикл СтрокаЧасти = ТаблицаНаборовСимволов[ИндексСтроки]; Если СтрокаЧасти.Вид <> "НедопустимыйСимвол" Тогда @@ -32702,11 +34830,12 @@ СвойстваЧасти.Вставить("Строки", СтрокиЧасти); СвойстваЧасти.Вставить("СтрокаРазделителя", СтрокаРазделителя); СвойстваЧастей.Добавить(СвойстваЧасти); - Если СтрокиЧасти[0].Вид = "КлючевоеСлово" - И СтрокиЧасти[0].Тип = "Начало" Тогда + ПерваяСтрокаЧасти = СтрокиЧасти[0]; + Если ПерваяСтрокаЧасти.Вид = "КлючевоеСлово" + И ПерваяСтрокаЧасти.Тип = "Начало" Тогда - СвойстваЧасти.Вставить("Имя", СтрокиЧасти[0].Уточнение); - СвойстваЧасти.Вставить("Представление", СтрокиЧасти[0].Символы); + СвойстваЧасти.Вставить("Имя", ПерваяСтрокаЧасти.Уточнение); + СвойстваЧасти.Вставить("Представление", ПерваяСтрокаЧасти.Символы); РазобратьЧастьОграничения(СвойстваЧасти, ВнутренниеДанные); Иначе @@ -32851,8 +34980,8 @@ // * Таблица - Строка // * Псевдоним - Строка // * УсловиеСоединения - см. ОписаниеУзла -// * ПсевдонимыТребуемыхТаблиц - Массив Из Строка -// * ПоляУсловияСоединения - Массив Из см. ПараПолейУсловияСоединения +// * ПсевдонимыТребуемыхТаблиц - Массив из Строка +// * ПоляУсловияСоединения - Массив из см. ПараПолейУсловияСоединения // * ПолеПроверкиСоединения - Строка // * ТекстУсловияСоединения - Строка // @@ -32865,7 +34994,7 @@ // Возвращаемое значение: // Структура: -// * Источник - СтрокаТаблицыЗначений +// * Источник - СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов // // * Узел - Строка - одна из строк "Поле", "Значение", "Константа", // "И", "Или", "Не", "=", "<>", "В", "ЕстьNull", "Тип", "ТипЗначения", "Выбор", @@ -32957,10 +35086,10 @@ // ЧтениеСпискаРазрешено, ИзменениеСпискаРазрешено. // В свойстве Поле - узел Поле. // * Поле - см. ОписаниеУзла -// * Типы - Массив Из Строка - полное имя таблицы +// * Типы - Массив из Строка - полное имя таблицы // * ПроверятьТипыКромеУказанных - Булево - если Истина, то все типы свойства Поле, // кроме указанных в свойстве Типы. -// * УточненияСравнения - Соответствие: +// * УточненияСравнения - Соответствие из КлючИЗначение: // ** Ключ - Строка - уточняемое значение "Неопределено", "Null", "ПустаяСсылка", // <полное имя таблицы>, "Число", "Строка", "Дата", "Булево". // ** Значение - Строка - результат "Ложь", "Истина". @@ -33068,7 +35197,7 @@ // Для процедуры РазобратьЧастьОграничения. Процедура РазобратьДополнительныеТаблицы(СвойстваЧасти, ВнутренниеДанные) - СтрокиЧасти = СвойстваЧасти.Строки; + СтрокиЧасти = СвойстваЧасти.Строки; // см. ТаблицаНаборовСимволов Если СтрокиЧасти.Количество() < 2 Или СтрокиЧасти[1].Вид <> "КлючевоеСлово" @@ -33163,6 +35292,10 @@ КонецПроцедуры // Для процедуры РазобратьДополнительныеТаблицы. +// +// Параметры: +// Соединение - см. ТаблицаНаборовСимволов +// Процедура РазобратьСоединение(Соединение, СвойстваЧасти, ВнутренниеДанные) ОписаниеСоединения = НовоеОписаниеСоединения(); @@ -33275,7 +35408,7 @@ // ЭтоСписокИсключений - Булево - если Истина, добавить узлы, кроме указанных. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя узла // * Значение - Булево // - Структура: @@ -33728,7 +35861,7 @@ // Для процедуры РазобратьЧастьОграничения. Процедура РазобратьУсловиеОграничения(СвойстваЧасти, ВнутренниеДанные) - СтрокиЧасти = СвойстваЧасти.Строки; + СтрокиЧасти = СвойстваЧасти.Строки; // см. ТаблицаНаборовСимволов ИзменитьВидКлючевогоСловаСписокНаИмя(СтрокиЧасти); Если СтрокиЧасти.Количество() < 2 @@ -33798,7 +35931,7 @@ // Для процедур РазобратьУсловиеСоединения, РазобратьУсловиеОграничения. // // Параметры: -// Условие - Массив Из СтрокаТаблицыЗначений +// Условие - Массив из СтрокаТаблицыЗначений // Состав - см. ОписаниеУзла // ВнутренниеДанные - см. НовыеВнутренниеДанные // @@ -33852,6 +35985,10 @@ // Для процедур РазобратьУсловие, РазобратьФункцию, РазобратьВыбор. +// +// Параметры: +// Условие - см. ТаблицаНаборовСимволов +// Процедура РазобратьВыражение(Условие, Состав, ТекущийКонтекст, ВложенноеВыражение = Истина) ФиксированныйКонтекст = Новый ФиксированнаяСтруктура(ТекущийКонтекст); @@ -33995,7 +36132,7 @@ // И, Или, Как, Кроме, Только, Есть и любая операция =, <>, ... // Ключевое слово В разбирается отдельно в процедуре "РазобратьОперациюВ". - Строка = Контекст.Строка; + Строка = Контекст.Строка; // СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов НовоеОписание = Новый Структура("Источник, Узел", Строка, ?(Строка.Вид = "Операция", Строка.Символы, Строка.Уточнение)); @@ -34049,7 +36186,8 @@ // Ошибка отсутствия параметров уже установлена в функции ФункцииСВыражениямиВСкобках. Для Каждого ОписаниеПараметра Из СоставПараметров Цикл - Для Каждого Подстрока Из ОписаниеПараметра.Строки Цикл + СтрокиОписанияПараметра = ОписаниеПараметра.Строки; // см. ТаблицаНаборовСимволов + Для Каждого Подстрока Из СтрокиОписанияПараметра Цикл РазобратьЗначениеСоединителяВ(Контекст, Подстрока, НовоеОписание); @@ -34313,6 +36451,11 @@ КонецПроцедуры // Для процедуры РазобратьПараметрыПроверочнойФункции. +// +// Параметры: +// ПервыйПараметр - Структура: +// * Строки - см. ТаблицаНаборовСимволов +// Процедура РазобратьПервыйПараметрПроверочнойФункции(Контекст, ПервыйПараметр, НовоеОписание) Если ПервыйПараметр.Строки[0].Вид = "Имя" Тогда @@ -34415,6 +36558,11 @@ КонецПроцедуры // Для процедуры РазобратьПараметрыПроверочнойФункции. +// +// Параметры: +// Параметр - Структура: +// * Строки - см. ТаблицаНаборовСимволов +// Процедура РазобратьДополнительныйПараметрПроверочнойФункции(Контекст, Параметр, НовоеОписание) Если Параметр.Строки[0].Вид = "Имя" @@ -34778,6 +36926,10 @@ // РазобратьПараметрыФункцииЗначениеИлиФункцииТип, РазобратьПараметрыФункцииТипЗначения и // для функций ОписаниеУзлаПолеИзФункцииВыразить, ОписаниеУзлаПолеИзФункцииЕстьNull. // +// Возвращаемое значение: +// Массив из Структура: +// * Строки - см. ТаблицаНаборовСимволов +// Функция ПараметрыРазделенныеЗапятыми(Строка) СоставПараметров = Новый Массив; @@ -34829,6 +36981,12 @@ КонецФункции // Для процедуры РазобратьВыражение. +// +// Параметры: +// Контекст - Структура: +// * Строка - Структура: +// ** Строки - см. ТаблицаНаборовСимволов +// Процедура РазобратьВыбор(Контекст) Строка = Контекст.Строка; @@ -34839,7 +36997,7 @@ ПропуститьАнализКогда = Ложь; - Выбор = Строка.Строки[0]; + Выбор = Строка.Строки[0]; // см. ДополнительнаяСтрока Если Выбор.Строки.Количество() > 0 Тогда Если Выбор.Строки[0].Вид = "Имя" Тогда НовоеОписание.Выбор = ОписаниеУзлаПолеИлиУзлаКонстанта(Выбор.Строки[0]); @@ -34857,7 +37015,7 @@ НовоеОписаниеКогда = НовоеОписание.Когда; // Массив НовоеОписаниеКогда.Добавить(ОписаниеКогдаТогда); - Когда = Строка.Строки[Индекс]; + Когда = Строка.Строки[Индекс]; // СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов Если Не ПропуститьАнализКогда Тогда Если НовоеОписание.Выбор = Неопределено Тогда @@ -35074,6 +37232,10 @@ КонецФункции // Для процедуры РазобратьУсловие. +// +// Параметры: +// Строки - см. ТаблицаНаборовСимволов +// Функция ВыраженияВыборКогдаТогдаВоВложениях(Строки, Контекст) Результат = Новый Массив; @@ -35257,6 +37419,10 @@ КонецФункции // Для процедуры РазобратьУсловие. +// +// Параметры: +// Строки - см. ТаблицаНаборовСимволов +// Функция ФункцииСВыражениямиВСкобках(Строки, ВнутренниеДанные) Результат = Новый Массив; @@ -35265,7 +37431,7 @@ Строка = Неопределено; Индекс = 0; Пока Индекс < КоличествоСтрок Цикл - ПредыдущаяСтрока = Строка; + ПредыдущаяСтрока = Строка; // СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов Строка = Строки[Индекс]; Если Строка.Символы = "(" Тогда @@ -35403,14 +37569,34 @@ // Для процедур ОбработатьПропущеннуюЛогическуюОперацию, ВыраженияВыборКогдаТогдаВоВложениях, // ВосстановитьСтруктуруВыбора и для функции ПараметрыРазделенныеЗапятыми. // +// Возвращаемое значение: +// Структура: +// * Символы - Строка +// * Вид - Строка +// * Тип - Строка +// * Приоритет - Число +// * Уточнение - Строка +// * ИсходнаяСтрока - Структура: +// ** Строки - Массив из см. ТаблицаНаборовСимволов +// ** Уточнение - Строка +// * Строки - Массив из см. ТаблицаНаборовСимволов +// * КонечнаяСтрока - СтрокаТаблицыЗначений: см. ТаблицаНаборовСимволов +// * ПозицияОшибки - Число +// * ТекстОшибки - Строка +// Функция ДополнительнаяСтрока(Строка, Уточнение = "", Контекст = Неопределено) - Поля = "Символы, Вид, Тип, Приоритет, Уточнение, ИсходнаяСтрока, Строки, КонечнаяСтрока, ПозицияОшибки, ТекстОшибки"; - - НоваяСтрока = Новый Структура(Поля); - НоваяСтрока.Уточнение = Уточнение; - НоваяСтрока.Строки = Новый Массив; - НоваяСтрока.ИсходнаяСтрока = Строка; + НоваяСтрока = Новый Структура; + НоваяСтрока.Вставить("Символы"); + НоваяСтрока.Вставить("Вид"); + НоваяСтрока.Вставить("Тип"); + НоваяСтрока.Вставить("Приоритет"); + НоваяСтрока.Вставить("Уточнение", Уточнение); + НоваяСтрока.Вставить("ИсходнаяСтрока", Строка); + НоваяСтрока.Вставить("Строки", Новый Массив); + НоваяСтрока.Вставить("КонечнаяСтрока"); + НоваяСтрока.Вставить("ПозицияОшибки"); + НоваяСтрока.Вставить("ТекстОшибки"); СвойстваСлова = ?(Контекст = Неопределено, Неопределено, Контекст.СинтаксисЯзыка.СловаЯзыка.Получить(ВРег(Уточнение))); @@ -35426,6 +37612,10 @@ КонецФункции // Для процедур РазобратьДополнительныеТаблицы, РазобратьУсловиеОграничения. +// +// Параметры: +// СтрокиЧасти - см. ТаблицаНаборовСимволов +// Процедура ИзменитьВидКлючевогоСловаСписокНаИмя(СтрокиЧасти, ИсключаемаяСтрока = Неопределено) Для Каждого Строка Из СтрокиЧасти Цикл @@ -35441,6 +37631,10 @@ КонецПроцедуры // Для процедур РазобратьДополнительныеТаблицы, РазобратьСоединение. +// +// Параметры: +// СтрокиЧасти - см. ТаблицаНаборовСимволов +// Процедура УстановитьПсевдоним(СтрокаЧасти, ОписаниеСоединения, ВнутренниеДанные) Если ЗначениеЗаполнено(СтрокаЧасти.ТекстОшибки) Тогда @@ -35473,6 +37667,10 @@ КонецПроцедуры // Для процедуры РазобратьСоединение. +// +// Параметры: +// СтрокиЧасти - см. ТаблицаНаборовСимволов +// Процедура УстановитьИмяТаблицы(СтрокаЧасти, ОписаниеСоединения, ВнутренниеДанные) Если ЗначениеЗаполнено(СтрокаЧасти.ТекстОшибки) Тогда @@ -36460,11 +38658,16 @@ КонецПроцедуры // Для процедуры ПроверитьТаблицыПоляИТипыПолей. +// +// Параметры: +// ПоляТаблицы - см. НовыйСоставКоллекции +// Процедура ПроверитьПредопределенныеЗначенияТаблицы(ПоляТаблицы, Контекст) СвойстваТипаТаблиц = Контекст.СвойстваТипаТаблиц; - Если ПоляТаблицы.Значение.Предопределенные.Количество() = 0 Тогда + СвойстваТаблицы = ПоляТаблицы.Значение; // см. НовыеСвойстваТаблицы + Если СвойстваТаблицы.Предопределенные.Количество() = 0 Тогда Возврат; КонецЕсли; @@ -36487,7 +38690,7 @@ ИменаПредопределенных.Добавить("ПустаяСсылка"); ИменаПредопределенных.Добавить("EmptyRef"); - Для Каждого Предопределенный Из ПоляТаблицы.Значение.Предопределенные Цикл + Для Каждого Предопределенный Из СвойстваТаблицы.Предопределенные Цикл Для Каждого ИмяПредопределенного Из ИменаПредопределенных Цикл Если ВРег(ИмяПредопределенного) = Предопределенный.Ключ Тогда Предопределенный.Значение.ИмяСуществует = Истина; @@ -36504,7 +38707,7 @@ Для Каждого ТипТаблиц Из ПоляТаблиц Цикл Для Каждого ОписаниеТаблицы Из ТипТаблиц.Значение Цикл - СвойстваТаблицы = ОписаниеТаблицы.Значение; + СвойстваТаблицы = ОписаниеТаблицы.Значение; // см. НовыеСвойстваТаблицы Если Не СвойстваТаблицы.ТаблицаСуществует Тогда Для Каждого Источник Из СвойстваТаблицы.Источники Цикл @@ -36713,7 +38916,12 @@ ОбновитьПрогресс(Контекст); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); - Контекст.Вставить("ТекстОшибки", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); + Если ЭтоОшибкаПроверкиАктуальностиМетаданных(ИнформацияОбОшибке) Тогда + ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + Иначе + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + КонецЕсли; + Контекст.Вставить("ТекстОшибки", ТекстОшибки); КонецПопытки; ПоместитьВоВременноеХранилище(Контекст, АдресРезультата); @@ -37950,20 +40158,17 @@ Если ЗначениеЗаполнено(СвойстваОграничения.ИмяОтдельногоРегистраКлючей) Тогда ИмяРегистраКлючей = СвойстваОграничения.ИмяОтдельногоРегистраКлючей; - МаксимальноеКоличествоПолей = - УправлениеДоступомСлужебныйПовтИсп.КоличествоОпорныхПолейРегистра(ИмяРегистраКлючей); Иначе ИмяРегистраКлючей = "КлючиДоступаКРегистрам"; - МаксимальноеКоличествоПолей = УправлениеДоступомСлужебныйПовтИсп.КоличествоОпорныхПолейРегистра(); ИмяПараметра = "ИдентификаторРегистра" + Формат(Индекс, "ЧГ="); УсловиеСоединения = "(КлючиДоступаКРегистрам.Регистр = &" + ИмяПараметра + ")"; ОписаниеЗапроса.Запрос.УстановитьПараметр(ИмяПараметра, Строка.Список); КонецЕсли; ОпорныеПоля = СвойстваОграничения.ОпорныеПоля; - ОтборПоТипуПользователей = ?(ДляВнешнихПользователей, "ИСТИНА", "ЛОЖЬ"); + ОтборПоТипуПользователей = XMLСтрока(СвойстваОграничения.ВариантДоступа); УсловиеСоединения = УсловиеСоединения + ?(УсловиеСоединения = "", "", " - | И ") + "(КлючиДоступаКРегистрам.ДляВнешнихПользователей = " + ОтборПоТипуПользователей + ")"; + | И ") + "(КлючиДоступаКРегистрам.ВариантДоступа = " + ОтборПоТипуПользователей + ")"; НомерПоля = 1; Для Каждого ИмяПоля Из ОпорныеПоля.Используемые Цикл @@ -38000,12 +40205,6 @@ УсловиеОтбора = УсловиеОтбора + ")"; КонецЕсли; - НачальныйНомер = НомерПоля + 1; - Для НомерПоля = НачальныйНомер По МаксимальноеКоличествоПолей Цикл - УсловиеСоединения = УсловиеСоединения + ?(УсловиеСоединения = "", "", " - | И ") + "(КлючиДоступаКРегистрам.Поле" + НомерПоля + " = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.Null))"; - КонецЦикла; - Если ВидКлючаДанных = "ЭлементыБезКлючейПоПериоду" Тогда ИмяПоляПериода = ?(СвойстваТипа.ИмяКоллекции = "РегистрыРасчета", "ПериодРегистрации", "Период"); ИмяПараметра = ИмяПоляПериода + Формат(Индекс, "ЧГ="); @@ -38025,7 +40224,7 @@ | ПО (&УсловиеСоединения) |ГДЕ | &УсловиеОтбора - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL"; + | И КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL"; Иначе ТекстЗапроса = "ВЫБРАТЬ @@ -38039,7 +40238,7 @@ | ПО (&УсловиеСоединения) | ГДЕ | &УсловиеОтбора - | И КлючиДоступаКРегистрам.ДляВнешнихПользователей ЕСТЬ NULL) КАК Комбинации"; + | И КлючиДоступаКРегистрам.ВариантДоступа ЕСТЬ NULL) КАК Комбинации"; ПоляВыбора = ТекстСОтступом(ПоляВыбора, " "); УсловиеОтбора = ТекстСОтступом(УсловиеОтбора, " "); КонецЕсли; diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl index 524789006..0c375995f 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl @@ -48,9 +48,7 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем конфигурации. -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить(Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа.Имя); diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl index c7325d801..237ddbbec 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl @@ -417,6 +417,30 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий общей формы ФормаОтчета. +// Обработчик двойного щелчка мыши, нажатия клавиши Enter или гиперссылки в табличном документе формы отчета. +// См. "Расширение поля формы для поля табличного документа.Выбор" в синтакс-помощнике. +// +// Параметры: +// ФормаОтчета - ФормаКлиентскогоПриложения - форма отчета. +// Элемент - ПолеФормы - табличный документ. +// Область - ОбластьЯчеекТабличногоДокумента - выбранное значение. +// СтандартнаяОбработка - Булево - признак выполнения стандартной обработки события. +// +Процедура ОбработкаВыбораТабличногоДокумента(ФормаОтчета, Элемент, Область, СтандартнаяОбработка) Экспорт + + Если ФормаОтчета.НастройкиОтчета.ПолноеИмя <> "Отчет.АнализПравДоступа" Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Область) = Тип("ОбластьЯчеекТабличногоДокумента") + И Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Прямоугольник + И Область.Расшифровка <> Неопределено Тогда + + ФормаОтчета.ОбработкаРасшифровки = Истина; + КонецЕсли; + +КонецПроцедуры + // См. ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки Процедура ПриОбработкеРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт @@ -430,7 +454,7 @@ ПараметрыОтчета = Новый Структура; ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина); ПараметрыОтчета.Вставить("Расшифровка", Расшифровка); - + Отбор = Новый Структура; Для Каждого Элемент Из ФормаОтчета.Отчет.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл Настройка = ФормаОтчета.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Элемент.ИдентификаторПользовательскойНастройки); diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl index 424a88392..4bc972ae8 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl @@ -584,7 +584,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * ТипПользователя - ОпределяемыйТип.Пользователь - тип назначения. // Функция НазначениеИзФормы(Форма) @@ -599,7 +599,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * ГруппаДоступа - СправочникСсылка.ГруппыДоступа // * ВидДоступа - ОпределяемыйТип.ЗначениеДоступа // * Предустановленный - Булево - (только для профиля) @@ -618,7 +618,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * ГруппаДоступа - СправочникСсылка.ГруппыДоступа // * ВидДоступа - ОпределяемыйТип.ЗначениеДоступа // * ЗначениеДоступа - ОпределяемыйТип.ЗначениеДоступа @@ -634,7 +634,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * Ссылка - ОпределяемыйТип.ЗначениеДоступа // * Представление - Строка // * Используется - Булево @@ -651,7 +651,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * Имя - Строка // * Представление - Строка // @@ -667,7 +667,7 @@ // См. УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений // // Возвращаемое значение: -// ДанныеФормыКоллекция Из ДанныеФормыЭлементКоллекции: +// ДанныеФормыКоллекция из ДанныеФормыЭлементКоллекции: // * ВидДоступа - ОпределяемыйТип.ЗначениеДоступа // * ТипЗначений - ОпределяемыйТип.ЗначениеДоступа // * ПредставлениеТипа - Строка diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl index 2a1238d6b..1859c9c11 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl @@ -129,7 +129,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Булево - Истина // @@ -158,7 +158,7 @@ // строки начала имени подписки. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Булево // @@ -230,7 +230,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - ЛюбаяСсылка // @@ -254,7 +254,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Строка // @@ -290,7 +290,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Строка // @@ -399,7 +399,7 @@ КонецФункции // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Массив из СправочникСсылка // @@ -433,7 +433,7 @@ КонецФункции // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Тип // * Значение - Булево // @@ -474,13 +474,13 @@ // Возвращаемое значение: // Структура: -// * ВедущиеСпискиПроверенные - Соответствие: +// * ВедущиеСпискиПроверенные - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. УправлениеДоступомСлужебный.СвойстваСпискаКакВедущего -// * ОграниченияСписков - Соответствие: +// * ОграниченияСписков - Соответствие из КлючИЗначение: // ** Ключ - Строка - полное имя списка // ** Значение - см. УправлениеДоступомСлужебный.РассчитанныеПараметрыОграничения -// * ИдентификаторыТранзакции - Соответствие: +// * ИдентификаторыТранзакции - Соответствие из КлючИЗначение: // ** Ключ - УникальныйИдентификатор - произвольный УИД. // ** Значение - Булево - значение Истина. // * ВсеВидыОграниченийПрав - Неопределено @@ -505,7 +505,7 @@ КонецФункции // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - полное имя списка (таблицы). // * Значение - Булево - Истина - текст ограничения в модуле менеджера, // Ложь - текст ограничения в этом переопределяемом @@ -662,32 +662,64 @@ КонецФункции -Функция КоличествоОпорныхПолейРегистра(ИмяРегистра = "") Экспорт +Функция КоличествоОпорныхПолейРегистра(Знач ИмяРегистра = "") Экспорт Если ИмяРегистра = "" Тогда - МетаданныеРегистраКлючей = Метаданные.РегистрыСведений.КлючиДоступаКРегистрам; + ИмяРегистра = "КлючиДоступаКРегистрам"; + Измерения = Метаданные.РегистрыСведений.КлючиДоступаКРегистрам.Измерения; + Если Измерения.Количество() < 1 Или Измерения[0].Имя <> "Регистр" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |первым измерением должно быть %2.'"), ИмяРегистра, "Регистр"); + КонецЕсли; + Если Измерения.Количество() < 2 Или Измерения[1].Имя <> "ВариантДоступа" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |вторым измерением должно быть %2.'"), ИмяРегистра, "ВариантДоступа"); + КонецЕсли; + ИндексИзмеренияПоля = 2; Иначе - МетаданныеРегистраКлючей = Метаданные.РегистрыСведений[ИмяРегистра]; + Измерения = Метаданные.РегистрыСведений[ИмяРегистра].Измерения; + Если Измерения.Количество() < 1 Или Измерения[0].Имя <> "ВариантДоступа" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |первым измерением должно быть %2.'"), ИмяРегистра, "ВариантДоступа"); + КонецЕсли; + ИндексИзмеренияПоля = 1; + КонецЕсли; + + ВариантДоступаТип = Измерения.ВариантДоступа.Тип; + + Если ВариантДоступаТип.Типы().Количество() <> 1 + Или Не ВариантДоступаТип.СодержитТип(Тип("Число")) + Или ВариантДоступаТип.КвалификаторыЧисла.ДопустимыйЗнак <> ДопустимыйЗнак.Неотрицательный + Или ВариантДоступаТип.КвалификаторыЧисла.Разрядность <> 4 + Или ВариантДоступаТип.КвалификаторыЧисла.РазрядностьДробнойЧасти <> 0 Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |измерение %2 должно иметь тип Число(4,0,Неотрицательное).'"), + ИмяРегистра, "ВариантДоступа"); + КонецЕсли; + + Если Измерения.Количество() <= ИндексИзмеренияПоля + Или Измерения[ИндексИзмеренияПоля].Имя <> "Поле1" Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |после измерения %2 должно быть %3.'"), ИмяРегистра, "ВариантДоступа", "Поле1"); КонецЕсли; ПоследнийНомерПоля = 0; - Для Каждого Измерение Из МетаданныеРегистраКлючей.Измерения Цикл - Если Измерение.Имя = "Регистр" Тогда - Если ИмяРегистра = "" Тогда - Продолжить; - КонецЕсли; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В отдельном регистре сведений %1 - |не должно быть измерения %2.'"), ИмяРегистра, "Регистр"); - КонецЕсли; - Если Измерение.Имя = "ДляВнешнихПользователей" Тогда + Для Каждого Измерение Из Измерения Цикл + Если Измерение.Имя = "Регистр" Или Измерение.Имя = "ВариантДоступа" Тогда Продолжить; КонецЕсли; - Если СтрДлина(Измерение.Имя) <> 5 Или Не СтрНачинаетсяС(Измерение.Имя, "Поле") Тогда - Прервать; - КонецЕсли; - Если Прав(Измерение.Имя, 1) <> XMLСтрока(ПоследнийНомерПоля + 1) Тогда - Прервать; + ИмяПоля = "Поле" + XMLСтрока(ПоследнийНомерПоля + 1); + Если Измерение.Имя <> ИмяПоля Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В регистре сведений %1 + |измерения вида %2<номер> должны идти по порядку + |а на месте измерения %3 обнаружено %4'"), ИмяРегистра, "Поле", ИмяПоля, Измерение.Имя); КонецЕсли; ПоследнийНомерПоля = ПоследнийНомерПоля + 1; КонецЦикла; @@ -854,7 +886,7 @@ Функция ПоляВРегистреСимволовМетаданных(ПолноеИмя, Поля) Экспорт СхемаЗапроса = Новый СхемаЗапроса; - СхемаЗапроса.УстановитьТекстЗапроса("ВЫБРАТЬ * ИЗ " + ПолноеИмя); + СхемаЗапроса.УстановитьТекстЗапроса(СтрЗаменить("ВЫБРАТЬ * ИЗ &ИмяТаблицы", "&ИмяТаблицы", ПолноеИмя)); ПоляВМетаданных = Новый Соответствие; Для Каждого Колонка Из СхемаЗапроса.ПакетЗапросов[0].Колонки Цикл diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl index 405cefc0f..995b943af 100644 --- a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl @@ -67,10 +67,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -100,9 +96,7 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ОбновлениеАгрегатов"); @@ -111,10 +105,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. -// // Параметры: -// ТекущиеДела - см. ТекущиеДелаСлужебный.ТекущиеДела +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт Если Не РежимРаботыЛокальныйФайловый() Тогда diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl index a0910700b..b6bd17db8 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -14,31 +14,40 @@ // Возвращает таблицу, содержащую контактную информацию нескольких объектов. // // Параметры: -// СсылкиИлиОбъекты - Массив - владельцы контактной информации. -// ТипыКонтактнойИнформации - Массив -// - ПеречислениеСсылка.ТипыКонтактнойИнформации - если указаны, то будет получена -// контактная информация только этих типов. -// ВидыКонтактнойИнформации - Массив -// - СправочникСсылка.ВидыКонтактнойИнформации - если указаны, то будет возвращена -// контактная информация только этих видов контактной информации. -// Дата - Дата - необязательный, дата с которой действует запись контактной информации, -// используется при хранении истории изменения контактной информации. -// Если владелец хранит историю изменений, то при несоответствии параметра -// дате будет вызвано исключение. +// Источник - Массив - владельцы контактной информации. +// Отбор - см. ОтборКонтактнойИнформации. // // Возвращаемое значение: -// ТаблицаЗначений - таблица с контактной информацией объектов содержащая колонки: -// * Объект - Ссылка - владелец контактной информации. -// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. -// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. -// * Значение - Строка - контактная информация во внутреннем формате JSON. -// * Представление - Строка - представление контактной информации. -// * Дата - Дата - дата, с которой действует запись контактной информации. -// * ИдентификаторСтрокиТабличнойЧасти - Число - идентификатор строки этой табличной части -// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для -// обратной совместимости. +// ТаблицаЗначений - контактная информация объектов: +// * Объект - ЛюбаяСсылка - владелец контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. +// * Значение - Строка - контактная информация во внутреннем формате JSON. +// * Представление - Строка - представление контактной информации. +// * Дата - Дата - дата, с которой действует запись контактной информации. +// * ИдентификаторСтрокиТабличнойЧасти - Число - идентификатор строки этой табличной части +// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для +// обратной совместимости. // -Функция КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, Знач ТипыКонтактнойИнформации = Неопределено, Знач ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт +Функция КонтактнаяИнформация(Источник, Отбор) Экспорт + + Перем ТипыКонтактнойИнформации, ВидыКонтактнойИнформации, Дата; + + Если ТипЗнч(Источник) = Тип("Массив") Тогда + СсылкиИлиОбъекты = Источник; + Иначе + СсылкиИлиОбъекты = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Источник); + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор.ТипыКонтактнойИнформации) Тогда + ТипыКонтактнойИнформации = Отбор.ТипыКонтактнойИнформации; + КонецЕсли; + + Если ЗначениеЗаполнено(Отбор.ВидыКонтактнойИнформации) Тогда + ВидыКонтактнойИнформации = Отбор.ВидыКонтактнойИнформации; + КонецЕсли; + + Дата = Отбор.Дата; Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; @@ -86,10 +95,93 @@ КонецЕсли; КонецЦикла; + КодЯзыка = СтрРазделить(Отбор.КодЯзыка, "_", Истина)[0]; + Если ЗначениеЗаполнено(КодЯзыка) И КодЯзыка <> ОбщегоНазначения.КодОсновногоЯзыка() Тогда + Для Каждого СтрокаТаблицы Из Результат Цикл + Если СтрокаТаблицы.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + СтрокаТаблицы.Представление = СтроковыеФункции.СтрокаЛатиницей(СтрокаТаблицы.Представление); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Возврат Результат; КонецФункции +// Конструктор параметра Отбор для функции КонтактнаяИнформация. +// +// Возвращаемое значение: +// Структура: +// * ТипыКонтактнойИнформации - Массив из ПеречислениеСсылка.ТипыКонтактнойИнформации - отбор по типу контактной информации. +// * ВидыКонтактнойИнформации - Массив из СправочникСсылка.ВидыКонтактнойИнформации - отбор по видам контактной информации. +// * Дата - Дата - дата с которой действует запись контактной информации, используется при хранении +// истории изменения контактной информации. Если владелец хранит историю изменений, +// то при несоответствии параметра дате будет вызвано исключение. +// * КодЯзыка - Строка - код языка, на котором необходимо получить представление контактной информации. +// Представления контактной информации типа Адрес будет получено путем транслитерации, на остальные +// типы контактной информации данных параметр не влияет. +// +Функция ОтборКонтактнойИнформации() Экспорт + + Отбор = Новый Структура; + Отбор.Вставить("ТипыКонтактнойИнформации", Новый Массив); + Отбор.Вставить("ВидыКонтактнойИнформации", Новый Массив); + Отбор.Вставить("Дата"); + Отбор.Вставить("КодЯзыка"); + + Возврат Отбор; + +КонецФункции + +// Возвращает таблицу, содержащую контактную информацию нескольких объектов. +// +// Параметры: +// СсылкиИлиОбъекты - Массив - владельцы контактной информации. +// ТипыКонтактнойИнформации - Массив +// - ПеречислениеСсылка.ТипыКонтактнойИнформации - если указаны, то будет получена +// контактная информация только этих типов. +// ВидыКонтактнойИнформации - Массив +// - СправочникСсылка.ВидыКонтактнойИнформации - если указаны, то будет возвращена +// контактная информация только этих видов контактной информации. +// Дата - Дата - дата с которой действует запись контактной информации, +// используется при хранении истории изменения контактной информации. +// Если владелец хранит историю изменений, то при несоответствии параметра +// дате будет вызвано исключение. +// +// Возвращаемое значение: +// ТаблицаЗначений - таблица с контактной информацией объектов содержащая колонки: +// * Объект - ЛюбаяСсылка - владелец контактной информации. +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. +// * Значение - Строка - контактная информация во внутреннем формате JSON. +// * Представление - Строка - представление контактной информации. +// * Дата - Дата - дата, с которой действует запись контактной информации. +// * ИдентификаторСтрокиТабличнойЧасти - Число - идентификатор строки этой табличной части +// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для +// обратной совместимости. +// +Функция КонтактнаяИнформацияОбъектов(СсылкиИлиОбъекты, Знач ТипыКонтактнойИнформации = Неопределено, Знач ВидыКонтактнойИнформации = Неопределено, Дата = Неопределено) Экспорт + + Отбор = ОтборКонтактнойИнформации(); + + Если ТипЗнч(ТипыКонтактнойИнформации) = Тип("Массив") Тогда + Отбор.ТипыКонтактнойИнформации = ТипыКонтактнойИнформации; + ИначеЕсли ЗначениеЗаполнено(ТипыКонтактнойИнформации) Тогда + Отбор.ТипыКонтактнойИнформации.Добавить(ТипыКонтактнойИнформации); + КонецЕсли; + + Если ТипЗнч(ВидыКонтактнойИнформации) = Тип("Массив") Тогда + Отбор.ВидыКонтактнойИнформации = ВидыКонтактнойИнформации; + ИначеЕсли ЗначениеЗаполнено(ВидыКонтактнойИнформации) Тогда + Отбор.ВидыКонтактнойИнформации.Добавить(ВидыКонтактнойИнформации); + КонецЕсли; + + Отбор.Дата = Дата; + + Возврат КонтактнаяИнформация(СсылкиИлиОбъекты, Отбор); + +КонецФункции + // Возвращает таблицу, содержащую контактную информацию объекта. // Поведение, при котором возвращалось представление контактной информации, теперь считается устаревшим // и сохранено для обратной совместимости. Для получения представления контактной информации рекомендуется @@ -99,8 +191,9 @@ // СсылкаИлиОбъект - ЛюбаяСсылка // - Объект - ссылка или объект-владелец контактной информации (организация, // контрагент, партнер и т.д.). -// ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - необязательный, отбор по виду контактной информации. -// Дата - Дата - необязательный, дата с которой действует запись контактной информации, +// ВидИлиТипКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации - отбор по виду контактной информации. +// - ПеречислениеСсылка.ТипыКонтактнойИнформации - отбор по типу контактной информации. +// Дата - Дата - дата с которой действует запись контактной информации, // используется при хранении истории изменения контактной информации. // Если владелец хранит историю изменений, то при несоответствии параметра // дате будет вызвано исключение. @@ -109,7 +202,7 @@ // // Возвращаемое значение: // ТаблицаЗначений - таблица с контактной информацией объекта содержащая колонки: -// * Объект - Ссылка - владелец контактной информации. +// * Объект - ЛюбаяСсылка - владелец контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. // * Значение - Строка - контактная информация во внутреннем формате JSON. @@ -119,7 +212,15 @@ // * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для // обратной совместимости. // -Функция КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидКонтактнойИнформации = Неопределено, Дата = Неопределено, ТолькоПредставление = Истина) Экспорт +Функция КонтактнаяИнформацияОбъекта(СсылкаИлиОбъект, ВидИлиТипКонтактнойИнформации = Неопределено, Дата = Неопределено, ТолькоПредставление = Истина) Экспорт + + ТипКонтактнойИнформации = Неопределено; + ВидКонтактнойИнформации = Неопределено; + Если ТипЗнч(ВидИлиТипКонтактнойИнформации) = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + ТипКонтактнойИнформации = ВидИлиТипКонтактнойИнформации; + ИначеЕсли ТипЗнч(ВидИлиТипКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ВидКонтактнойИнформации = ВидИлиТипКонтактнойИнформации; + КонецЕсли; ТипОбъекта = ТипЗнч(СсылкаИлиОбъект); Если НЕ ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда @@ -128,15 +229,16 @@ Если СодержитКонтактнуюИнформацию(ТипОбъекта) Тогда Для каждого СтрокаКонтактнойИнформации Из СсылкаИлиОбъект.КонтактнаяИнформация Цикл - Если ВидКонтактнойИнформации = Неопределено + Если ВидИлиТипКонтактнойИнформации = Неопределено + ИЛИ СтрокаКонтактнойИнформации.Тип = ТипКонтактнойИнформации ИЛИ СтрокаКонтактнойИнформации.Вид = ВидКонтактнойИнформации Тогда - НоваяСтрока = Результат.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКонтактнойИнформации); - Если ПустаяСтрока(НоваяСтрока.Значение) - И ЗначениеЗаполнено(НоваяСтрока.ЗначенияПолей) Тогда - НоваяСтрока.Значение = КонтактнаяИнформацияВJSON(НоваяСтрока.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип); - КонецЕсли; - НоваяСтрока.Объект = СсылкаИлиОбъект; + НоваяСтрока = Результат.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаКонтактнойИнформации); + Если ПустаяСтрока(НоваяСтрока.Значение) + И ЗначениеЗаполнено(НоваяСтрока.ЗначенияПолей) Тогда + НоваяСтрока.Значение = КонтактнаяИнформацияВJSON(НоваяСтрока.ЗначенияПолей, СтрокаКонтактнойИнформации.Тип); + КонецЕсли; + НоваяСтрока.Объект = СсылкаИлиОбъект; КонецЕсли; КонецЦикла; @@ -158,11 +260,11 @@ МассивОбъектов = Новый Массив; МассивОбъектов.Добавить(СсылкаИлиОбъект.Ссылка); - Если НЕ ЗначениеЗаполнено(ВидКонтактнойИнформации) Тогда + Если НЕ ЗначениеЗаполнено(ВидИлиТипКонтактнойИнформации) Тогда Возврат ""; КонецЕсли; - КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов,, ВидКонтактнойИнформации, Дата); + КонтактнаяИнформацияОбъекта = КонтактнаяИнформацияОбъектов(МассивОбъектов, ТипКонтактнойИнформации, ВидКонтактнойИнформации, Дата); Если КонтактнаяИнформацияОбъекта.Количество() > 0 Тогда Возврат КонтактнаяИнформацияОбъекта[0].Представление; @@ -173,12 +275,17 @@ СсылкиИлиОбъекты = Новый Массив; СсылкиИлиОбъекты.Добавить(СсылкаИлиОбъект); - Если ТипЗнч(ВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + Если ТипКонтактнойИнформации <> Неопределено Тогда + ТипыКонтактнойИнформации = Новый Массив; + ТипыКонтактнойИнформации.Добавить(ТипКонтактнойИнформации); + ВидыКонтактнойИнформации = Неопределено; + ИначеЕсли ВидКонтактнойИнформации <> Неопределено Тогда ВидыКонтактнойИнформации = Новый Массив; ВидыКонтактнойИнформации.Добавить(ВидКонтактнойИнформации); ТипыКонтактнойИнформации = Новый Массив; ТипыКонтактнойИнформации.Добавить(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидКонтактнойИнформации, "Тип")); Иначе + ТипыКонтактнойИнформации = Неопределено; ВидыКонтактнойИнформации = Неопределено; КонецЕсли; @@ -390,6 +497,8 @@ // владелец будет записан. Если передан объект, то контактная информация будет // добавлена без записи. Для сохранения изменений объект необходимо будет // записать отдельно. +// - ДанныеФормыСтруктура: +// * Ссылка - СправочникСсылка - ссылка на объект-владельца контактной информации // КонтактнаяИнформация - ТаблицаЗначений - таблица, содержащая контактную информацию // Описание колонок см. функцию НоваяКонтактнаяИнформация. // Важно! Если передана пустая таблица значений и указан режим замещения, то @@ -931,7 +1040,7 @@ // Параметры: // МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - в менеджере создается временная таблица // ВТКонтактнаяИнформация с полями: -// * Объект - Ссылка - владелец контактной информации. +// * Объект - ЛюбаяСсылка - владелец контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на вид контактной информации. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. // * ЗначенияПолей - Строка - XML соответствующий XDTO пакету КонтактнаяИнформация или Адрес. @@ -966,7 +1075,7 @@ Запрос = Новый Запрос(); ТекстЗапросаПодготовкаДанных = ""; - СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ "; + СтрокаРАЗРЕШЕННЫЕ = " РАЗРЕШЕННЫЕ "; // @Query-part-1 СтрокаВременнойТаблицы = "ПОМЕСТИТЬ ВТКонтактнаяИнформация"; Для каждого ОбъектСКонтактнойИнформацией Из ОбъектыСГруппировкойПоТипам Цикл @@ -1021,13 +1130,13 @@ |требуется указывать дату, с которой действует запись контактной информации.'"); КонецЕсли; - УсловияОтбора = ?(ВидыКонтактнойИнформации = Неопределено, "", " КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)"); + УсловияОтбора = ?(ВидыКонтактнойИнформации = Неопределено, "", " КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)"); // @query-part-2 Если ПустаяСтрока(УсловияОтбора) Тогда УсловиеИ = ""; Иначе УсловиеИ = " И "; КонецЕсли; - УсловияОтбора = УсловияОтбора + ?(ТипыКонтактнойИнформации = Неопределено, "", УсловиеИ + " КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)"); + УсловияОтбора = УсловияОтбора + ?(ТипыКонтактнойИнформации = Неопределено, "", УсловиеИ + " КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)"); // @query-part-2 Если НЕ ПустаяСтрока(УсловияОтбора) Тогда УсловияОтбора = " ГДЕ " + УсловияОтбора; КонецЕсли; @@ -1067,9 +1176,14 @@ | КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) | И КонтактнаяИнформация.Тип <> ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ПустаяСсылка) | И КонтактнаяИнформация.Ссылка В (&МассивОбъектов" + ИмяТаблицы + ") - | " + ?(ТипыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)") + " - | " + ?(ВидыКонтактнойИнформации = Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)") + " + | И &УсловиеГдеТипКонтактнойИнформации + | И &УсловиеГдеВидКонтактнойИнформации |"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеГдеТипКонтактнойИнформации", + ?(ТипыКонтактнойИнформации = Неопределено, "ИСТИНА", "КонтактнаяИнформация.Тип В (&ТипыКонтактнойИнформации)")); // @query-part-2 + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеГдеВидКонтактнойИнформации", + ?(ВидыКонтактнойИнформации = Неопределено, "ИСТИНА", "КонтактнаяИнформация.Вид В (&ВидыКонтактнойИнформации)")); // @query-part-2 + КонецЕсли; СтрокаРАЗРЕШЕННЫЕ =""; СтрокаВременнойТаблицы = ""; @@ -1283,7 +1397,7 @@ // // Параметры: // КодИлиНаименование - Строка - код страны, код Альфа2, код Альфа3 или наименование страны, в т.ч. международное. -// ДанныеЗаполнения - Структура - необязательный. Данные для заполнения в случае создания нового элемента. +// ДанныеЗаполнения - Структура - данные для заполнения в случае создания нового элемента. // Ключи структуры соответствуют реквизитам справочника СтраныМира. // // Возвращаемое значение: @@ -1578,13 +1692,13 @@ | 0 КАК ИдентификаторСтрокиТабличнойЧасти, | ЛОЖЬ КАК ЭтоИсторическаяКонтактнаяИнформация |ИЗ - | &ПолноеИмяОбъектаМетаданных.КонтактнаяИнформация КАК КонтактнаяИнформация + | &ПутьКТаблицеКонтактнойИнформации КАК КонтактнаяИнформация | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации | ПО (КонтактнаяИнформация.Вид = ВидыКонтактнойИнформации.Ссылка) |ГДЕ | КонтактнаяИнформация.Ссылка = &Ссылка УПОРЯДОЧИТЬ ПО Вид, ДействуетС"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяОбъектаМетаданных", ПолноеИмяОбъектаМетаданных); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПутьКТаблицеКонтактнойИнформации", ПолноеИмяОбъектаМетаданных + ".КонтактнаяИнформация"); Если ЕстьКолонкаИдентификаторСтрокиТабличнойЧасти Тогда ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК ИдентификаторСтрокиТабличнойЧасти", @@ -1778,14 +1892,14 @@ ИменаТабличныхЧастейПоВидамКИ = Неопределено; Отбор = Новый Структура("ИмяЭлементаДляРазмещения", ИмяЭлементаДляРазмещения); - КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); Для Каждого РеквизитФормы Из КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл Если РеквизитФормы.ЭтоРеквизитТабличнойЧасти Тогда Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); - ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор, "Вид"); + ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор, "Вид"); ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта); КонецЕсли; @@ -1809,7 +1923,7 @@ КонецЕсли; КонецЦикла; Для Каждого РеквизитФормы Из КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл - Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Удалить(РеквизитФормы); + УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Удалить(РеквизитФормы); КонецЦикла; КонецЕсли; Форма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов); @@ -1843,7 +1957,7 @@ // Только для контактной информации в составе табличной части. Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); - СтрокиТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор); + СтрокиТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор); ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(СтрокиТабличнойЧасти, ИмяОбъекта); Для Каждого СтрокаТаблицы Из СтрокиТабличнойЧасти Цикл @@ -1891,7 +2005,7 @@ ИменаТабличныхЧастейПоВидамКИ = Неопределено; - Для Каждого СтрокаТаблицы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл + Для Каждого СтрокаТаблицы Из УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма) Цикл ВидИнформации = СтрокаТаблицы.Вид; ТипИнформации = СтрокаТаблицы.Тип; @@ -1904,7 +2018,7 @@ Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); - ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор , "Вид"); + ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор , "Вид"); ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъекта); КонецЕсли; @@ -2045,8 +2159,19 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - форма объекта-владельца, предназначенная для вывода контактной информации. -// Объект - Произвольный - объект-владелец контактной информации. -// Результат - Произвольный - необязательный служебный реквизит, полученный из предыдущего обработчика события. +// Объект - ДанныеФормыСтруктура - объект-владелец контактной информации. +// Результат - Неопределено - служебный реквизит, полученный из предыдущего обработчика события. +// - Структура: - набор свойств динамический: +// * ПоменятьМестамиЭлементы - Булево - если значения элементов меняются местами. +// * ПервыйЭлемент - Строка - если значения элементов меняются местами. +// * ВторойЭлемент - Строка - если значения элементов меняются местами. +// * ОбновитьКонтекстноеМеню - Булево - если выполняется обновление меню +// * ИмяРеквизита - Строка - если выполняется обновление меню +// * ДобавляемыйВид - Булево - при добавлении нового элемента +// * ЭтоДобавлениеКомментария - Булево - при добавлении комментария +// * ОбновитьКонтекстноеМеню - Булево - при обновлении контекстного меню +// * ИмяЭлементаДляРазмещения - Строка - если добавляет новый элемент, комментарий или обновляется контекстное меню +// * Комментарий - Строка - при обновлении контекстного меню // // Возвращаемое значение: // Неопределено - значение не используется, обратная совместимость. @@ -2064,7 +2189,7 @@ ИначеЕсли Результат.Свойство("ПоменятьМестамиЭлементы") Тогда Отбор = Новый Структура("ИмяРеквизита", Результат.ПервыйЭлемент); - ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); ПервыйЭлемент = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0]; Отбор = Новый Структура("ИмяРеквизита", Результат.ВторойЭлемент); ВторойЭлемент = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0]; @@ -2091,7 +2216,7 @@ ОбновитьКонтекстноеМеню(Форма, Результат.ИмяЭлементаДляРазмещения); Если Результат.Свойство("ИмяРеквизита") Тогда - ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); Отбор = Новый Структура("ИмяРеквизита", Результат.ИмяРеквизита); НайденнаяСтрока = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0]; Если УправлениеКонтактнойИнформациейКлиентСервер.ЭтоКонтактнаяИнформацияВJSON(НайденнаяСтрока.Значение) Тогда @@ -2175,8 +2300,8 @@ ПараметрыКонтактнойИнформации = ПараметрыКонтактнойИнформацииФормы(Форма.ПараметрыКонтактнойИнформации, ИмяЭлементаДляРазмещения); - КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(, "Вид, Представление, Значение, Комментарий"); - Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Очистить(); + КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(, "Вид, Представление, Значение, Комментарий"); + УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Очистить(); ПоложениеЗаголовкаКИ = ?(ЗначениеЗаполнено(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПредопределенноеЗначение(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка), ПоложениеЗаголовкаЭлементаФормы.Лево); ПриСозданииНаСервере(Форма, Объект, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ПараметрыКонтактнойИнформации.ИсключаемыеВиды); @@ -2185,7 +2310,7 @@ Для Каждого ВидКонтактнойИнформации Из ПараметрыКонтактнойИнформации.ИсключаемыеВиды Цикл Отбор = Новый Структура("Вид", ВидКонтактнойИнформации); - МассивСтрок = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + МассивСтрок = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); Если МассивСтрок.Количество() > 0 Тогда СохраненноеЗначение = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор)[0]; @@ -2796,8 +2921,8 @@ // Параметры: // Объект - ЛюбаяСсылка - ссылка на объект конфигурации, содержащий табличную часть контактная информация. // Значение - Строка - контактная информация в внутреннем формате JSON. -// ВидИнформации - Справочник.ВидыКонтактнойИнформация - ссылка на вид контактной информации. -// ТипИнформации - Перечисление.ТипыКонтактнойИнформация - тип контактной информации. +// ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на вид контактной информации. +// ТипИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. // ИдентификаторСтроки - Число - идентификатор строки табличной части. // Дата - Дата - дата, с которой действует запись контактной информации, // используется при хранении истории изменения контактной информации. @@ -2861,7 +2986,7 @@ // // Параметры: // Параметры - Структура - параметры обработчика обновления. -// РазмерПорции - Число - необязательный параметр, размер порции обрабатываемых данных за один запуск. +// РазмерПорции - Число - размер порции обрабатываемых данных за один запуск. // Процедура ОбновитьКонтактнуюИнформациюДляСписковОтложенно(Параметры, РазмерПорции = 1000) Экспорт @@ -2894,7 +3019,7 @@ | КОЛИЧЕСТВО(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Количество, | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка) КАК Ссылка |ИЗ - | %1.%2 КАК ТаблицаСКонтактнойИнформацией + | &ТаблицаСКонтактнойИнформацией КАК ТаблицаСКонтактнойИнформацией | СГРУППИРОВАТЬ ПО | ТИПЗНАЧЕНИЯ(ТаблицаСКонтактнойИнформацией.Ссылка)"; @@ -2905,7 +3030,8 @@ Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда КонтактнаяИнформация = Метаданные.Справочники[ИмяОбъекта].ТабличныеЧасти.КонтактнаяИнформация; Если КонтактнаяИнформация.Реквизиты.Найти("ВидДляСписка") <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + Разделитель + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, "Справочник", ИмяОбъекта); + ТекстЗапроса = ТекстЗапроса + Разделитель + + СтрЗаменить(ШаблонЗапроса, "&ТаблицаСКонтактнойИнформацией", "Справочник." + ИмяОбъекта); Разделитель = " ОБЪЕДИНИТЬ ВСЕ "; КонецЕсли; КонецЕсли; @@ -2915,7 +3041,8 @@ Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда КонтактнаяИнформация = Метаданные.Документы[ИмяОбъекта].ТабличныеЧасти.КонтактнаяИнформация; Если КонтактнаяИнформация.Реквизиты.Найти("ВидДляСписка") <> Неопределено Тогда - ТекстЗапроса = ТекстЗапроса + Разделитель + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, "Документ", ИмяОбъекта); + ТекстЗапроса = ТекстЗапроса + Разделитель + + СтрЗаменить(ШаблонЗапроса, "&ТаблицаСКонтактнойИнформацией", "Документ." + ИмяОбъекта); Разделитель = " ОБЪЕДИНИТЬ ВСЕ "; КонецЕсли; КонецЕсли; @@ -2943,10 +3070,10 @@ КонецЕсли; ПолноеИмяОбъектаСВидомДляСписка = Метаданные.НайтиПоТипу(ОбъектыСВидомДляСписка.Получить(0)).ПолноеИмя(); - ТекстЗапроса = " ВЫБРАТЬ ПЕРВЫЕ " + Формат(РазмерПорции, "ЧГ=0") + " + ТекстЗапроса = "ВЫБРАТЬ ПЕРВЫЕ 1234 | КонтактнаяИнформация.Ссылка КАК Ссылка |ИЗ - | " + ПолноеИмяОбъектаСВидомДляСписка + ".КонтактнаяИнформация КАК КонтактнаяИнформация + | &КонтактнаяИнформация КАК КонтактнаяИнформация | |СГРУППИРОВАТЬ ПО | КонтактнаяИнформация.Ссылка @@ -2958,6 +3085,9 @@ | ИНАЧЕ 1 | КОНЕЦ) = 0"; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "1234", Формат(РазмерПорции, "ЧГ=0")); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&КонтактнаяИнформация", ПолноеИмяОбъектаСВидомДляСписка + ".КонтактнаяИнформация"); + Запрос = Новый Запрос(ТекстЗапроса); РезультатЗапроса = Запрос.Выполнить().Выбрать(); Количество = РезультатЗапроса.Количество(); @@ -3064,7 +3194,7 @@ // // Параметры: // Форма - ФормаКлиентскогоПриложения - передаваемая форма. -// Элементы - Соответствие - список видов контактной информации, для которых устанавливается доступ: +// Элементы - Соответствие из КлючИЗначение - список видов контактной информации, для которых устанавливается доступ: // ** Ключ - ОбъектМетаданных - подсистема, в которой размещается отчет или вариант отчета. // ** Значение - Булево - если ЛОЖЬ, то элемент доступен только для просмотра. // @@ -3072,7 +3202,7 @@ Для каждого Элемент Из Элементы Цикл Отбор = Новый Структура("Вид", Элемент.Ключ); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); Если НайденныеСтроки <> Неопределено Тогда Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл ЭлементКИ = Форма.Элементы[НайденнаяСтрока.ИмяРеквизита]; @@ -3164,6 +3294,93 @@ КонецПроцедуры +Функция АдресЭлектроннойПочты(Знач ЗначениеКонтактнойИнформации) Экспорт + + КонтактнаяИнформацияВФорматеJSON = КонтактнаяИнформацияВJSON(ЗначениеКонтактнойИнформации, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + + КонтактнаяИнформацияСтруктурой = УправлениеКонтактнойИнформациейСлужебный.JSONВКонтактнуюИнформациюПоПолям( + КонтактнаяИнформацияВФорматеJSON, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + + Возврат КонтактнаяИнформацияСтруктурой.value; + +КонецФункции + +Функция НовыйАдресПочтыДляВосстановленияПароля(Знач СсылкаНаОбъект, Знач АдресЭлектроннойПочты) Экспорт + + Результат = Неопределено; + + Если СодержитКонтактнуюИнформацию(СсылкаНаОбъект) Тогда + ПочтаОбъекта = КонтактнаяИнформацияОбъекта(СсылкаНаОбъект, + Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, ТекущаяДатаСеанса(), Ложь); + Если ПочтаОбъекта.Количество() > 0 Тогда + Почта = ПочтаОбъекта.Найти(АдресЭлектроннойПочты, "Представление"); + Если Почта = Неопределено Тогда + Результат = ПочтаОбъекта[0].Представление; + КонецЕсли; + Иначе + Результат = ""; + КонецЕсли; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// АдресЭлектроннойПочты - Строка +// ДоступноРедактирование - Булево +// ЭтоВнешнийПользователь - Булево +// Возвращаемое значение: +// Строка +// +Функция ОпределитьЭлементСПочтойДляВосстановленияПароля(Форма, АдресЭлектроннойПочты, ДоступноРедактирование, ЭтоВнешнийПользователь = Ложь) Экспорт + + Если ЭтоВнешнийПользователь Тогда + ТипИлиВидEmailПользователя = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты; + Иначе + ТипИлиВидEmailПользователя = ВидКонтактнойИнформацииПоИмени("EmailПользователя"); + КонецЕсли; + + ИмяРеквизита = ИмяРеквизитыДляВосстановленияПароля(Форма, АдресЭлектроннойПочты, ТипИлиВидEmailПользователя); + + Если ЗначениеЗаполнено(ИмяРеквизита) + И Форма.Элементы.Найти(ИмяРеквизита) <> Неопределено Тогда + Форма.Элементы[ИмяРеквизита].Родитель.Подсказка = НСтр("ru = 'Используется для восстановления пароля.'"); + Форма.Элементы[ИмяРеквизита].Родитель.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСправа; + Форма.Элементы[ИмяРеквизита].Родитель.Доступность = ДоступноРедактирование; + КонецЕсли; + + Возврат ИмяРеквизита; + +КонецФункции + +// Восстановление пароля + +Функция СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы(Форма, ТипИлиВидEmailПользователя, АдресЭлектроннойПочты = "") Экспорт + + КонтактнаяИнформация = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); + + Отбор = Новый Структура; + Если ТипЗнч(ТипИлиВидEmailПользователя) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + Отбор.Вставить("Вид", ТипИлиВидEmailПользователя); + ИначеЕсли ТипЗнч(ТипИлиВидEmailПользователя) = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + Отбор.Вставить("Тип", ТипИлиВидEmailПользователя); + КонецЕсли; + + Если ЗначениеЗаполнено(АдресЭлектроннойПочты) Тогда + Отбор.Вставить("Представление", АдресЭлектроннойПочты); + КонецЕсли; + + НайденныеСтроки = КонтактнаяИнформация.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() > 0 Тогда + Возврат НайденныеСтроки[0]; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -3190,6 +3407,40 @@ КонецПроцедуры +// Параметры: +// Форма - ФормаКлиентскогоПриложения +// ДобавляемыеРеквизиты - Массив из РеквизитФормы +// ИмяОбъекта - Строка +// ИсключаемыеВиды - Неопределено, Массив +// КонтактнаяИнформация - КоллекцияСтрокДереваЗначений: +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации - вид контактной информации. +// * ИмяПредопределенногоВида - Строка +// * ИмяПредопределенныхДанных - Строка +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. +// * ОбязательноеЗаполнение - Булево +// * ВидПоляДругое - Строка +// * РазрешитьВводНесколькихЗначений - Булево +// * Наименование - Строка +// * ХранитьИсториюИзменений - Булево +// * ВидРедактирования - Строка +// * ЭтоРеквизитТабличнойЧасти - Булево +// * РеквизитДопУпорядочивания - Булево +// * МеждународныйФорматАдреса - Булево +// * ВводитьНомерПоМаске - Булево +// * ЭтоИсторическаяКонтактнаяИнформация - Булево +// * Представление - Строка - представление контактной информации. +// * ЗначенияПолей - Строка - устаревший XML, соответствующий XDTO пакетам КонтактнаяИнформация или Адрес. Для +// обратной совместимости. +// * Значение - Строка. +// * ДействуетС - Дата. +// * НомерСтроки - Число. +// * ИдентификаторСтрокиТабличнойЧасти - Число. +// * ИмяРеквизита - Строка. +// * ПометкаУдаления - Булево. +// * Комментарий - Строка. +// ОтложеннаяИнициализация - Булево, Массив +// ОбработкаНавигационнойСсылки - Булево +// Процедура СоздатьРеквизитыКонтактнойИнформации(Знач Форма, Знач ДобавляемыеРеквизиты, Знач ИмяОбъекта, Знач ИсключаемыеВиды, Знач КонтактнаяИнформация, Знач ОтложеннаяИнициализация, Знач ОбработкаНавигационнойСсылки) @@ -3200,7 +3451,7 @@ ПредыдущийВид = Неопределено; ПорядковыйНомер = 1; - Для Каждого ОбъектКонтактнойИнформации Из КонтактнаяИнформация Цикл + Для Каждого ОбъектКонтактнойИнформации Из КонтактнаяИнформация Цикл // СтрокаТаблицыЗначений: см. КонтактнаяИнформацияОбъекта Если ОбъектКонтактнойИнформации.ПометкаУдаления И ПустаяСтрока(ОбъектКонтактнойИнформации.Значение) Тогда Продолжить; @@ -3217,7 +3468,7 @@ ОбъектКонтактнойИнформации.Строки.Сортировать("РеквизитДопУпорядочивания"); - Для Каждого СтрокаКИ Из ОбъектКонтактнойИнформации.Строки Цикл + Для Каждого СтрокаКИ Из ОбъектКонтактнойИнформации.Строки Цикл // СтрокаТаблицыЗначений: см. КонтактнаяИнформацияОбъекта ТекущийВид = СтрокаКИ.Вид; Если ТекущийВид <> ПредыдущийВид Тогда @@ -3381,7 +3632,7 @@ Возврат; КонецЕсли; - ОписаниеКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ОписаниеКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита); НайденнаяСтрока = ОписаниеКонтактнойИнформации.НайтиСтроки(Отбор)[0]; @@ -3417,7 +3668,7 @@ ДобавляемыйВид = Результат.Вид; КонецЕсли; - ТаблицаКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ТаблицаКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); ОтборПоВиду = Новый Структура("Вид, ЭтоИсторическаяКонтактнаяИнформация", ДобавляемыйВид, Ложь); Если ДобавлениеНовогоЗначения Тогда @@ -3575,7 +3826,7 @@ ОбработкаНавигационнойСсылки = ПараметрыКонтактнойИнформации.ОбработкаНавигационнойСсылки; ЗаголовокСлева = ЗаголовокСлева(ПараметрыКонтактнойИнформации.ПоложениеЗаголовка); - Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Родитель); // РасширениеПоляФормыДляПоляВвода, РасширениеПоляФормыДляПоляНадписи + Элемент = Форма.Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Родитель); // ПолеФормы, РасширениеПоляФормыДляПоляВвода, РасширениеПоляФормыДляПоляНадписи Элемент.ПутьКДанным = ИмяРеквизита; Если ИнформацияОВидеКИ.ВидРедактирования = "Диалог" И ИнформацияОВидеКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда @@ -3642,7 +3893,7 @@ Элемент.Маска = ИнформацияОВидеКИ.МаскаНомераТелефона; КонецЕсли; - ТаблицаКонтактнойИнформации = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ТаблицаКонтактнойИнформации = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); НайденныеСтроки = ТаблицаКонтактнойИнформации.НайтиСтроки(Новый Структура("ИмяРеквизита", ИмяРеквизита)); Если НайденныеСтроки.Количество() > 0 Тогда НайденныеСтроки[0].Маска = ИнформацияОВидеКИ.МаскаНомераТелефона; @@ -3973,7 +4224,7 @@ Процедура ДобавитьРеквизитВОписание(Форма, СтрокаКонтактнойИнформации, ДанныеВидаКонтактнойИнформации, ЭтоНовыйВидКИ, ЭтоРеквизитТабличнойЧасти = Ложь, ЗаполнятьЗначениеРеквизита = Истина, ИмяЭлементаДляРазмещения = "ГруппаКонтактнаяИнформация") - ТаблицаОписанияДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; // ТаблицаЗначений + ТаблицаОписанияДополнительныхРеквизитов = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); НоваяСтрока = ТаблицаОписанияДополнительныхРеквизитов.Добавить(); НоваяСтрока.ИмяРеквизита = СтрокаКонтактнойИнформации.ИмяРеквизита; НоваяСтрока.Вид = СтрокаКонтактнойИнформации.Вид; @@ -4126,7 +4377,7 @@ // Функция ЕстьДругиеЗаполненныеСтрокКИДанногоВида(Знач Форма, Знач ПроверяемаяСтрока, Знач ВидКонтактнойИнформации) - ВсеСтрокиЭтогоВида = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки( + ВсеСтрокиЭтогоВида = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки( Новый Структура("Вид", ВидКонтактнойИнформации)); Для Каждого СтрокаВида Из ВсеСтрокиЭтогоВида Цикл @@ -4522,35 +4773,35 @@ // Описание параметров вывода контактной информации // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ИмяЭлементаДляРазмещения - Строка -// - Неопределено -// ПоложениеЗаголовкаКИ - Строка -// - ПоложениеЗаголовкаЭлементаФормы -// ОтложеннаяИнициализация - Массив -// - Булево -// ИсключаемыеВиды - Массив -// - Неопределено -// СкрываемыеВиды - Массив -// - Неопределено +// Форма - ФормаКлиентскогоПриложения +// ИмяЭлементаДляРазмещения - Строка +// - Неопределено +// ПоложениеЗаголовкаКИ - Строка +// - ПоложениеЗаголовкаЭлементаФормы +// ОтложеннаяИнициализация - Массив +// - Булево +// ИсключаемыеВиды - Массив +// - Неопределено +// СкрываемыеВиды - Массив +// - Неопределено // // Возвращаемое значение: // Структура: // * ГруппаДляРазмещения - Строка -// * ПоложениеЗаголовка - Строка -// * ДобавленныеРеквизиты - СписокЗначений -// * ОтложеннаяИнициализация - Булево -// * ИсключаемыеВиды - Массив -// * ВыполненаОтложеннаяИнициализация - Булево -// * ДобавленныеЭлементы - СписокЗначений -// * СписокДобавляемыхЭлементов - СписокЗначений: -// * Значение - Структура: -// ** Ссылка - СправочникСсылка.ВидыКонтактнойИнформации -// * Ключ - Строка -// * МожноОтправлятьSMS - Булево -// * Владелец - ЛюбаяСсылка -// * ОбработкаНавигационнойСсылки - Булево -// * СкрываемыеВиды - Массив +// * ПоложениеЗаголовка - Строка +// * ДобавленныеРеквизиты - СписокЗначений +// * ОтложеннаяИнициализация - Булево +// * ИсключаемыеВиды - Массив +// * ВыполненаОтложеннаяИнициализация - Булево +// * ДобавленныеЭлементы - СписокЗначений +// * СписокДобавляемыхЭлементов - СписокЗначений: +// * Значение - Структура: +// ** Ссылка - СправочникСсылка.ВидыКонтактнойИнформации +// * Ключ - Строка +// * МожноОтправлятьSMS - Булево +// * Владелец - ЛюбаяСсылка +// * ОбработкаНавигационнойСсылки - Булево +// * СкрываемыеВиды - Массив // Функция ПараметрыВыводаКонтактнойИнформации(Форма, ИмяЭлементаДляРазмещения, ПоложениеЗаголовкаКИ, ОтложеннаяИнициализация, ИсключаемыеВиды, СкрываемыеВиды) @@ -4837,9 +5088,9 @@ // Возвращает параметры контактной информации на форме // // Параметры: -// ПараметрыКонтактнойИнформации - см. ПараметрыВыводаКонтактнойИнформации -// ИмяЭлементаДляРазмещения - Строка -// - Неопределено +// ПараметрыКонтактнойИнформации - см. ПараметрыВыводаКонтактнойИнформации +// ИмяЭлементаДляРазмещения - Строка +// - Неопределено // // Возвращаемое значение: // см. ПараметрыВыводаКонтактнойИнформации @@ -4963,7 +5214,7 @@ Процедура ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения) ПараметрыКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; // см. ПараметрыВыводаКонтактнойИнформации - ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ВсеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); НайденныеСтроки = ВсеСтроки.НайтиСтроки( Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", Перечисления.ТипыКонтактнойИнформации.Адрес, Ложь)); @@ -5098,7 +5349,7 @@ ГруппаВидовКонтактнойИнформации = ГруппаВидовКонтактнойИнформацииОбъекта(ПолноеИмяОбъектаМетаданных); ИменаТабличныхЧастейПоВидамКИ = Неопределено; - Для Каждого СтрокаТаблицы Из Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов Цикл + Для Каждого СтрокаТаблицы Из УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма) Цикл ИмяРеквизита = СтрокаТаблицы.ИмяРеквизита; @@ -5118,7 +5369,7 @@ Если ИменаТабличныхЧастейПоВидамКИ = Неопределено Тогда Отбор = Новый Структура("ЭтоРеквизитТабличнойЧасти", Истина); - ВидыКИТабличнойЧасти = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Выгрузить(Отбор, "Вид"); + ВидыКИТабличнойЧасти = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Выгрузить(Отбор, "Вид"); ИменаТабличныхЧастейПоВидамКИ = ИменаТабличныхЧастейПоВидамКИ(ВидыКИТабличнойЧасти, ИмяОбъектаМетаданных); КонецЕсли; @@ -5344,7 +5595,7 @@ // * Имя - Строка - уникальное имя вида контактной информации. // * Наименование - Строка - наименование вида контактной информации. // * Вид - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на вид контактной информации. -// Значение по умолчанию - Справочник.ВидыКонтактнойИнформации.ПустаяСсылка. +// Значение по умолчанию - СправочникСсылка.ВидыКонтактнойИнформации.ПустаяСсылка. // * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации - тип контактной информации. // * Группа - СправочникСсылка.ВидыКонтактнойИнформации // - Неопределено - ссылка на группу(родителя) элемента справочника. @@ -5461,17 +5712,17 @@ // Конструктор описания страны мира. // // Параметры: -// РезультатЗапроса - Структура - данные заполнения. +// РезультатЗапроса - Структура - данные заполнения. // // Возвращаемое значение: -// Структура: -// Код - Строка - числовой код страны по классификатору; -// КодАльфа2 - Строка - двузначный буквенный код альфа-2 страны по классификатору; -// КодАльфа3 - Строка - трехзначный буквенный код альфа-3 страны по классификатору; -// Наименование - Строка - краткое наименование страны мира -// НаименованиеПолное - Строка - полное наименование страны мира; -// УчастникЕАЭС - Булево - страна является участником Евразийского экономического союза; -// Неактуальный - Булево - помечена на удаление. +// Структура: +// Код - Строка - числовой код страны по классификатору; +// КодАльфа2 - Строка - двузначный буквенный код альфа-2 страны по классификатору; +// КодАльфа3 - Строка - трехзначный буквенный код альфа-3 страны по классификатору; +// Наименование - Строка - краткое наименование страны мира +// НаименованиеПолное - Строка - полное наименование страны мира; +// УчастникЕАЭС - Булево - страна является участником Евразийского экономического союза; +// Неактуальный - Булево - помечена на удаление. // Функция ОписаниеСтраныМира(ДанныеЗаполнения) @@ -5644,4 +5895,35 @@ КонецФункции +// Восстановление пароля + +// Имя реквизиты для восстановления пароля +// +// Параметры: +// КонтактнаяИнформация - ДанныеФормыКоллекция +// +// Возвращаемое значение: +// Строка - имя реквизита на форме с электронной почтой для восстановления. +// +Функция ИмяРеквизитыДляВосстановленияПароля(Форма, АдресЭлектроннойПочты, ТипИлиВидEmailПользователя) + + ИмяРеквизитаДляВосстановленияПароля = ""; + + ОписаниеПочты = СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы( + Форма, ТипИлиВидEmailПользователя, АдресЭлектроннойПочты); + + Если ОписаниеПочты = Неопределено Тогда + // Первая почта будет для восстановления + ОписаниеПочты = СтрокаОписанияПочтыДляВосстановленияПароляИзДанныхФормы( + Форма, ТипИлиВидEmailПользователя); + КонецЕсли; + + Если ОписаниеПочты <> Неопределено Тогда + ИмяРеквизитаДляВосстановленияПароля = ОписаниеПочты.ИмяРеквизита; + КонецЕсли; + + Возврат ИмяРеквизитаДляВосстановленияПароля; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl index c5b05416f..f52a24678 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -151,9 +151,7 @@ СтандартнаяОбработка = Ложь; Форма[ИмяРеквизита] = ВыбранноеЗначение.Представление; - Отбор = Новый Структура("ИмяРеквизита", ИмяРеквизита); - Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Новый Структура("ИмяРеквизита", ИмяРеквизита)); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Новый Структура("ИмяРеквизита", ИмяРеквизита)); Если НайденныеСтроки.Количество() > 0 Тогда НайденныеСтроки[0].Представление = ВыбранноеЗначение.Представление; НайденныеСтроки[0].Значение = ВыбранноеЗначение.Адрес; @@ -556,7 +554,7 @@ Процедура ОткрытьФормуИсторииИзменений(Форма, ПараметрыКонтактнойИнформации, АсинхронныйВызов = Ложь) Экспорт Результат = Новый Структура("Вид", ПараметрыКонтактнойИнформации.Вид); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат); СписокКонтактнойИнформации = Новый Массив; Для каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл @@ -718,8 +716,8 @@ // Обработчик после закрытия формы истории // // Параметры: -// Результат - Структура -// ДополнительныеПараметры - см. ПослеЗакрытияФормыИсторииДополнительныеПараметры +// Результат - Структура +// ДополнительныеПараметры - см. ПослеЗакрытияФормыИсторииДополнительныеПараметры // Процедура ПослеЗакрытияФормыИстории(Результат, ДополнительныеПараметры) Экспорт @@ -730,19 +728,19 @@ Форма = ДополнительныеПараметры.Форма; Отбор = Новый Структура("Вид", ДополнительныеПараметры.Вид); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); СтарыйКомментарий = Неопределено; Для каждого СтрокаКонтактнойИнформации Из НайденныеСтроки Цикл Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда СтарыйКомментарий = СтрокаКонтактнойИнформации.Комментарий; КонецЕсли; - Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Удалить(СтрокаКонтактнойИнформации); + УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Удалить(СтрокаКонтактнойИнформации); КонецЦикла; ПараметрыОбновления = Новый Структура; Для Каждого СтрокаКонтактнойИнформации Из Результат.История Цикл - ДанныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); + ДанныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).Добавить(); ЗаполнитьЗначенияСвойств(ДанныеСтроки, СтрокаКонтактнойИнформации); Если НЕ СтрокаКонтактнойИнформации.ЭтоИсторическаяКонтактнаяИнформация Тогда Если ПустаяСтрока(СтрокаКонтактнойИнформации.Представление) @@ -772,8 +770,8 @@ // Продолжение вызова ПредставлениеНачалоВыбора // // Параметры: -// РезультатЗакрытия - Структура -// ДополнительныеПараметры - см. ПредставлениеНачалоВыбораЗавершениеДополнительныеПараметры +// РезультатЗакрытия - Структура +// ДополнительныеПараметры - см. ПредставлениеНачалоВыбораЗавершениеДополнительныеПараметры // Процедура ПредставлениеНачалоВыбораЗавершение(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт @@ -967,7 +965,8 @@ ПараметрыОткрытияФормы.Вставить("ТипПомещения", ПараметрыКонтактнойИнформации.ПараметрыАдреса.ТипПомещения); ПараметрыОткрытияФормы.Вставить("Страна", ПараметрыКонтактнойИнформации.ПараметрыАдреса.Страна); ПараметрыОткрытияФормы.Вставить("Индекс", ПараметрыКонтактнойИнформации.ПараметрыАдреса.Индекс); - ПараметрыОткрытияФормы.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов", Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов); + ПараметрыОткрытияФормы.Вставить("КонтактнаяИнформацияОписаниеДополнительныхРеквизитов", + УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма)); Если Не ЭтоТабличнаяЧасть Тогда ПараметрыОткрытияФормы.Вставить("Комментарий", ДанныеСтроки.Комментарий); @@ -999,7 +998,7 @@ Процедура ПриОчистке(Знач Форма, Знач ИмяРеквизита, АсинхронныйВызов) Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); - НайденнаяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; + НайденнаяСтрока = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат)[0]; НайденнаяСтрока.Значение = ""; НайденнаяСтрока.Представление = ""; НайденнаяСтрока.Комментарий = ""; @@ -1068,7 +1067,7 @@ КонецЕсли; Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат); + НайденныеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат); Если НайденныеСтроки.Количество() = 0 Тогда Возврат; КонецЕсли; @@ -1089,14 +1088,15 @@ ПоказатьАдресНаКарте(НайденнаяСтрока.Представление, "GoogleMaps"); Иначе ПервыйЭлемент = НайденнаяСтрока.ИмяРеквизита; - Индекс = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Индекс(НайденнаяСтрока); + ОписаниеКонтактнойИнформацииНаФорме = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); + Индекс = ОписаниеКонтактнойИнформацииНаФорме.Индекс(НайденнаяСтрока); Если КомандаКонтекстногоМеню.НаправлениеПеремещения = 1 Тогда - Если Индекс < Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Количество() - 1 Тогда - ВторойЭлемент = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Получить(Индекс + 1).ИмяРеквизита; + Если Индекс < ОписаниеКонтактнойИнформацииНаФорме.Количество() - 1 Тогда + ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс + 1).ИмяРеквизита; КонецЕсли; Иначе Если Индекс > 0 Тогда - ВторойЭлемент = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Получить(Индекс - 1).ИмяРеквизита; + ВторойЭлемент = ОписаниеКонтактнойИнформацииНаФорме.Получить(Индекс - 1).ИмяРеквизита; КонецЕсли; КонецЕсли; Результат = Новый Структура("ПоменятьМестамиЭлементы, ПервыйЭлемент, ВторойЭлемент", Истина, ПервыйЭлемент, ВторойЭлемент); @@ -1107,7 +1107,7 @@ ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда Результат = Новый Структура("ИмяРеквизита", ИмяРеквизитаИсточник); - СтрокаПотребитель = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; + СтрокаПотребитель = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Результат)[0]; Комментарий = СтрокаПотребитель.Комментарий; // Сохраняем старый комментарий. Если СтрокаПотребитель.Свойство("МеждународныйФорматАдреса") И СтрокаПотребитель.МеждународныйФорматАдреса Тогда @@ -1289,7 +1289,7 @@ Если ДанныеСтроки.Свойство("ХранитьИсториюИзменений") И ДанныеСтроки.ХранитьИсториюИзменений И НачалоДня(ДанныеСтроки.ДействуетС) <> НачалоДня(ОбщегоНазначенияКлиент.ДатаСеанса()) Тогда - КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; // ДанныеФормыКоллекция + КонтактнаяИнформацияОписаниеДополнительныхРеквизитов = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); ИсторическаяКонтактнаяИнформация = КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.Добавить(); ЗаполнитьЗначенияСвойств(ИсторическаяКонтактнаяИнформация, ДанныеСтроки); ИсторическаяКонтактнаяИнформация.ЭтоИсторическаяКонтактнаяИнформация = Истина; @@ -1330,13 +1330,13 @@ // Элемент - ДанныеФормыСтруктураСКоллекцией - данные формы. // // Возвращаемое значение: -// СтрокаКоллекции - найденные данные. +// см. УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме // Неопределено - при отсутствии данных. // Функция ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть = Ложь) Отбор = Новый Структура("ИмяРеквизита", Элемент.Имя); - Строки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); + Строки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма).НайтиСтроки(Отбор); ДанныеСтроки = ?(Строки.Количество() = 0, Неопределено, Строки[0]); Если ЭтоТабличнаяЧасть И ДанныеСтроки <> Неопределено Тогда @@ -1413,7 +1413,7 @@ // // Возвращаемое значение: // Строка - имя доступного URI протокола зарегистрирована в реестре. Пустая строка - если протокол не доступен. -// Неопределенно если проверка не возможна. +// Неопределенно если проверка не возможна. // Функция ПрограммаТелефонииУстановлена(ИмяПротокола = Неопределено) @@ -1497,11 +1497,11 @@ // Конструктор дополнительных параметров для формы истории // // Параметры: -// Форма - ФормаКлиентскогоПриложения -// ПараметрыКонтактнойИнформации - Структура -// АсинхронныйВызов - Булево +// Форма - ФормаКлиентскогоПриложения +// ПараметрыКонтактнойИнформации - Структура +// АсинхронныйВызов - Булево // Возвращаемое значение: -// Структура: +// Структура: // * Форма - ФормаКлиентскогоПриложения // * АсинхронныйВызов - Булево // * ИмяЭлементаДляРазмещения - Строка @@ -1522,11 +1522,8 @@ КонецФункции - -// Описание -// // Возвращаемое значение: -// Структура: +// Структура: // * АсинхронныйВызов - Булево // * ОбновитьКонтекстноеМеню - Булево // * Форма - Неопределено @@ -1537,6 +1534,7 @@ // - ТаблицаФормы // - ПолеФормы // * ДанныеСтроки - Неопределено +// - ДанныеФормыЭлементКоллекции: см. УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме // * ИмяЭлементаРазмещения - Строка // * ЭтоТабличнаяЧасть - Булево // * ДанныеЗаполнения - Строка @@ -1678,7 +1676,7 @@ Процедура ОбновитьКонтекстноеМеню(Форма, ИмяЭлементаДляРазмещения) ПараметрыКонтактнойИнформации = Форма.ПараметрыКонтактнойИнформации[ИмяЭлементаДляРазмещения]; // ДанныеФормаКоллекция - ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ВсеСтроки = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеКонтактнойИнформацииНаФорме(Форма); НайденныеСтроки = ВсеСтроки.НайтиСтроки( Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес"), Ложь)); diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl index c64f449a3..e9a15a909 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl @@ -267,6 +267,29 @@ КонецФункции +// Параметры: +// Форма- ФормаКлиентскогоПриложения +// +// Возвращаемое значение: +// ДанныеФормыКоллекция: +// * ИмяРеквизита - Строка +// * Вид - СправочникСсылка.ВидыКонтактнойИнформации +// * Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации +// * Значение - Строка +// * Представление - Строка +// * Комментарий - Строка +// * ЭтоРеквизитТабличнойЧасти - Булево +// * ЭтоИсторическаяКонтактнаяИнформация - Булево +// * ДействуетС - Дата +// * ХранитьИсториюИзменений - Булево +// * ИмяЭлементаДляРазмещения - Строка +// * МеждународныйФорматАдреса - Булево +// * Маска - Строка +// +Функция ОписаниеКонтактнойИнформацииНаФорме(Форма) Экспорт + Возврат Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl index 5170d89e3..c4d567e5e 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейПереопределяемый/Module.bsl @@ -11,7 +11,7 @@ // Получает наименования видов контактной информации на разных языках. // // Параметры: -// Наименования - Соответствие - представление вида контактной информации на переданном языке: +// Наименования - Соответствие из КлючИЗначение - представление вида контактной информации на переданном языке: // * Ключ - Строка - имя вида контактной информации. Например, "_ДемоАдресПартнера". // * Значение - Строка - наименование вида контактной информации для переданного кода языка. // КодЯзыка - Строка - код языка. Например, "en". diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl index efe4acf38..6e286ef84 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебный/Module.bsl @@ -9,11 +9,11 @@ #Область СлужебныйПрограммныйИнтерфейс // Параметры: -// Ссылка - СправочникСсылка -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации -// Дата - Дата +// Ссылка - СправочникСсылка +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации +// Дата - Дата // Возвращаемое значение: -// Строка +// Строка // Функция ПервоеЗначениеКонтактнойИнформацииОбъектаПоТипу(Ссылка, ТипКонтактнойИнформации, Дата) Экспорт @@ -92,11 +92,12 @@ Функция ПреобразоватьКонтактнуюИнформациюВФорматJSON(СсылкаИлиОбъект, ТипОбъекта) Экспорт + ОбъектИзменен = Ложь; Если ОбщегоНазначения.ЭтоСсылка(ТипОбъекта) Тогда Если Не СодержитПустыеПоляJSON(СсылкаИлиОбъект) Тогда Возврат Ложь; КонецЕсли; - ОбъектИзменен = ЗаполнитьJSONПоляКонтактнойИнформацииДляСсылки(СсылкаИлиОбъект); + ЗаполнитьJSONПоляКонтактнойИнформацииДляСсылки(СсылкаИлиОбъект); Иначе ОбъектИзменен = ЗаполнитьJSONПоляКонтактнойИнформацииДляОбъекта(СсылкаИлиОбъект); КонецЕсли; @@ -109,11 +110,6 @@ // Обработчики событий подсистем конфигурации. // См. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта. -// -// Параметры: -// Объект - Произвольный -// ДополнительныеРеквизиты - см. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта.ДополнительныеРеквизиты -// Процедура ПриПодготовкеДанныхОбъекта(Объект, ДополнительныеРеквизиты) Экспорт Если Объект.Метаданные().ТабличныеЧасти.Найти("КонтактнаяИнформация") <> Неопределено Тогда @@ -152,10 +148,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -210,7 +202,7 @@ Обработчик.ПроцедураПроверки = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы"; Обработчик.Комментарий = НСтр("ru = 'Обновление сведений о странах мирах в соответствии с общероссийским классификатором стран мира. |До завершения обработки наименование стран в документах в ряде случаев будет отображаться некорректно.'"); - + Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика(); НоваяСтрока = Обработчик.ПриоритетыВыполнения.Добавить(); @@ -226,11 +218,11 @@ КонецПроцедуры -// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек -// +// См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек. +// // Параметры: -// Объекты - Массив -// +// Объекты - Массив из ОбъектМетаданных +// Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.СтраныМира); @@ -242,12 +234,7 @@ Обработчики.Вставить("ИнтерактивнаяПроверкаЗаполненияКонтактнойИнформации", "УправлениеКонтактнойИнформациейСлужебный.УстановкаПараметровСеанса"); КонецПроцедуры -// см. КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПроверок -// -// Параметры: -// ГруппыПроверок - см. КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПроверок.ГруппыПроверок -// Проверки - см. КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПроверок.Проверки -// +// См. КонтрольВеденияУчетаПереопределяемый.ПриОпределенииПроверок. Процедура ПриОпределенииПроверок(ГруппыПроверок, Проверки) Экспорт ГруппаПроверок = ГруппыПроверок.Добавить(); @@ -276,18 +263,14 @@ КонецПроцедуры -// Параметры: -// ШаблоныЗаданий - см. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов.ШаблоныЗаданий -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ИсправлениеУстаревшихАдресов"); КонецПроцедуры -// Параметры: -// СоответствиеИменПсевдонимам - см. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков.СоответствиеИменПсевдонимам -// +// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков. Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт СоответствиеИменПсевдонимам.Вставить("УправлениеКонтактнойИнформациейСлужебный.ИсправлениеУстаревшихАдресов"); КонецПроцедуры @@ -320,7 +303,7 @@ КонецФункции -Функция ЗаполнитьJSONПоляКонтактнойИнформацииДляСсылки(Ссылка) +Процедура ЗаполнитьJSONПоляКонтактнойИнформацииДляСсылки(Ссылка) ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)); @@ -345,7 +328,7 @@ ВызватьИсключение; КонецПопытки; -КонецФункции +КонецПроцедуры Функция ЗаполнитьJSONПоляКонтактнойИнформацииДляОбъекта(ОбъектСКонтактнойИнформацией) @@ -380,7 +363,7 @@ КонецФункции Функция ПространствоИмен() Экспорт - Возврат "http://www.v8.1c.ru/ssl/contactinfo"; + Возврат "http://www.v8.1c.ru/ssl/contactinfo"; // @Non-NLS КонецФункции Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) Экспорт @@ -459,7 +442,7 @@ // Функция-конструктор результата проверки. // // Возвращаемое значение: -// Структура: +// Структура: // * СписокОшибок - СписокЗначений // * Результат - Строка // @@ -860,10 +843,10 @@ // Обработчик события КонтактнаяИнформацияОбработкаПроверкиЗаполнения // // Параметры: -// Источник - СправочникОбъект -// - ДокументОбъект -// Отказ - Булево -// ПроверяемыеРеквизиты - Массив +// Источник - СправочникОбъект +// - ДокументОбъект +// Отказ - Булево +// ПроверяемыеРеквизиты - Массив // Процедура КонтактнаяИнформацияОбработкаПроверкиЗаполнения(Источник, Отказ, ПроверяемыеРеквизиты) Экспорт @@ -1267,13 +1250,13 @@ // Возвращаемое значение: // ТаблицаЗначений: // * Уровень - Число -// * Позиция - Число -// * Значение - Строка -// * Наименование - Строка -// * Сокращение - Строка -// * Начало - Число -// * Длина - Число -// * Идентификатор - Строка +// * Позиция - Число +// * Значение - Строка +// * Наименование - Строка +// * Сокращение - Строка +// * Начало - Число +// * Длина - Число +// * Идентификатор - Строка // Функция ЧастиАдреса() Экспорт @@ -1916,7 +1899,7 @@ ШаблонЗапроса = "ВЫБРАТЬ | КонтактнаяИнформация.Ссылка КАК Ссылка |ИЗ - | Справочник.%1.КонтактнаяИнформация КАК КонтактнаяИнформация + | #КонтактнаяИнформацияОбъектаМетаданных КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Вид <> ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ПустаяСсылка) | @@ -1926,9 +1909,10 @@ |ИМЕЮЩИЕ | КОЛИЧЕСТВО(КонтактнаяИнформация.Вид) > 0 "; - Для каждого Объект Из ОбъектыМетаданных Цикл - НаборТекстаЗапроса.Добавить(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, Объект.Метаданные().Имя)); + НаборТекстаЗапроса.Добавить(СтрЗаменить(ШаблонЗапроса, + "#КонтактнаяИнформацияОбъектаМетаданных", + "Справочник." + Объект.Метаданные().Имя + ".КонтактнаяИнформация")); КонецЦикла; Запрос = Новый Запрос; @@ -1942,12 +1926,12 @@ // Описание // // Параметры: -// ВидКонтактнойИнформации - ДанныеФормыСтруктура -// - СправочникСсылка.ВидыКонтактнойИнформации: -// * Наименование - Строка +// ВидКонтактнойИнформации - ДанныеФормыСтруктура +// - СправочникСсылка.ВидыКонтактнойИнформации: +// * Наименование - Строка // // Возвращаемое значение: -// Структура: +// Структура: // * ЕстьОшибки - Булево // * ТекстОшибки - Строка // @@ -2266,7 +2250,7 @@ Объект.КонтактнаяИнформация.Очистить(); КонецЕсли; - Для каждого СтрокаКонтактнойИнформацииОбъекта Из СтрокиКонтактнойИнформацииОбъекта Цикл + Для каждого СтрокаКонтактнойИнформацииОбъекта Из СтрокиКонтактнойИнформацииОбъекта Цикл // СтрокаТаблицыЗначений: см. УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация ХранитьИсториюИзменений = ВладелецКонтактнойИнформации.Значение["Периодическая"] И СтрокаКонтактнойИнформацииОбъекта.Вид.ХранитьИсториюИзменений; @@ -3143,7 +3127,7 @@ Функция СтрокаСоставаКонтактнойИнформации(Знач Текст, Знач НовоеЗначение = Неопределено) Экспорт Чтение = Новый ЧтениеXML; Чтение.УстановитьСтроку(Текст); - ОбъектXDTO= ФабрикаXDTO.ПрочитатьXML(Чтение, + ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен(), "КонтактнаяИнформация")); Состав = ОбъектXDTO.Состав; @@ -4074,9 +4058,9 @@ // Описание // // Параметры: -// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации +// ТипКонтактнойИнформации - ПеречислениеСсылка.ТипыКонтактнойИнформации // Возвращаемое значение: -// ПреобразованиеXSL - Описание +// ПреобразованиеXSL - Описание // Функция ПреобразованиеXSLT_ИнтерпретацияРазличияXMLКонтактнойИнформации(Знач ТипКонтактнойИнформации) @@ -4740,7 +4724,7 @@ // Старый формат через разделитель строк и равенство. ПространствоИмен = ПространствоИмен(); - Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); + Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); // Общий состав diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl index 94bfc9620..77245f717 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейСлужебныйПовтИсп/Module.bsl @@ -78,7 +78,7 @@ // Возвращает список предопределенных видов контактной информации. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка - имя предопределенного вида. // * Значение - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на элемент справочника ВидыКонтактнойИнформации. // diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl index be2a93743..39e7221bb 100644 --- a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl @@ -61,7 +61,7 @@ // Если не указывать этот параметр, то редактирование макета пользователем будет // недоступно в форме ПечатьДокументов. // ИмяФайлаПечатнойФормы - Строка - имя, используемое при сохранении печатной формы в файл; -// - Соответствие: +// - Соответствие из КлючИЗначение: // * Ключ - ЛюбаяСсылка - ссылка на объект печати; // * Значение - Строка - имя файла. // @@ -549,7 +549,7 @@ // Переносит пользовательские данные, относящиеся к макету, на новый адрес. // // Параметры: -// Макеты - Соответствие - сведения о прежних и новых именах макетов в формате +// Макеты - Соответствие из КлючИЗначение - сведения о прежних и новых именах макетов в формате // "Документ.<ИмяДокумента>.<ИмяМакета>" // "Обработка.<ИмяОбработки>.<ИмяМакета>" // "ОбщийМакет.<ИмяМакета>": @@ -594,7 +594,7 @@ // Предназначена для использования в процедуре ПриЗаполненииПоставляемыхПрофилейГруппДоступа модуля УправлениеДоступомПереопределяемый. // // Параметры: -// ОписанияПрофилей - Массив - см. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +// ОписанияПрофилей - см. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа.ОписанияПрофилей // Процедура ЗаполнитьПрофильРедактированиеПечатныхФорм(ОписанияПрофилей) Экспорт @@ -656,7 +656,7 @@ // СоставДокументов - Массив - ссылки на объекты информационной базы (должны быть одного типа). // // Возвращаемое значение: -// Соответствие - коллекция ссылок на объекты и их данные: +// Соответствие из КлючИЗначение - коллекция ссылок на объекты и их данные: // * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы; // * Значение - Структура: // ** Ключ - Строка - имя макета; @@ -685,26 +685,30 @@ // - ПФ_DOC_СчетНаОплату_en // - и т.п. // В этом случае при поиске нужного макета учитывается следующий приоритет: -// 1) на языке конфигурации (ОбщегоНазначения.КодОсновногоЯзыка()), -// 2) без указания языка. +// 1) на языке, указанном в параметре КодЯзыка, +// 2) на языке конфигурации (ОбщегоНазначения.КодОсновногоЯзыка()), +// 3) без указания языка. // // Параметры: // ПутьКМакету - Строка - полный путь к макету в формате: // "Документ.<ИмяДокумента>.<ИмяМакета>" // "Обработка.<ИмяОбработки>.<ИмяМакета>" // "ОбщийМакет.<ИмяМакета>". +// КодЯзыка - Строка - язык, на котором требуется получить макет. +// Состоит из кода языка по ISO 639-1 и, опционально, кода страны по ISO 3166-1, разделенных +// символом подчеркивания. Примеры: "en", "en_US", "en_GB", "ru", "ru_RU". +// // Возвращаемое значение: // ТабличныйДокумент - для макета типа MXL. // ДвоичныеДанные - для макетов офисных документов. // -Функция МакетПечатнойФормы(ПутьКМакету) Экспорт +Функция МакетПечатнойФормы(ПутьКМакету, Знач КодЯзыка = Неопределено) Экспорт - Макет = НайтиМакет(ПутьКМакету); - Если ТипЗнч(Макет) = Тип("ТабличныйДокумент") Тогда - Макет.КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + КодЯзыка = СтрРазделить(КодЯзыка, "_", Истина)[0]; КонецЕсли; - Возврат Макет; + Возврат НайтиМакет(ПутьКМакету, КодЯзыка); КонецФункции @@ -1040,6 +1044,8 @@ //////////////////////////////////////////////////////////////////////////////// // Функции инициализации и закрытия ссылок. +// АПК:1382-выкл - Нельзя определять тип в возвращаемом значении. +// // Конструктор печатной формы в формате офисного документа. // // Параметры: @@ -1068,6 +1074,7 @@ Возврат ПечатнаяФорма; КонецФункции +// АПК:1382-вкл // Подготавливает макет для использования в процедурах формирования печатной формы. // @@ -1407,9 +1414,8 @@ КонецФункции -// Устарела. Следует использовать ГенерацияШтрихкодаВызовСервера.ДанныеQRКода -// или ГенерацияШтрихкодаВызовСервера.ИзображениеШтрихкода из библиотеки -// "1С:Библиотека подключаемого оборудования" версии 2.1.4 (или больше). +// Устарела. Следует использовать ГенерацияШтрихкода.ДанныеQRКода +// или ГенерацияШтрихкода.ИзображениеШтрихкода. // // Возвращает двоичные данные для формирования QR-кода. // @@ -1443,6 +1449,11 @@ // Функция ДанныеQRКода(QRСтрока, УровеньКоррекции, Размер) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГенерацияШтрихкода") Тогда + МодульГенерацияШтрихкода = ОбщегоНазначения.ОбщийМодуль("ГенерацияШтрихкода"); + Возврат МодульГенерацияШтрихкода.ДанныеQRКода(QRСтрока, УровеньКоррекции, Размер); + КонецЕсли; + УстановитьОтключениеБезопасногоРежима(Истина); ГенераторQRКода = КомпонентаФормированияQRКода(); Если ГенераторQRКода = Неопределено Тогда @@ -1476,9 +1487,9 @@ // Ссылка - ПеречислениеСсылка.ФорматыСохраненияОтчетов - ссылка на метаданные, // где хранится // представление; -// Представление - Строка - - представление типа +// Представление - Строка - представление типа // файла (заполняется из перечисления); -// Расширение - Строка - - тип файла для +// Расширение - Строка - тип файла для // операционной системы; // Картинка - Картинка - значок формата. // @@ -1629,7 +1640,9 @@ КонецЕсли; КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(ПараметрыИсточника.ИдентификаторКоманды); - ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода(); + Если Не ЗначениеЗаполнено(ПараметрыВывода) Тогда + ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода(); + КонецЕсли; ПараметрыВывода.Вставить("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); ВнешняяОбработкаОбъект.Печать( @@ -1684,10 +1697,10 @@ // См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту. // // Параметры: -// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы -// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники -// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки -// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды +// НастройкиФормы - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.НастройкиФормы +// Источники - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Источники +// ПодключенныеОтчетыИОбработки - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.ПодключенныеОтчетыИОбработки +// Команды - см. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.Команды // Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт @@ -1733,11 +1746,7 @@ КонецПроцедуры -// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей. -// -// Параметры: -// НазначениеРолей - см. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей.НазначениеРолей -// +// См. ПользователиПереопределяемый.ПриОпределенииНазначенияРолей Процедура ПриОпределенииНазначенияРолей(НазначениеРолей) Экспорт // ТолькоДляПользователейСистемы. @@ -1747,10 +1756,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -1779,13 +1784,15 @@ Обработчик.Комментарий = НСтр("ru = 'Определяет, какие поставляемые макеты печатных форм расширений изменились по отношению к предыдущей версии.'"); Обработчик.Идентификатор = Новый УникальныйИдентификатор("51f71246-67e3-40e0-80e5-ebb3192fa6c0"); + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "3.1.4.67"; + Обработчик.Процедура = "Справочники.ЯзыкиПечатныхФорм.ЗаполнитьПоставляемыеЯзыки"; + Обработчик.РежимВыполнения = "Оперативно"; + КонецПроцедуры // См. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам. -// -// Параметры: -// ЗапросыРазрешений - см. РаботаВБезопасномРежимеПереопределяемый.ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам.ЗапросыРазрешений -// Процедура ПриЗаполненииРазрешенийНаДоступКВнешнимРесурсам(ЗапросыРазрешений) Экспорт МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме"); @@ -1798,7 +1805,9 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. +// Параметры: +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. +// Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт МодульТекущиеДелаСервер = ОбщегоНазначения.ОбщийМодуль("ТекущиеДелаСервер"); @@ -1873,6 +1882,12 @@ КонецПроцедуры +Функция ПоставляемыйМакет(ПутьКМакету, КодЯзыка) Экспорт + + Возврат НайтиМакет(ПутьКМакету, КодЯзыка, Истина); + +КонецФункции + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -1905,7 +1920,7 @@ // на источник внешней печатной формы. // // Возвращаемое значение: -// Ссылка +// ЛюбаяСсылка // Функция СсылкаДополнительнойПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных) ВнешняяПечатнаяФормаСсылка = Неопределено; @@ -1920,11 +1935,15 @@ // Сформировать печатные формы. Функция СформироватьПечатныеФормы(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач МассивОбъектов, Знач ПараметрыПечати, - ДопустимыеТипыОбъектовПечати = Неопределено) Экспорт + ДопустимыеТипыОбъектовПечати = Неопределено, Знач КодЯзыка = Неопределено) Экспорт КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(Новый Массив); ОбъектыПечати = Новый СписокЗначений; + ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода(); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + ПараметрыВывода.КодЯзыка = КодЯзыка; + КонецЕсли; Если ТипЗнч(ИменаМакетов) = Тип("Строка") Тогда ИменаМакетов = СтрРазделить(ИменаМакетов, ","); @@ -2183,7 +2202,7 @@ КонецПроцедуры // Сохраняет пользовательский макет печати в информационной базе. -Процедура ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище) Экспорт +Процедура ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище, КодЯзыка = Неопределено) Экспорт ИзмененныйМакет = ПолучитьИзВременногоХранилища(АдресМакетаВоВременномХранилище); @@ -2210,6 +2229,10 @@ МакетИзМетаданных = ПолучитьОбщийМакет(ИмяМакета); КонецЕсли; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + ИмяМакета = ИмяМакета + "_" + КодЯзыка; + КонецЕсли; + Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); Запись.Объект = ИмяВладельца; Запись.ИмяМакета = ИмяМакета; @@ -2470,10 +2493,10 @@ // Параметры: -// ТабличныйДокумент - ТабличныйДокумент -// ОбъектыПечати - СписокЗначений -// МенеджерПечати - Строка -// Идентификатор - Строка +// ТабличныйДокумент - ТабличныйДокумент +// ОбъектыПечати - СписокЗначений +// МенеджерПечати - Строка +// Идентификатор - Строка // Процедура ПроверитьРазметкуТабличногоДокументаПоОбъектамПечати(ТабличныйДокумент, ОбъектыПечати, Знач МенеджерПечати, Знач Идентификатор) @@ -2687,7 +2710,7 @@ Для Каждого Файл Из СписокФайлов Цикл ИмяФайла = ИмяВременногоКаталога + Файл.ИмяФайла; - ИмяФайла = УникальноеИмяФайла(ИмяФайла); + ИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяФайла); Файл.ДвоичныеДанные.Записать(ИмяФайла); ЗаписьZipФайла.Добавить(ИмяФайла); КонецЦикла; @@ -2708,28 +2731,11 @@ КонецФункции -Функция УникальноеИмяФайла(ИмяФайла) - - Файл = Новый Файл(ИмяФайла); - ИмяБезРасширения = Файл.ИмяБезРасширения; - Расширение = Файл.Расширение; - ИмяКаталога = Файл.Путь; - - Счетчик = 1; - Пока Файл.Существует() Цикл - Счетчик = Счетчик + 1; - Файл = Новый Файл(ИмяКаталога + ИмяБезРасширения + " (" + Счетчик + ")" + Расширение); - КонецЦикла; - - Возврат Файл.ПолноеИмя; - -КонецФункции - // Параметры: -// ТабличныйДокумент - ТабличныйДокумент -// Формат - ТипФайлаТабличногоДокумента +// ТабличныйДокумент - ТабличныйДокумент +// Формат - ТипФайлаТабличногоДокумента // Возвращаемое значение: -// ДвоичныеДанные +// ДвоичныеДанные // Функция ТабличныйДокументВДвоичныеДанные(ТабличныйДокумент, Формат) @@ -2858,17 +2864,23 @@ // 2) на языке конфигурации, // 3) без указания языка. // -Функция ИменаМакета(Знач ИмяМакета) +Функция ИменаМакета(Знач ИмяМакета, Знач КодЯзыка = Неопределено) Результат = Новый Массив; - Если СтрНайти(ИмяМакета, "ПФ_DOC_") > 0 Или СтрНайти(ИмяМакета, "ПФ_ODT_") > 0 Тогда - Результат.Добавить(ИмяМакета + "_" + ОбщегоНазначения.КодОсновногоЯзыка()); + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Результат.Добавить(ИмяМакета + "_" + КодЯзыка); + ЧастиСтроки = СтрРазделить(КодЯзыка, "_", Ложь); + Если ЧастиСтроки.Количество() > 1 Тогда + Результат.Добавить(ИмяМакета + "_" + ЧастиСтроки[0]); + КонецЕсли; КонецЕсли; + Результат.Добавить(ИмяМакета + "_" + ОбщегоНазначения.КодОсновногоЯзыка()); Результат.Добавить(ИмяМакета); + Возврат Результат; - + КонецФункции // Конструктор для параметра КоллекцияПечатныхФорм процедуры Печать. @@ -2883,10 +2895,10 @@ // * Картинка - Картинка - (не используется); // * ПолныйПутьКМакету - Строка - используется для быстрого перехода к редактированию макета печатной формы; // * ИмяФайлаПечатнойФормы - Строка - имя файла; -// - Соответствие - имена файлов для каждого объекта: +// - Соответствие из КлючИЗначение - имена файлов для каждого объекта: // ** Ключ - ЛюбаяСсылка - ссылка на объект печати; // ** Значение - Строка - имя файла; -// * ОфисныеДокументы - Соответствие - коллекция печатных форм в формате офисных документов: +// * ОфисныеДокументы - Соответствие из КлючИЗначение - коллекция печатных форм в формате офисных документов: // ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы; // ** Значение - Строка - имя файла печатной формы. // @@ -2925,6 +2937,7 @@ ПараметрыВывода = Новый Структура; ПараметрыВывода.Вставить("ЗаголовокФормы", ""); ПараметрыВывода.Вставить("ДоступнаПечатьПоКомплектно", Ложь); // не используется + ПараметрыВывода.Вставить("КодЯзыка", ОбщегоНазначения.КодОсновногоЯзыка()); СтруктураПараметровПисьма = Новый Структура("Получатель,Тема,Текст", Неопределено, "", ""); ПараметрыВывода.Вставить("ПараметрыОтправки", СтруктураПараметровПисьма); @@ -2933,6 +2946,14 @@ КонецФункции +// Параметры: +// КомандаПечати - СтрокаТаблицыЗначений: см. СоздатьКоллекциюКомандПечати +// НастройкиСохранения - см. УправлениеПечатью.НастройкиСохранения +// СписокОбъектов - Массив +// Результат - ТаблицаЗначений: +// * ИмяФайла - Строка +// * ДвоичныеДанные - ДвоичныеДанные +// Процедура ВыполнитьКомандуПечатиВФайл(КомандаПечати, НастройкиСохранения, СписокОбъектов, Результат) ДанныеПечати = Неопределено; @@ -3072,7 +3093,7 @@ КонецФункции -Функция НайтиМакет(ПутьКМакету) +Функция НайтиМакет(ПутьКМакету, КодЯзыка, ТолькоПоставляемый = Ложь) ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Макет ""%1"" не существует. Операция прервана.'"), ПутьКМакету); @@ -3100,18 +3121,21 @@ Запрос.Параметры.Вставить("Объект", ИмяОбъекта); Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета + "%"); - Выборка = Запрос.Выполнить().Выбрать(); - СписокМакетов = Новый Соответствие; - Пока Выборка.Следующий() Цикл - СписокМакетов.Вставить(Выборка.ИмяМакета, Выборка.Макет.Получить()); - КонецЦикла; - ИменаПоиска = ИменаМакета(ИмяМакета); + Если Не ТолькоПоставляемый Тогда + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + СписокМакетов.Вставить(Выборка.ИмяМакета, Выборка.Макет.Получить()); + КонецЦикла; + КонецЕсли; + + ИменаПоиска = ИменаМакета(ИмяМакета, КодЯзыка); Для Каждого ИмяПоиска Из ИменаПоиска Цикл НайденныйМакет = СписокМакетов[ИмяПоиска]; Если НайденныйМакет <> Неопределено Тогда + УстановитьЯзыкМакета(НайденныйМакет, КодЯзыка); Возврат НайденныйМакет; КонецЕсли; КонецЦикла; @@ -3130,12 +3154,14 @@ Для Каждого ИмяПоиска Из ИменаПоиска Цикл Если КоллекцияМакетов.Найти(ИмяПоиска) <> Неопределено Тогда Если ЭтоОбщийМакет Тогда - Возврат ПолучитьОбщийМакет(ИмяПоиска); + Макет = ПолучитьОбщийМакет(ИмяПоиска); Иначе УстановитьОтключениеБезопасногоРежима(Истина); УстановитьПривилегированныйРежим(Истина); - Возврат ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьМакет(ИмяПоиска); + Макет = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИмяОбъекта).ПолучитьМакет(ИмяПоиска); КонецЕсли; + УстановитьЯзыкМакета(Макет, КодЯзыка); + Возврат Макет; КонецЕсли; КонецЦикла; @@ -3143,4 +3169,76 @@ КонецФункции +Процедура УстановитьЯзыкМакета(Макет, КодЯзыка) + + Если ТипЗнч(Макет) <> Тип("ТабличныйДокумент") Тогда + Возврат; + КонецЕсли; + + ЭтоДополнительныйЯзыкПечатныхФорм = Ложь; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда + МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность"); + ЭтоДополнительныйЯзыкПечатныхФорм = МодульУправлениеПечатьюМультиязычность.ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка); + КонецЕсли; + + Если ЗначениеЗаполнено(КодЯзыка) И Не ЭтоДополнительныйЯзыкПечатныхФорм Тогда + Макет.КодЯзыка = КодЯзыка; + Иначе + Макет.КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка(); + КонецЕсли; + +КонецПроцедуры + +Процедура УдалитьМакет(ПутьКМакету, КодЯзыка = Неопределено) Экспорт + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Макет ""%1"" не существует. Операция прервана.'"), ПутьКМакету); + ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина); + Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ИмяМакета = ЧастиПути[ЧастиПути.ВГраница()]; + ЧастиПути.Удалить(ЧастиПути.ВГраница()); + ИмяОбъекта = СтрСоединить(ЧастиПути, "."); + + ТекстЗапроса = + "ВЫБРАТЬ + | ПользовательскиеМакетыПечати.ИмяМакета КАК ИмяМакета + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати + |ГДЕ + | ПользовательскиеМакетыПечати.Объект = &Объект + | И (ПользовательскиеМакетыПечати.ИмяМакета = &ИмяМакета + | ИЛИ ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета)"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("Объект", ИмяОбъекта); + Запрос.Параметры.Вставить("ИмяМакета", ИмяМакета); + Запрос.Параметры.Вставить("ШаблонИмениМакета", ИмяМакета + "_%"); + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПользовательскиеМакетыПечати"); + ЭлементБлокировки.УстановитьЗначение("Объект", ИмяОбъекта); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Выборка = Запрос.Выполнить().Выбрать(); + + НаборЗаписей = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Объект.Установить(ИмяОбъекта); + Пока Выборка.Следующий() Цикл + НаборЗаписей.Отбор.ИмяМакета.Установить(Выборка.ИмяМакета); + НаборЗаписей.Записать(); + КонецЦикла; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl index 47758005c..0219fe950 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -91,7 +91,7 @@ // Параметры: // ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета. // Возвращаемое значение: -// структура - ссылка макет. +// Структура - ссылка макет. // Функция ПолучитьМакетMSWord(Знач ДвоичныеДанныеМакета, Знач ИмяВременногоФайла) Экспорт @@ -153,7 +153,7 @@ // Закрывает соединение с COM объектом Word.Application. // Параметры: // Handler - ссылка на печатную форму или макет. -// ЗакрытьПриложение - булево - требуется ли закрыть приложение. +// ЗакрытьПриложение - Булево - требуется ли закрыть приложение. // Процедура ЗакрытьСоединение(Handler, Знач ЗакрытьПриложение) Экспорт @@ -347,7 +347,7 @@ // Параметры: // ПечатнаяФорма - ссылка на печатную форму. // ОбластьHandler - ссылка на область в макете. -// ПереходНаСледСтроку - булево - требуется ли вставлять разрыв после вывода области. +// ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // // Возвращаемое значение: // КоординатыОбласти @@ -414,9 +414,9 @@ // Параметры: // ПечатнаяФорма - ссылка на печатную форму. // ОбластьHandler - ссылка на область в макете. -// Параметры - строка - перечень параметров, которые требуется заменить. +// Параметры - Строка - перечень параметров, которые требуется заменить. // ДанныеОбъекта - ДанныеОбъекта -// ПереходНаСледСтроку - булево - требуется ли вставлять разрыв после вывода области. +// ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // Процедура ПрисоединитьИЗаполнитьНабор(Знач ПечатнаяФорма, Знач ОбластьHandler, @@ -456,7 +456,7 @@ // ОбластьHandler - ссылка на область в макете. // ИмяТаблицы - наименование таблицы (для доступа к данным). // ДанныеОбъекта - ДанныеОбъекта -// ПереходНаСледСтроку - булево - требуется ли вставлять разрыв после вывода области. +// ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // Процедура ПрисоединитьИЗаполнитьОбластьТаблицы(Знач ПечатнаяФорма, Знач ОбластьHandler, diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl index 66632832e..9faea4871 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -87,7 +87,7 @@ // Параметры: // ДвоичныеДанныеШаблона - ДвоичныеДанные - двоичные данные макета. // Возвращаемое значение: -// структура - ссылка макет. +// Структура - ссылка макет. // Функция ПолучитьМакетOOWriter(Знач ДвоичныеДанныеШаблона, ИмяВременногоФайла) Экспорт @@ -279,10 +279,7 @@ // Параметры: // ПечатнаяФорма - ссылка на печатную форму. // ОбластьHandler - ссылка на область в макете. -// ПереходНаСледСтроку - булево - требуется ли вставлять разрыв после вывода области. -// -// Возвращаемое значение: -// КоординатыОбласти +// ПереходНаСледСтроку - Булево - требуется ли вставлять разрыв после вывода области. // Процедура ПрисоединитьОбласть(Знач ПечатнаяФормаHandler, Знач ОбластьHandler, @@ -505,6 +502,7 @@ #ИначеЕсли Не МобильныйКлиент Тогда Возврат Новый COMSafeArray("VT_DISPATCH", 1); #КонецЕсли + Возврат Неопределено; КонецФункции diff --git a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl index 9fc4a2557..5f1cb69fa 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl @@ -21,7 +21,7 @@ // СоставДокументов - Массив - ссылки на объекты информационной базы (должны быть одного типа). // // Возвращаемое значение: -// Соответствие - коллекция ссылок на объекты и их данные: +// Соответствие из КлючИЗначение - коллекция ссылок на объекты и их данные: // * Ключ - ЛюбаяСсылка - ссылка на объект информационной базы; // * Значение - Структура: // ** Ключ - Строка - имя макета; diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl index a0e163b3f..a409c3870 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -13,7 +13,7 @@ // Параметры: // ИмяМенеджераПечати - Строка - менеджер печати для печатаемых объектов; // ИменаМакетов - Строка - идентификаторы печатных форм; -// МассивОбъектов - Ссылка +// МассивОбъектов - ЛюбаяСсылка // - Массив - объекты печати; // ВладелецФормы - ФормаКлиентскогоПриложения - форма, из которой выполняется печать; // ПараметрыПечати - Структура - произвольные параметры для передачи в менеджер печати. @@ -41,7 +41,7 @@ // Параметры: // ИмяМенеджераПечати - Строка - менеджер печати для печатаемых объектов; // ИменаМакетов - Строка - идентификаторы печатных форм; -// МассивОбъектов - Ссылка +// МассивОбъектов - ЛюбаяСсылка // - Массив - объекты печати; // ПараметрыПечати - Структура - произвольные параметры для передачи в менеджер печати. // @@ -83,7 +83,7 @@ Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда СписокПечати = Новый СписокЗначений; Для Каждого Макет Из ПечатныеФормы.ТабличныеДокументы Цикл - МакетПечати = СписокПечати.Добавить(ИменаМакетов,Макет.Представление); + СписокПечати.Добавить(ИменаМакетов, Макет.Представление); КонецЦикла; МодульУчетОригиналовПервичныхДокументовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УчетОригиналовПервичныхДокументовКлиент"); МодульУчетОригиналовПервичныхДокументовКлиент.ЗаписатьСостоянияОригиналовПослеПечати(ПечатныеФормы.ОбъектыПечати, СписокПечати); @@ -254,10 +254,10 @@ // * Экземпляров - Число - количество копий, которое необходимо вывести на печать; // * ПолныйПутьКМакету - Строка - используется для быстрого перехода к редактированию макета печатной формы; // * ИмяФайлаПечатнойФормы - Строка - имя файла; -// - Соответствие - имена файлов для каждого объекта: +// - Соответствие из КлючИЗначение - имена файлов для каждого объекта: // ** Ключ - ЛюбаяСсылка - ссылка на объект печати; // ** Значение - Строка - имя файла; -// * ОфисныеДокументы - Соответствие - коллекция печатных форм в формате офисных документов: +// * ОфисныеДокументы - Соответствие из КлючИЗначение - коллекция печатных форм в формате офисных документов: // ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы; // ** Значение - Строка - имя файла печатной формы. // @@ -743,6 +743,27 @@ КонецФункции +Процедура ПереключитьЯзык(Форма, Команда) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("Команда", Команда); + + Если Форма.Модифицированность Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ПриПереключенииЯзыка", ЭтотОбъект, Параметры); + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.ОК, НСтр("ru = 'Продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + + ТекстВопроса = НСтр("ru = 'Текущие изменения макета не записаны. Продолжить?'"); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена); + Иначе + ПриПереключенииЯзыка(КодВозвратаДиалога.ОК, Параметры); + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции @@ -764,4 +785,23 @@ Возврат НСтр("ru = 'Тип области не указан или указан некорректно.'"); КонецФункции +Процедура ПриПереключенииЯзыка(Ответ, Параметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.ОК Тогда + Возврат + КонецЕсли; + + Форма = Параметры.Форма; // ФормаКлиентскогоПриложения - + Команда = Параметры.Команда; // КомандаФормы - + + ВыбранныйЯзык = Сред(Команда.Имя, СтрДлина("Язык_") + 1); + Форма.ТекущийЯзык = ВыбранныйЯзык; + Форма.Элементы.Язык.Заголовок = Форма.Элементы[Команда.Имя].Заголовок; + Форма.Модифицированность = Ложь; + + ОписаниеОповещения = Новый ОписаниеОповещения("Подключаемый_ПриПереключенииЯзыка", Форма); + ВыполнитьОбработкуОповещения(ОписаниеОповещения, ВыбранныйЯзык); + +КонецПроцедуры + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl index 964a0ebc0..415800b8c 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиентСервер/Module.bsl @@ -20,6 +20,7 @@ Поля.Добавить("ПолныйПутьКМакету"); Поля.Добавить("ИмяФайлаПечатнойФормы"); Поля.Добавить("ОфисныеДокументы"); + Поля.Добавить("ДоступенВыводНаДругихЯзыках"); Возврат Поля; diff --git a/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl new file mode 100644 index 000000000..c49c22824 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/Module.bsl @@ -0,0 +1,253 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныйПрограммныйИнтерфейс + +// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Версия = "3.1.4.67"; + Обработчик.Процедура = "Справочники.ЯзыкиПечатныхФорм.ЗаполнитьПоставляемыеЯзыки"; + Обработчик.РежимВыполнения = "Оперативно"; + +КонецПроцедуры + +Функция ДоступныеЯзыки(СРегиональнымиНастройками = Ложь) Экспорт + + Возврат Справочники.ЯзыкиПечатныхФорм.ДоступныеЯзыки(СРегиональнымиНастройками); + +КонецФункции + +Функция ДополнительныеЯзыкиПечатныхФорм() Экспорт + + Возврат Справочники.ЯзыкиПечатныхФорм.ДополнительныеЯзыкиПечатныхФорм(); + +КонецФункции + +Функция ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка) Экспорт + + Возврат Справочники.ЯзыкиПечатныхФорм.ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка); + +КонецФункции + +Функция ПредставлениеЯзыка(КодЯзыка) Экспорт + + Возврат МультиязычностьСервер.ПредставлениеЯзыка(КодЯзыка); + +КонецФункции + +Функция ЯзыкиМакета(ПутьКМакету) Экспорт + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Макет ""%1"" не существует. Операция прервана.'"), ПутьКМакету); + ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина); + Если ЧастиПути.Количество() <> 2 И ЧастиПути.Количество() <> 3 Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + + ИмяМакета = ЧастиПути[ЧастиПути.ВГраница()]; + ЧастиПути.Удалить(ЧастиПути.ВГраница()); + ИмяОбъекта = СтрСоединить(ЧастиПути, "."); + + ЯзыкиПечатныхФорм = ДоступныеЯзыки(); + Для Каждого КодЯзыка Из ЯзыкиПечатныхФорм Цикл + Если СтрЗаканчиваетсяНа(ИмяМакета, "_" + КодЯзыка) Тогда + ИмяМакета = Лев(ИмяМакета, СтрДлина(ИмяМакета) - СтрДлина(КодЯзыка) - 1); + Прервать; + КонецЕсли; + КонецЦикла; + + ТекстЗапроса = + "ВЫБРАТЬ + | ПользовательскиеМакетыПечати.ИмяМакета КАК ИмяМакета + |ИЗ + | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати + |ГДЕ + | ПользовательскиеМакетыПечати.Объект = &Объект + | И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ШаблонИмениМакета + | И ПользовательскиеМакетыПечати.Использование"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.Параметры.Вставить("Объект", ИмяОбъекта); + Запрос.Параметры.Вставить("ШаблонИмениМакета", ИмяМакета + "_%"); + + Выборка = Запрос.Выполнить().Выбрать(); + НайденныеЯзыки = Новый Соответствие; + + Пока Выборка.Следующий() Цикл + Для Каждого КодЯзыка Из ЯзыкиПечатныхФорм Цикл + КодЛокализации = КодЯзыка; + Если СтрЗаканчиваетсяНа(Выборка.ИмяМакета, "_" + КодЛокализации) Тогда + НайденныеЯзыки.Вставить(КодЛокализации, Истина); + Продолжить; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ИменаПоиска = Новый Соответствие; + Для Каждого КодЯзыка Из ДополнительныеЯзыкиПечатныхФорм() Цикл + ИменаПоиска.Вставить(КодЯзыка, ИмяМакета + "_" + КодЯзыка); + КонецЦикла; + + ЭтоОбщийМакет = СтрРазделить(ИмяОбъекта, ".").Количество() = 1; + + КоллекцияМакетов = Метаданные.ОбщиеМакеты; + Если Не ЭтоОбщийМакет Тогда + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта); + Если ОбъектМетаданных = Неопределено Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + КоллекцияМакетов = ОбъектМетаданных.Макеты; + КонецЕсли; + + Для Каждого Элемент Из ИменаПоиска Цикл + ИмяПоиска = Элемент.Значение; + КодЯзыка = Элемент.Ключ; + Если КоллекцияМакетов.Найти(ИмяПоиска) <> Неопределено Тогда + НайденныеЯзыки.Вставить(КодЯзыка, Истина); + КонецЕсли; + КонецЦикла; + + Для Каждого КодЯзыка Из СтандартныеПодсистемыСервер.ЯзыкиКонфигурации() Цикл + НайденныеЯзыки.Вставить(КодЯзыка, Истина); + КонецЦикла; + + Результат = Новый Массив; + Для Каждого КодЯзыка Из ЯзыкиПечатныхФорм Цикл + Если НайденныеЯзыки[КодЯзыка] <> Неопределено Тогда + Результат.Добавить(КодЯзыка); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ПредставлениеЯзыковМакета(ИмяОбъектаМетаданныхМакета) Экспорт + + ПредставленияЯзыков = Новый Массив; + Для Каждого КодЯзыка Из ЯзыкиМакета(ИмяОбъектаМетаданныхМакета) Цикл + Если ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка) Тогда + ПредставленияЯзыков.Добавить(ПредставлениеЯзыка(КодЯзыка)); + КонецЕсли; + КонецЦикла; + + Возврат СтрСоединить(ПредставленияЯзыков, ", "); + +КонецФункции + +// Параметры: +// НаборЯзыков - ТаблицаЗначений: +// * КодЯзыка - Строка +// * Представление - Строка +// * Суффикс - Строка +// +Процедура ПриЗаполненииНабораЯзыков(НаборЯзыков) Экспорт + + ПредставленияЯзыков = Новый Соответствие; + Для Каждого ЯзыкКонфигурации Из Метаданные.Языки Цикл + ПредставленияЯзыков.Вставить(ЯзыкКонфигурации.КодЯзыка, ЯзыкКонфигурации.Представление()); + КонецЦикла; + + Для Каждого КодЯзыка Из ДоступныеЯзыки() Цикл + НовыйЯзык = НаборЯзыков.Добавить(); + НовыйЯзык.КодЯзыка = КодЯзыка; + ПредставлениеЯзыка = ПредставленияЯзыков[КодЯзыка]; + Если Не ЗначениеЗаполнено(ПредставлениеЯзыка) Тогда + ПредставлениеЯзыка = ПредставлениеЯзыка(КодЯзыка); + КонецЕсли; + НовыйЯзык.Представление = ПредставлениеЯзыка; + КонецЦикла; + +КонецПроцедуры + +Функция ИспользуютсяДополнительныеЯзыкиПечатныхФорм() Экспорт + + Возврат Справочники.ЯзыкиПечатныхФорм.ДополнительныеЯзыкиПечатныхФорм().Количество() > 0 + +КонецФункции + +// Параметры: +// Форма - ФормаКлиентскогоПриложения: +// * Элементы - ВсеЭлементыФормы: +// ** Язык - ГруппаФормы +// ТекущийЯзык - Строка +// Отбор - Массив из Строка +// +Процедура ЗаполнитьПодменюЯзык(Форма, ТекущийЯзык = Неопределено, Знач Отбор = Неопределено) Экспорт + + ИспользоватьРегиональныеПредставленияЯзыков = Истина; // Для формы печати. + Если Отбор = Неопределено Тогда + Отбор = ДоступныеЯзыки(); + ИспользоватьРегиональныеПредставленияЯзыков = Ложь; // Для формы редактирования. + КонецЕсли; + + Если Не ЗначениеЗаполнено(ТекущийЯзык) Тогда + ТекущийЯзык = ТекущийЯзык().КодЯзыка; + Если Отбор.Найти(ТекущийЯзык) = Неопределено Тогда + Для Каждого КодЯзыка Из Отбор Цикл + Если СтрНачинаетсяС(КодЯзыка, ТекущийЯзык) Тогда + ТекущийЯзык = КодЯзыка; + Прервать; + КонецЕсли; + КонецЦикла; + Если ЗначениеЗаполнено(Отбор) Тогда + ТекущийЯзык = Отбор[0]; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Элементы = Форма.Элементы; + Команды = Форма.Команды; + + Если Отбор.Количество() < 2 Тогда + Возврат; + КонецЕсли; + + Форма.ТекущийЯзык = ТекущийЯзык; + ДоступныеЯзыки = ДоступныеЯзыки(ИспользоватьРегиональныеПредставленияЯзыков); + + Элементы.Язык.Заголовок = ""; + + Для Каждого КодЛокализации Из ДоступныеЯзыки Цикл + КодЯзыка = СтрРазделить(КодЛокализации, "_", Истина)[0]; + Если Отбор.Найти(КодЯзыка) = Неопределено Тогда + Продолжить; + КонецЕсли; + + ПредставлениеЯзыка = ПредставлениеЯзыка(КодЛокализации); + Если Не ЗначениеЗаполнено(Элементы.Язык.Заголовок) И КодЯзыка = ТекущийЯзык Тогда + Элементы.Язык.Заголовок = ПредставлениеЯзыка; + КонецЕсли; + + Команда = Команды.Добавить("Язык_" + КодЛокализации); + Команда.Действие = "Подключаемый_ПереключитьЯзык"; + Команда.Заголовок = ПредставлениеЯзыка; + + КнопкаФормы = Элементы.Добавить(Команда.Имя, Тип("КнопкаФормы"), Элементы.Язык); + КнопкаФормы.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + КнопкаФормы.ИмяКоманды = Команда.Имя; + КнопкаФормы.Заголовок = ПредставлениеЯзыка; + КонецЦикла; + +КонецПроцедуры + +Функция ДоступенАвтоматическийПеревод(КодЯзыка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.ПереводТекста") Тогда + МодульПереводТекстаНаДругиеЯзыки = ОбщегоНазначения.ОбщийМодуль("ПереводТекстаНаДругиеЯзыки"); + Возврат ЭтоДополнительныйЯзыкПечатныхФорм(КодЯзыка) И МодульПереводТекстаНаДругиеЯзыки.ДоступенПереводТекста(); + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/УправлениеПечатьюМультиязычность.mdo b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/УправлениеПечатьюМультиязычность.mdo new file mode 100644 index 000000000..db29d969b --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюМультиязычность/УправлениеПечатьюМультиязычность.mdo @@ -0,0 +1,11 @@ + + + УправлениеПечатьюМультиязычность + + ru + Управление печатью мультиязычность + + true + true + true + diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl index f235c81ca..d73df3b8b 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -99,7 +99,7 @@ // Параметр не используется, если вывод печатных форм выполняется в формате офисных документов // (см. параметр "ОфисныеДокументы"); // -// * ОфисныеДокументы - Соответствие - коллекция печатных форм в формате офисных документов: +// * ОфисныеДокументы - Соответствие из КлючИЗначение - коллекция печатных форм в формате офисных документов: // ** Ключ - Строка - адрес во временном хранилище двоичных данных печатной формы; // ** Значение - Строка - имя файла печатной формы. // @@ -108,13 +108,17 @@ // По умолчанию имя файла устанавливается в формате // "[НазваниеПечатнойФормы] № [Номер] от [Дата]" для документов, // "[НазваниеПечатнойФормы] - [ПредставлениеОбъекта] - [ТекущаяДата]" для объектов. -// - Соответствие - имена файлов для каждого объекта: +// - Соответствие из КлючИЗначение - имена файлов для каждого объекта: // ** Ключ - ЛюбаяСсылка - ссылка на объект печати из коллекции МассивОбъектов; // ** Значение - Строка - имя файла; // // * Экземпляров - Число - количество копий, которое необходимо вывести на печать; // * ПолныйПутьКМакету - Строка - используется для быстрого перехода к редактированию макета печатной формы // в общей форме ПечатьДокументов; +// * ДоступенВыводНаДругихЯзыках - Булево - необходимо установить значение Истина, если печатная форма адаптирована +// для вывода на произвольном языке. Для вывода печатной формы на других +// языках необходимо +// // ОбъектыПечати - СписокЗначений - выходной параметр, соответствие между объектами и именами областей в табличных // документах, заполняется автоматически // при вызове УправлениеПечатью.ЗадатьОбластьПечатиДокумента: @@ -127,6 +131,9 @@ // ** Получатель - см. РаботаСПочтовымиСообщениямиКлиент.ПараметрыОтправкиПисьма.Получатель // ** Тема - см. РаботаСПочтовымиСообщениямиКлиент.ПараметрыОтправкиПисьма.Тема // ** Текст - см. РаботаСПочтовымиСообщениямиКлиент.ПараметрыОтправкиПисьма.Текст +// * КодЯзыка - Строка - язык, на котором требуется сформировать печатную форму. +// Состоит из кода языка по ISO 639-1 и, опционально, кода страны по ISO 3166-1, разделенных +// символом подчеркивания. Примеры: "en", "en_US", "en_GB", "ru", "ru_RU". // // * ЗаголовокФормы - Строка - переопределяет заголовок формы печати документов (ПечатьДокументов). // @@ -180,7 +187,7 @@ // // Параметры: // Документы - Массив - коллекция ссылок на объекты печати; -// ПодписиИПечати - Соответствие - коллекция объектов печати и комплектов подписей/печатей к ним: +// ПодписиИПечати - Соответствие из КлючИЗначение - коллекция объектов печати и комплектов подписей/печатей к ним: // * Ключ - ЛюбаяСсылка - ссылка на объект печати; // * Значение - Структура - комплект подписей и печатей: // ** Ключ - Строка - идентификатор подписи или печати в макете печатной формы, diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl index bd55593d1..f58ca0ede 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебный/Module.bsl @@ -8,6 +8,8 @@ #Область СлужебныеПроцедурыИФункции +#Область ПечатьВФорматеOfficeOpenXML + ////////////////////////////////////////////////////////////////////////////////// // Печать с использованием макетов в формате Office Open XML. // @@ -421,7 +423,7 @@ #Область РаботаСоСтруктуройДокумента // Возвращаемое значение: -// Структура: +// Структура: // * ИдентификаторДокумента - Строка // * РасширенияКартинок - Массив // * КаталогКартинок - Строка @@ -429,7 +431,7 @@ // * СвязиКонтента - Строка // * ТипыКонтента - Строка // * ПрисоединенныеОбласти - Массив -// * Колонтитулы - Соответствие: +// * Колонтитулы - Соответствие из КлючИЗначение: // ** Ключ - Строка // ** Значение - см. ОбластьКолонтитула // * Разделы - Соответствие @@ -483,7 +485,7 @@ КонецФункции // Возвращаемое значение: -// Структура: +// Структура: // * НомерРаздела - Число // * Текст - Строка // * ИмяВнутр - Строка @@ -3134,3 +3136,5 @@ КонецФункции #КонецОбласти + +#КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl index af46cbce7..ebb561005 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl @@ -11,7 +11,7 @@ // Обработчик подключенной команды. // // Параметры: -// МассивСсылок - Массив Из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. +// МассивСсылок - Массив из ЛюбаяСсылка - ссылки выбранных объектов, для которых выполняется команда. // ПараметрыВыполнения - см. ПодключаемыеКомандыКлиент.ПараметрыВыполненияКоманды // Процедура ОбработчикКоманды(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт @@ -49,7 +49,7 @@ // НастройкиФормата - Структура: // * УпаковатьВАрхив - Булево - признак необходимости упаковки вложений в архив. // * ФорматыСохранения - Массив - список выбранных форматов вложений. -// Оповещение - ОписаниеОповещения - - оповещение, которое вызывается после закрытие формы для обработки +// Оповещение - ОписаниеОповещения - оповещение, которое вызывается после закрытие формы для обработки // результатов выбора. // Процедура ОткрытьФормуВыбораФорматаВложений(НастройкиФормата, Оповещение) Экспорт @@ -100,7 +100,7 @@ ОписаниеКоманды.Вставить("Форма", Форма); ИмяОбработчика = ОписаниеКоманды.Обработчик; Если СтрЧислоВхождений(ИмяОбработчика, ".") = 0 И ЭтоОтчетИлиОбработка(ОписаниеКоманды.МенеджерПечати) Тогда - ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина); + ОсновнаяФорма = ПолучитьФорму(ОписаниеКоманды.МенеджерПечати + ".Форма", , Форма, Истина); // АПК: ИмяОбработчика = "ОсновнаяФорма." + ИмяОбработчика; КонецЕсли; Обработчик = ИмяОбработчика + "(ОписаниеКоманды)"; diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl index 91c397e83..4c1f06ae8 100644 --- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -874,7 +874,7 @@ // Возвращает дополнительные реквизиты и сведения у указанного объекта. // // Параметры: -// ВладелецСвойств - Ссылка - например: СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... +// ВладелецСвойств - ЛюбаяСсылка - например: СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // - Объект - например: СправочникОбъект.Номенклатура, ДокументОбъект.ЗаказПокупателя, ... // - ДанныеФормыСтруктура - коллекция по типу объекта владельца свойств. // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. @@ -951,18 +951,27 @@ // которых следует получить. // * Строка - уникальное имя дополнительного свойства. // - Неопределено - по умолчанию, получить значения всех свойств владельца. +// КодЯзыка - Строка - код языка, на котором будет получено представление значения свойства. +// Если не указано - берется текущий язык. // // Возвращаемое значение: // ТаблицаЗначений: -// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца. -// * Значение - Произвольный - значения любого типа из описания типов свойства объекта метаданных: -// "Метаданные.ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Тип". +// * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца. +// * ИмяСвойства - Строка - уникальное имя свойства владельца. +// * Значение - Произвольный - значения любого типа из описания типов свойства объекта метаданных: +// "Метаданные.ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Тип". +// * Представление - Строка - представление значения на указанном языке. // * ВладелецСвойств - ЛюбаяСсылка - ссылка на объект. // Функция ЗначенияСвойств(ОбъектыСоСвойствами, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина, - Свойства = Неопределено) Экспорт + Свойства = Неопределено, + КодЯзыка = "") Экспорт + + Если Не СвойстваДоступны() Тогда + Возврат Новый ТаблицаЗначений; + КонецЕсли; ПолучатьДопСведения = ПолучатьДопСведения И ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ДополнительныеСведения); @@ -983,7 +992,8 @@ | ТаблицаСвойств.Свойство КАК Свойство, | ТаблицаСвойств.Значение КАК Значение, | ТаблицаСвойств.ТекстоваяСтрока, - | ТаблицаСвойств.Ссылка КАК ВладелецСвойств + | ТаблицаСвойств.Ссылка КАК ВладелецСвойств, + | ДополнительныеРеквизитыИСведения.Имя КАК ИмяСвойства |ИЗ | &ИмяОбъектаСоСвойствами КАК ТаблицаСвойств | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения @@ -998,7 +1008,8 @@ | ТаблицаСвойств.Свойство КАК Свойство, | ТаблицаСвойств.Значение КАК Значение, | """" КАК ТекстоваяСтрока, - | ТаблицаСвойств.Объект КАК ВладелецСвойств + | ТаблицаСвойств.Объект КАК ВладелецСвойств, + | ДополнительныеРеквизитыИСведения.Имя КАК ИмяСвойства |ИЗ | РегистрСведений.ДополнительныеСведения КАК ТаблицаСвойств | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения @@ -1014,7 +1025,7 @@ ТекстЗапроса = ТекстЗапросаДопРеквизиты + " | | ОБЪЕДИНИТЬ ВСЕ - |" + СтрЗаменить(ТекстЗапросаДопСведения, "РАЗРЕШЕННЫЕ", ""); + |" + СтрЗаменить(ТекстЗапросаДопСведения, "РАЗРЕШЕННЫЕ", ""); // @Query-part-1, @Query-part-2 ИначеЕсли ПолучатьДопРеквизиты Тогда ТекстЗапроса = ТекстЗапросаДопРеквизиты; @@ -1030,13 +1041,18 @@ Запрос.Текст = ТекстЗапроса; Результат = Запрос.Выполнить().Выгрузить(); + Результат.Колонки.Добавить("Представление"); РезультатСТекстовымиСтроками = Неопределено; ИндексСтроки = 0; Для каждого ЗначениеСвойства Из Результат Цикл + ЗначениеСвойства.Представление = ПредставлениеЗначения(ЗначениеСвойства.Значение, + КодЯзыка, + ФорматСвойства(ЗначениеСвойства.Свойство)); + ТекстоваяСтрока = ЗначениеСвойства.ТекстоваяСтрока; Если Не ПустаяСтрока(ТекстоваяСтрока) Тогда Если РезультатСТекстовымиСтроками = Неопределено Тогда - РезультатСТекстовымиСтроками = Результат.Скопировать(,"Свойство, ВладелецСвойств"); + РезультатСТекстовымиСтроками = Результат.Скопировать(,"Свойство, ВладелецСвойств, ИмяСвойства, Представление"); РезультатСТекстовымиСтроками.Колонки.Добавить("Значение"); РезультатСТекстовымиСтроками.ЗагрузитьКолонку(Результат.ВыгрузитьКолонку("Значение"), "Значение"); КонецЕсли; @@ -1056,23 +1072,29 @@ // Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на // дополнительный реквизит, значение которого нужно получить. // - Строка - имя дополнительного свойства. +// КодЯзыка - Строка - если указано, то вместо значения дополнительного свойства будет +// возвращено его представление на указанном языке. // // Возвращаемое значение: // Произвольный - любое значение, допустимое для свойства. // -Функция ЗначениеСвойства(Объект, Свойство) Экспорт +Функция ЗначениеСвойства(Объект, Свойство, КодЯзыка = "") Экспорт ПолучатьРеквизиты = УправлениеСвойствамиСлужебный.ЭтоОбъектМетаданныхСДополнительнымиРеквизитами(Объект.Метаданные()); - Результат = ЗначенияСвойств(Объект, ПолучатьРеквизиты, Истина, Свойство); + Результат = ЗначенияСвойств(Объект, ПолучатьРеквизиты, Истина, Свойство, КодЯзыка); Если Результат.Количество() = 1 Тогда - Возврат Результат[0].Значение; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Возврат Результат[0].Представление; + Иначе + Возврат Результат[0].Значение; + КонецЕсли; КонецЕсли; КонецФункции // Проверяет, есть ли у объекта свойство. // // Параметры: -// ВладелецСвойств - Ссылка - например: СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... +// ВладелецСвойств - ЛюбаяСсылка - например: СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - проверяемое свойство. // // Возвращаемое значение: @@ -1094,7 +1116,7 @@ // Изменения происходят в транзакции. // // Параметры: -// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д. +// ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д. // ТаблицаСвойствИЗначений - ТаблицаЗначений: // * Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца. // * Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства). @@ -1213,7 +1235,7 @@ // Проверяет, используются ли дополнительные сведения объектом. // // Параметры: -// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... +// ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // // Возвращаемое значение: // Булево - если Истина, тогда дополнительные сведения используются. @@ -1234,6 +1256,74 @@ Возврат ПравоДоступа("Чтение", Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений); КонецФункции +// Возвращает представление значения дополнительного свойства объекта +// на требуемом языке. +// +// Параметры: +// Объект - ЛюбаяСсылка - ссылка на объект, например, СправочникСсылка.Номенклатура, +// ДокументСсылка.ЗаказПокупателя, ... +// Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на +// дополнительный реквизит, значение которого нужно получить. +// - Строка - имя дополнительного свойства. +// КодЯзыка - Строка - код языка, на котором нужно получить представление. +// +// Возвращаемое значение: +// Строка +// +Функция ПредставлениеЗначенияСвойства(Объект, Свойство, КодЯзыка = "") Экспорт + Представление = ЗначениеСвойства(Объект, Свойство, КодЯзыка); + Возврат Представление; +КонецФункции + +// Возвращает значения дополнительных свойств объектов. +// Подходит для подстановки параметров при формировании печатных форм. +// +// Параметры: +// ОбъектыСоСвойствами - Массив - объекты, для которых нужно получить значения дополнительных свойств. +// - ЛюбаяСсылка - ссылка на объект, например, СправочникСсылка.Номенклатура, +// ДокументСсылка.ЗаказПокупателя, ... +// КодЯзыка - Строка - код языка, на котором нужно получить представление. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение: +// * Ключ - ЛюбаяСсылка - ссылка на объект. +// * Значение - Структура: +// * Ключ - Строка - имя свойства. +// * Значение - Строка - представление свойства на переданном языке. +// +Функция ПредставленияЗначенийСвойств(ОбъектыСоСвойствами, КодЯзыка = "") Экспорт + ЗначенияСвойств = ЗначенияСвойств(ОбъектыСоСвойствами, Истина, Истина, Неопределено, КодЯзыка); + + Результат = Новый Соответствие; + + Для Каждого ЗначениеСвойства Из ЗначенияСвойств Цикл + Если Результат[ЗначениеСвойства.ВладелецСвойств] = Неопределено Тогда + Результат.Вставить(ЗначениеСвойства.ВладелецСвойств, Новый Структура); + КонецЕсли; + + ИмяСвойства = ЗначениеСвойства.ИмяСвойства; + ПервыйСимвол = Лев(ЗначениеСвойства.ИмяСвойства, 1); + Если СтрНайти("0123456789", ПервыйСимвол) > 0 Тогда + ИмяСвойства = "_" + ИмяСвойства; + КонецЕсли; + Результат[ЗначениеСвойства.ВладелецСвойств].Вставить(ИмяСвойства, ЗначениеСвойства.Представление); + КонецЦикла; + + Если ТипЗнч(ОбъектыСоСвойствами) = Тип("Массив") Тогда + Для Каждого ОбъектСоСвойствами Из ОбъектыСоСвойствами Цикл + Если Результат[ОбъектСоСвойствами] = Неопределено Тогда + Результат[ОбъектСоСвойствами] = Новый Структура; + КонецЕсли; + КонецЦикла; + Иначе + Если Результат[ОбъектСоСвойствами] = Неопределено Тогда + Результат[ОбъектСоСвойствами] = Новый Структура; + КонецЕсли; + КонецЕсли; + + Возврат Результат; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы. @@ -1292,7 +1382,7 @@ ВыборкаСвойств = ЗапросСвойств.Выполнить().Выбрать(); Пока ВыборкаСвойств.Следующий() Цикл - Объект = ВыборкаСвойств.Ссылка.ПолучитьОбъект(); + Объект = ВыборкаСвойств.Ссылка.ПолучитьОбъект(); // ПланВидовХарактеристикОбъект.ДополнительныеРеквизитыИСведения Объект.Наименование = Объект.Заголовок; Объект.ПометкаУдаления = ВыборкаСвойств.ПометкаУдаленияНабора; ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); @@ -1354,7 +1444,7 @@ // Возвращает значения дополнительных свойств объекта. // // Параметры: -// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... +// ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. // МассивСвойств - Массив - свойства: @@ -1380,7 +1470,7 @@ // Возвращает свойства владельца. // // Параметры: -// ВладелецСвойств - Ссылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... +// ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя, ... // ПолучатьДопРеквизиты - Булево - в результат включать дополнительные реквизиты. // ПолучатьДопСведения - Булево - в результат включать дополнительные сведения. // @@ -1665,12 +1755,12 @@ Если Родитель.Вид = ВидГруппыФормы.Страница Тогда Возврат Родитель; Иначе - СтраницаРодитель(Родитель); + Возврат СтраницаРодитель(Родитель); КонецЕсли; - Иначе - Возврат Неопределено; КонецЕсли; + Возврат Неопределено; + КонецФункции Процедура ОбновитьКлючНазначенияФормы(Форма, КлючНазначения) @@ -1837,4 +1927,59 @@ КонецПроцедуры +Функция ПредставлениеЗначения(Значение, КодЯзыка, ФорматСвойства) + + Если Значение = Неопределено Тогда + Возврат Значение; + КонецЕсли; + + Если ТипЗнч(Значение) = Тип("Строка") Тогда + Представление = Значение; + ИначеЕсли ТипЗнч(Значение) = Тип("Булево") + Или ТипЗнч(Значение) = Тип("Дата") + Или ТипЗнч(Значение) = Тип("Число") Тогда + Если ЗначениеЗаполнено(ФорматСвойства) Тогда + Если СтрНайти(ФорматСвойства, "Л=''") > 0 Тогда + ФорматСвойства = СтрЗаменить(ФорматСвойства, "Л=''", "Л=" + КодЯзыка); + ИначеЕсли СтрНайти(ФорматСвойства, "Л=") = 0 Тогда + ФорматСвойства = "Л=" + КодЯзыка + ";" + ФорматСвойства; + КонецЕсли; + Представление = Формат(Значение, ФорматСвойства); + Иначе + Представление = Формат(Значение, "Л=" + КодЯзыка); + КонецЕсли; + Иначе + Представление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Значение, "Наименование", , КодЯзыка); + КонецЕсли; + + Возврат Представление; + +КонецФункции + +Функция ФорматСвойства(Свойство) + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Свойство", Свойство); + Запрос.Текст = + "ВЫБРАТЬ + | ДополнительныеРеквизитыИСведения.ФорматСвойства КАК ФорматСвойства + |ИЗ + | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения + |ГДЕ + | &Условие"; + Если ТипЗнч(Свойство) = Тип("Строка") Тогда + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ДополнительныеРеквизитыИСведения.Имя = &Свойство"); + Иначе + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", "ДополнительныеРеквизитыИСведения.Ссылка = &Свойство"); + КонецЕсли; + + Результат = Запрос.Выполнить().Выгрузить(); + Если Результат.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Результат[0].ФорматСвойства; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl index 4d53fe151..5d07792ac 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиПереопределяемый/Module.bsl @@ -36,7 +36,7 @@ // Получает наименования наборов свойств второго уровня на разных языках. // // Параметры: -// Наименования - Соответствие - представление набора на переданном языке: +// Наименования - Соответствие из КлючИЗначение - представление набора на переданном языке: // * Ключ - Строка - имя набора свойств. Например, "Справочник_Партнеры_Общие". // * Значение - Строка - наименование набора для переданного кода языка. // КодЯзыка - Строка - код языка. Например, "en". @@ -100,7 +100,7 @@ // отдельно для разного состава наборов. // Например, для каждого вида номенклатуры - свой состав наборов. // -// - Строка - (не более 32 символа) - использовать указанный ключ +// - Строка - (не более 32 символа) - использовать указанный ключ // назначения для добавления к значениям свойств формы. // Пустая строка - не изменять свойства ключей формы, т.к. они // устанавливается в форме и уже учитывают различия состава наборов. diff --git a/SSL/src/CommonModules/УправлениеСвойствамиПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиПовтИсп/Module.bsl index 63e3a8ae7..898ad96af 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиПовтИсп/Module.bsl @@ -11,7 +11,7 @@ // Только для внутреннего использования. // // Возвращаемое значение: -// ФиксированноеСоответствие: +// ФиксированноеСоответствие из КлючИЗначение: // * Ключ - Строка // - СправочникСсылка.НаборыДополнительныхРеквизитовИСведений // * Значение - см. Справочники.НаборыДополнительныхРеквизитовИСведений.СвойстваНабора diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl index 36d8eebb8..c4be1662e 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl @@ -162,10 +162,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -188,13 +184,12 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "3.1.3.294"; + Обработчик.Версия = "3.1.4.18"; Обработчик.Идентификатор = Новый УникальныйИдентификатор("ecd6aad4-4b04-43be-82bc-cd4f563beb0b"); Обработчик.Процедура = "ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ОбработатьДанныеДляПереходаНаНовуюВерсию"; Обработчик.Комментарий = НСтр("ru = 'Заполняет уникальное имя и обновляет зависимости дополнительных реквизитов и сведений. |Редактирование дополнительных реквизитов и сведений будет недоступно до завершения обновления.'"); Обработчик.РежимВыполнения = "Отложенно"; - Обработчик.ОчередьОтложеннойОбработки = 1; Обработчик.ПроцедураЗаполненияДанныхОбновления = "ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию"; Обработчик.ЧитаемыеОбъекты = "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"; Обработчик.ИзменяемыеОбъекты = "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"; @@ -226,11 +221,6 @@ КонецПроцедуры // См. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта -// -// Параметры: -// Объект - см. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта.Объект -// ДополнительныеРеквизиты - см. ВерсионированиеОбъектовПереопределяемый.ПриПодготовкеДанныхОбъекта.ДополнительныеРеквизиты -// Процедура ПриПодготовкеДанныхОбъекта(Объект, ДополнительныеРеквизиты) Экспорт ПолучатьДопРеквизиты = УправлениеСвойствами.ИспользоватьДопРеквизиты(Объект.Ссылка); @@ -246,11 +236,7 @@ КонецПроцедуры -// Восстанавливает значения реквизитов объекта, хранящихся отдельно от объекта. -// Параметры: -// Объект - см. ВерсионированиеОбъектовПереопределяемый.ПриВосстановленииВерсииОбъекта.Объект -// ДополнительныеРеквизиты - см. ВерсионированиеОбъектовПереопределяемый.ПриВосстановленииВерсииОбъекта.ДополнительныеРеквизиты -// +// См. ВерсионированиеОбъектовПереопределяемый.ПриВосстановленииВерсииОбъекта. Процедура ПриВосстановленииВерсииОбъекта(Объект, ДополнительныеРеквизиты) Экспорт Для Каждого Реквизит Из ДополнительныеРеквизиты Цикл @@ -273,22 +259,14 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок. -// -// Параметры: -// Массив - см. ОбщегоНазначенияПереопределяемый.ПриДобавленииИсключенийПоискаСсылок.ИсключенияПоискаСсылок -// -Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт +Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт - Массив.Добавить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя()); - Массив.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТабличнаяЧасть.ЗависимостиДополнительныхРеквизитов.Реквизит.Значение"); + ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений.ПолноеИмя()); + ИсключенияПоискаСсылок.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ТабличнаяЧасть.ЗависимостиДополнительныхРеквизитов.Реквизит.Значение"); КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа. -// -// Параметры: -// ВидыДоступа - см. УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа.ВидыДоступа -// Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт ВидДоступа = ВидыДоступа.Добавить(); @@ -348,10 +326,6 @@ КонецПроцедуры // См. ОбщегоНазначенияПереопределяемый.ПриОпределенииПодчиненныхОбъектов -// -// Параметры: -// ПодчиненныеОбъекты - см. ОбщегоНазначения.ПодчиненныеОбъекты -// Процедура ПриОпределенииПодчиненныхОбъектов(ПодчиненныеОбъекты) Экспорт ПодчиненныйОбъект = ПодчиненныеОбъекты.Добавить(); @@ -368,14 +342,16 @@ КонецПроцедуры +// АПК:299-выкл программно вызываемая процедур +// // Вызывается при замене дублей в реквизитах элементов. // // Параметры: -// ПарыЗамен - Соответствие - содержит пары значений оригинал и дубль. -// НеобработанныеЗначенияОригиналов - Массив из Структура: -// * ЗаменяемоеЗначение - ЛюбаяСсылка - оригинальное значение заменяемого объекта. -// * ИспользуемыеСвязи - см. ПоискИУдалениеДублей.СвязиПодчиненныхОбъектовПоТипам. -// * ЗначениеКлючевыхРеквизитов - Структура - Ключ - имя реквизита, значение - значение реквизита. +// ПарыЗамен - Соответствие - содержит пары значений оригинал и дубль. +// НеобработанныеЗначенияОригиналов - Массив из Структура: +// * ЗаменяемоеЗначение - ЛюбаяСсылка - оригинальное значение заменяемого объекта. +// * ИспользуемыеСвязи - см. ПоискИУдалениеДублей.СвязиПодчиненныхОбъектовПоТипам. +// * ЗначениеКлючевыхРеквизитов - Структура - Ключ - имя реквизита, значение - значение реквизита. // Процедура ПриПоискеЗаменыСсылок(ПарыЗамен, НеобработанныеЗначенияОригиналов) Экспорт @@ -409,6 +385,7 @@ КонецЦикла; КонецПроцедуры +// АПК:299-вкл #КонецОбласти @@ -763,7 +740,7 @@ // - ЗадачаОбъектИмяЗадачи // - ПланВидовРасчетаОбъектИмяПланаВидовРасчета // - ПланСчетовОбъектИмяПланаСчетов -// - ДанныеФормыСтруктура - объект со свойствами: +// - ДанныеФормыСтруктура: // * Ссылка - ЛюбаяСсылка // КлючНазначения - Строка // @@ -821,9 +798,9 @@ // Возвращает заполненную таблицу значений свойств объекта. // // Параметры: -// ДополнительныеСвойстваОбъекта - ТаблицаЗначений -// Наборы - ТаблицаЗначений -// ЭтоДополнительноеСведение - Булево +// ДополнительныеСвойстваОбъекта - ТаблицаЗначений +// Наборы - ТаблицаЗначений +// ЭтоДополнительноеСведение - Булево // Функция ЗначенияСвойств(ДополнительныеСвойстваОбъекта, Наборы, ЭтоДополнительноеСведение) Экспорт @@ -1449,8 +1426,6 @@ // Функция НаименованиеПредопределенногоНабора(Набор) Экспорт - ПредопределенныеНаборыСвойств = УправлениеСвойствамиПовтИсп.ПредопределенныеНаборыСвойств(); - Если ТипЗнч(Набор) = Тип("Строка") Тогда ИмяПредопределенного = Набор; Иначе @@ -1584,9 +1559,7 @@ // которого нужно получить перечисляемые значения. // // Возвращаемое значение: -// Массив - значения: -// * СправочникСсылка.ЗначенияСвойствОбъектов, СправочникСсылка.ЗначенияСвойствОбъектовИерархия - значения -// свойства, если есть. +// Массив из СправочникСсылка - значения свойства, если есть. // Функция ДополнительныеЗначенияСвойства(Свойство) Экспорт @@ -1622,7 +1595,7 @@ Функция ЛокализованныеЗначенияРеквизитов(Ссылка, Реквизиты) Экспорт ТекстЗапроса = "ВЫБРАТЬ - |%1 + |&ТекстВставки | |ИЗ | ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК Таблица @@ -1643,7 +1616,7 @@ КонецЕсли; КонецЦикла; - ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗапроса, ТекстВставки); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстВставки", ТекстВставки); Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("КодЯзыка", ТекущийЯзык().КодЯзыка); diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl index 622440f76..8f33bb3d8 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl @@ -8,14 +8,7 @@ #Область СлужебныйПрограммныйИнтерфейс -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем конфигурации. - -// Возникает при получении списка шаблонов регламентных заданий -// -// Параметры: -// ШаблоныЗаданий - Массив - в него добавляются имена регламентных заданий. -// +// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов. Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт ШаблоныЗаданий.Добавить("ПолучениеИОтправкаЭлектронныхПисем"); @@ -76,7 +69,7 @@ НСтр("ru = 'Начато регламентное получение и отправка электронной почты'", ОбщегоНазначения.КодОсновногоЯзыка())); ПолученныеПисьма = ПолученныеПисьма(); - УчетнаяЗапись = ЗагрузитьЭлектронныеПисьма(ПолученныеПисьма); + ЗагрузитьЭлектронныеПисьма(ПолученныеПисьма); ОтправитьЭлектронныеПисьма(ПолученныеПисьма.ПисьмаДляОпределенияПапок, ПолученныеПисьма.ВсеПолученныеПисьма); Взаимодействия.ЗаполнитьКонтактыМассиваВзаимодействий(ПолученныеПисьма.ВсеПолученныеПисьма); @@ -396,17 +389,18 @@ ПредставлениеОшибочныхАдресатов = РезультатАнализа.ПредставлениеОшибочныхАдресатов; Если Не ВсеАдресатыПисьмаОтвергнутыСервером Тогда - ШаблонСообщенияОбОшибке = НСтр("ru = 'Следующие адресаты письма %1 не приняты почтовым сервером: + ШаблонСообщенияОбОшибке = НСтр("ru = 'Следующие адресаты письма ""%1"" не приняты почтовым сервером: |%2. Письмо отправлено остальным адресатам.'", ОбщегоНазначения.КодОсновногоЯзыка()); Иначе - ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось отправить письмо %1. + ШаблонСообщенияОбОшибке = НСтр("ru = 'Не удалось отправить письмо ""%1"". |Следующие адресаты письма не приняты почтовым сервером: |%2.'", ОбщегоНазначения.КодОсновногоЯзыка()); КонецЕсли; ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщенияОбОшибке, ПараметрыОбработкиОшибки.ПредставлениеПисьма, ПредставлениеОшибочныхАдресатов); - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка, , , ТекстСообщенияОбОшибке); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,, + ПараметрыОбработкиОшибки.Ссылка, ТекстСообщенияОбОшибке); Результат.ТекстСообщения = ТекстСообщенияОбОшибке; @@ -2589,7 +2583,7 @@ // - ДокументСсылка.ЭлектронноеПисьмоИсходящее - // письмо, чье вложение записывается. // АдресВоВременномХранилище - Строка - адрес, по которому во временном хранилище находится вложение. -// ПараметрыВложения - Структура - содержит: +// ПараметрыВложения - Структура: // * ИмяФайла - Строка - имя файла-вложения. // * ИДФайлаЭлектронногоПисьма - Строка - идентификатор вложения. // * ЭтоВложениеПисьмо - Булево - определяет, является ли это вложение письмом. @@ -2608,7 +2602,7 @@ ИмяФайлаДляРазбора = ПараметрыВложения.ИмяФайла; РасширениеБезТочки = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайлаДляРазбора); - ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаДляРазбора); + ИмяБезРасширения = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайлаДляРазбора); Если ПустаяСтрока(ИмяБезРасширения) Тогда @@ -2753,7 +2747,7 @@ // Получает учетную запись электронной почты используемую для отправки по умолчанию. // // Возвращаемое значение: -// Справочник.УчетныеЗаписиЭлектроннойПочты - учетная запись для отправки по умолчанию. +// СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись для отправки по умолчанию. // Функция ПолучитьУчетнуюЗаписьДляОтправкиПоУмолчанию() Экспорт @@ -2903,7 +2897,7 @@ // перечисления ВариантыВажностиВзаимодействия. // // Параметры: -// ВажностьВзаимодействия - Перечисление.ВариантыВажностиВзаимодействия. +// ВажностьВзаимодействия - ПеречислениеСсылка.ВариантыВажностиВзаимодействия. // // Возвращаемое значение: // ВажностьИнтернетПочтовогоСообщения diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl index 66a639828..e69304833 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументов/Module.bsl @@ -13,8 +13,8 @@ // Обработчик события "ПриСозданииНаСервере" формы документа. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. -// Расположение - ЭлементФормы - группа, в которой будет располагаться надпись о текущем состоянии оригинала. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. +// Расположение - ГруппаФормы - группа, в которой будет располагаться надпись о текущем состоянии оригинала. // Если Неопределено, тогда надпись будет расположена в нижнем правом углу формы. Необязательный. // Процедура ПриСозданииНаСервере_ФормаДокумента(Форма, Расположение = Неопределено) Экспорт @@ -53,7 +53,7 @@ Если ЗначениеЗаполнено(Форма.Объект.Ссылка) Тогда ТекущиеСостояниеОригинала = СведенияОСостоянииОригиналаПоСсылке(Форма.Объект.Ссылка); - Если ПустаяСтрока(ТекущиеСостояниеОригинала) Тогда + Если ТекущиеСостояниеОригинала.Количество() = 0 Тогда ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'"); ДекорацияСостояниеОригинала.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет; Иначе @@ -71,9 +71,9 @@ // Обработчик события "ПриСозданииНаСервере" формы списка. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. -// Список - ЭлементФормы - основной список формы. -// Расположение - ЭлементФормы - колонка списка, перед которой будут располагаться новые колонки состояний. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. +// Список - ТаблицаФормы - основной список формы. +// Расположение - ПолеФормы - колонка списка, перед которой будут располагаться новые колонки состояний. // Если Неопределено, тогда колонки будут расположены в конце списка. Необязательный. // Процедура ПриСозданииНаСервере_ФормаСписка(Форма, Список, Расположение = Неопределено) Экспорт @@ -123,7 +123,7 @@ // Обработчик события "ПриПолученииДанныхНаСервере" формы списка. // // Параметры: -// СтрокиСписка - УправляемаяФорма - форма списка документа. +// СтрокиСписка - ДанныеФормыКоллекция - строки списка формы. // Процедура ПриПолученииДанныхНаСервере(СтрокиСписка) Экспорт @@ -134,7 +134,8 @@ Для Каждого Строка Из СтрокиСписка Цикл Строка = СтрокиСписка[Строка.Ключ]; - Если Строка.Оформление.Получить("СостояниеОригиналаПервичногоДокумента") = Неопределено Тогда + Если Строка.Оформление.Получить("СостояниеОригиналаПервичногоДокумента") = Неопределено + Или Строка.Оформление.Получить("СостояниеОригиналПолучен") = Неопределено Тогда Возврат КонецЕсли; Прервать; @@ -155,12 +156,12 @@ | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК СостояниеОригиналПолучен, - | СостоянияОригиналовПервичныхДокументов.Ссылка КАК Ссылка + | СостоянияОригиналовПервичныхДокументов.Владелец КАК Ссылка |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ | СостоянияОригиналовПервичныхДокументов.ОбщееСостояние - | И СостоянияОригиналовПервичныхДокументов.Ссылка В(&Ссылка)"; + | И СостоянияОригиналовПервичныхДокументов.Владелец В(&Ссылка)"; Запрос.УстановитьПараметр("Ссылка",Ссылки); Выборка = Запрос.Выполнить().Выбрать(); @@ -184,8 +185,8 @@ // Обновляет команды установки состояния оригинала на форме списка. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. -// Список - ЭлементФормы - основной список формы. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. +// Список - ТаблицаФормы - основной список формы. // Процедура ОбновитьКомандыСостоянияОригинала(Форма, Список) Экспорт @@ -212,8 +213,8 @@ // Устанавливает условное форматирование для подключаемых элементов в списке. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. -// Список - ЭлементФормы - основной список формы. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. +// Список - ТаблицаФормы - основной список формы. // Процедура УстановитьУсловноеОформлениеВФормеСписка(Форма, Список) Экспорт @@ -249,6 +250,10 @@ КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +// +// Параметры: +// ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа +// Процедура ДополнитьПрофильРольюДляИзмененияСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт ОписаниеПрофиля.Роли.Добавить("ИзменениеСостоянийОригиналовПервичныхДокументов"); @@ -256,6 +261,10 @@ КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +// +// Параметры: +// ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа +// Процедура ДополнитьПрофильРольюДляНастройкиСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт ОписаниеПрофиля.Роли.Добавить("ДобавлениеИзменениеСостоянийОригиналовПервичныхДокументов"); @@ -263,6 +272,10 @@ КонецПроцедуры // См. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. +// +// Параметры: +// ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа +// Процедура ДополнитьПрофильРольюДляЧтенияСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт ОписаниеПрофиля.Роли.Добавить("ЧтениеСостоянийОригиналовПервичныхДокументов"); @@ -272,7 +285,8 @@ // Возвращает массив всех состояний. // // Возвращаемое значение: -// Массив - все возможные состояния оригинала, включая скрытое "Оригиналы не все". +// Массив из СправочникСсылка.СостоянияОригиналовПервичныхДокументов - все возможные состояния оригинала, включая +// скрытое "Оригиналы не все". // Функция ВсеСостояния() Экспорт @@ -296,9 +310,12 @@ // Выводит подключаемые команды в форме. Вызывается без подключения подсистемы "Подключаемые команды". // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. -// Список - ЭлементФормы - основной список формы. -// СостоянияОригиналов - ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене состояния оригинала. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. +// Список - ТаблицаФормы - основной список формы. +// СостоянияОригиналов - ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене +// состояния оригинала: +// * Наименование - Строка - наименование состояния оригинала; +// * Ссылка - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - ссылка на элемент справочника СостоянияОригиналовПервичныхДокументов. // Процедура ВывестиНаФормуКомандыСостоянияОригинала(Форма, Список, СостоянияОригиналов) Экспорт @@ -421,10 +438,6 @@ #Область СлужебныйПрограммныйИнтерфейс // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -436,6 +449,10 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек. +// +// Параметры: +// Объекты - Массив из ОбъектМетаданных +// Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов); @@ -583,10 +600,10 @@ // Записывает новое состояние оригинала документа. // // Параметры: -// ДанныеЗаписи - Массив -// - Структура - массив или структура содержащие данные об изменяемой записи в регистре. -// ИмяСостояния - Строка - устанавливаемое состояние. -// Изменено - Булево - ИСТИНА, если состояние оригинала документа не повторяется и было записано. Необязательный. +// ДанныеЗаписи - Массив из см. УстановитьНовоеСостояниеОригиналаМассив.ДанныеЗаписи. +// - см. УстановитьНовоеСостояниеОригиналаМассивСтруктура.ДанныеЗаписи. +// ИмяСостояния - Строка - устанавливаемое состояние. +// Изменено - Булево - Истина, если состояние оригинала документа не повторяется и было записано. // Процедура УстановитьНовоеСостояниеОригинала(ДанныеЗаписи, ИмяСостояния, Изменено = Ложь) Экспорт @@ -597,92 +614,123 @@ УстановитьПривилегированныйРежим(Истина); Если ТипЗнч(ДанныеЗаписи) = Тип("Массив") Тогда - Для Каждого Запись Из ДанныеЗаписи Цикл - - Если СокрЛП(Запись.СостояниеОригиналаПервичногоДокумента) <> СокрЛП(ИмяСостояния) Тогда - Если Запись.ОбщееСостояние Тогда - ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); - ПроверкаЗаписьСостоянияОригинала.Отбор.Ссылка.Установить(Запись.Ссылка); - ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - - Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда - Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл - Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, - ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); - КонецЕсли; - КонецЦикла; - КонецЕсли; - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - Иначе - ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); - ПроверкаЗаписьСостоянияОригинала.Отбор.Ссылка.Установить(Запись.Ссылка); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда - ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(Запись.ПервичныйДокумент); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл - Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, - Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне); - Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - Иначе - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); - КонецЕсли; - КонецЕсли; - КонецЦикла; - Иначе - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - КонецЦикла; - + УстановитьНовоеСостояниеОригиналаМассив(ДанныеЗаписи, ИмяСостояния, Изменено); Иначе - ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); - ПроверкаЗаписьСостоянияОригинала.Отбор.Ссылка.Установить(ДанныеЗаписи.Ссылка); - ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Истина); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда - Если СокрЛП(ПроверкаЗаписьСостоянияОригинала[0].Состояние) <> ИмяСостояния Тогда - - ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь); - ПроверкаЗаписьСостоянияОригинала.Прочитать(); - - Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда - Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл - Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(ДанныеЗаписи.Ссылка, - ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - Изменено = Истина; - РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(ДанныеЗаписи.Ссылка,ИмяСостояния); + УстановитьНовоеСостояниеОригиналаСтруктура(ДанныеЗаписи, ИмяСостояния, Изменено); КонецЕсли; УстановитьПривилегированныйРежим(Ложь); КонецПроцедуры +// Записывает новое состояние оригинала документа. +// +// Параметры: +// ДанныеЗаписи - Массив из Структура - массив содержащий данные об изменяемом состоянии оригинала: +// * ОбщееСостояние - Булево - Истина, если текущее состояние является общим; +// * Ссылка - ДокументСсылка - ссылка на документ, для которого необходимо изменить состояние оригинала; +// * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - +// текущие состояние оригинала первичного документа; +// * ПервичныйДокумент - Строка - идентификатор первичного документа. Задается, если данное состояние не является общим; +// * Извне - Булево - Истина, если первичный документ был добавлен пользователем вручную. Задается, если данное состояние не является общим. +// ИмяСостояния - Строка - устанавливаемое состояние. +// Изменено - Булево - Истина, если состояние оригинала документа не повторяется и было записано. +// +Процедура УстановитьНовоеСостояниеОригиналаМассив(ДанныеЗаписи, ИмяСостояния, Изменено = Ложь) + + Для Каждого Запись Из ДанныеЗаписи Цикл + + Если СокрЛП(Запись.СостояниеОригиналаПервичногоДокумента) <> СокрЛП(ИмяСостояния) Тогда + Если Запись.ОбщееСостояние Тогда + ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); + ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(Запись.Ссылка); + ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + + Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, + ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); + КонецЕсли; + КонецЦикла; + КонецЕсли; + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); + Иначе + ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); + ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(Запись.Ссылка); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда + ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(Запись.ПервичныйДокумент); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка, + Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне); + Если СостояниеПечатныхФормОдинаково(Запись.Ссылка,ИмяСостояния) Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); + Иначе + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе); + КонецЕсли; + КонецЕсли; + КонецЦикла; + Иначе + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния); + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Записывает новое состояние оригинала документа. +// +// Параметры: +// ДанныеЗаписи - Структура - структура содержащие данные об изменяемом состоянии оригинала: +// * Ссылка - ДокументСсылка - ссылка на документ, для которого необходимо изменить состояние оригинала. +// ИмяСостояния - Строка - устанавливаемое состояние. +// Изменено - Булево - Истина, если состояние оригинала документа не повторяется и было записано. +// +Процедура УстановитьНовоеСостояниеОригиналаСтруктура(ДанныеЗаписи, ИмяСостояния, Изменено = Ложь) + + ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей(); + ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(ДанныеЗаписи.Ссылка); + ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Истина); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда + Если СокрЛП(ПроверкаЗаписьСостоянияОригинала[0].Состояние) <> ИмяСостояния Тогда + + ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь); + ПроверкаЗаписьСостоянияОригинала.Прочитать(); + + Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда + Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл + Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(ДанныеЗаписи.Ссылка, + ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + Изменено = Истина; + РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(ДанныеЗаписи.Ссылка,ИмяСостояния); + +КонецПроцедуры + // Заполняет выпадающий список выбора состояний на форме. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. // Процедура ЗаполнитьСписокВыбораСостоянийОригинала(Форма, СостоянияОригиналов) @@ -706,7 +754,9 @@ // Возвращает массив состояний, доступных пользователю. // // Возвращаемое значение: -// ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене состояния оригинала. +// ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене состояния оригинала: +// * Наименование - Строка - наименование состояния оригинала; +// * Ссылка - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - ссылка на элемент справочника СостоянияОригиналовПервичныхДокументов. // Функция ИспользуемыеСостояния()Экспорт @@ -736,30 +786,30 @@ // Возвращает ключ записи регистра общего состояния оригинала документа по ссылке. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ,для которого необходимо получить ключ записи общего состояния. +// ДокументСсылка - ДокументСсылка - ссылка на документ,для которого необходимо получить ключ записи общего состояния. // // Возвращаемое значение: -// КлючЗаписиРегистра - ключ записи регистра общего состояния оригинала документа. +// РегистрСведенийКлючЗаписи.СостоянияОригиналовПервичныхДокументов - ключ записи регистра общего состояния оригинала документа. // Функция КлючЗаписиОбщегоСостояния(ДокументСсылка) Экспорт Запрос = Новый Запрос; Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ - | СостоянияОригиналовПервичныхДокументов.Ссылка КАК Ссылка, + | СостоянияОригиналовПервичныхДокументов.Владелец КАК Владелец, | СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент, | СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние, | СостоянияОригиналовПервичныхДокументов.ФормаИзвне КАК ФормаИзвне |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ - | СостоянияОригиналовПервичныхДокументов.Ссылка = &Ссылка + | СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка | И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние" ; Запрос.УстановитьПараметр("Ссылка",ДокументСсылка); Выборка = Запрос.Выполнить().Выгрузить(); Для Каждого Ключ Из Выборка Цикл - ПередаваемыеПараметры = Новый Структура("Ссылка, ПервичныйДокумент, ОбщееСостояние, ФормаИзвне"); + ПередаваемыеПараметры = Новый Структура("Владелец, ПервичныйДокумент, ОбщееСостояние, ФормаИзвне"); ЗаполнитьЗначенияСвойств(ПередаваемыеПараметры,Ключ); ПараметрыМассив = Новый Массив; @@ -775,10 +825,10 @@ // Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ, который необходимо проверить. +// ДокументСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить. // // Возвращаемое значение: -// Булево - ИСТИНА, если документ является объектом учетом оригиналов. +// Булево - Истина, если документ является объектом учетом оригиналов. // Функция ЭтоОбъектУчета(ДокументСсылка) Экспорт @@ -799,7 +849,7 @@ // Возвращает массив с описанием типов подключенных к подсистеме объектов. // // Возвращаемое значение: -// ДоступныеТипы - Массив - массив с описанием типов подключенных к подсистеме объектов. +// Массив из Тип - массив с описанием типов подключенных к подсистеме объектов. // Функция СведенияОПодключенныхОбъектах() Экспорт @@ -812,10 +862,10 @@ // Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ, который необходимо проверить. +// МассивСтрок - Массив из ДокументСсылка - массив с ссылками на документ, который необходимо проверить. // // Возвращаемое значение: -// Булево - ИСТИНА, если документ является объектом учетом оригиналов. +// Булево - Истина, если документ является объектом учетом оригиналов. // Функция ВозможностьЗаписиОбъектов(МассивСтрок) Экспорт @@ -841,11 +891,13 @@ // Возвращает ссылку на документ по штрихкоду табличного документа. // // Параметры: -// Штрихкод - Строка - штрихкод. -// Менеджеры - Массив - менеджеры документов. +// Штрихкод - Строка - штрихкод. +// Менеджеры - Массив из СправочникСсылка +// - ДокументСсылка +// - ЗадачаСсылка - менеджеры документов. // // Возвращаемое значение: -// Массив - ссылки на документы. +// Массив из ДокументСсылка - ссылки на документы. // Функция СсылкаПоШтрихкодуТабличногоДокумента(Штрихкод, Менеджеры = Неопределено) @@ -880,19 +932,20 @@ Для Каждого ПустаяСсылка Из Менеджеры Цикл ТипСсылки = ТипЗнч(ПустаяСсылка); + //@skip-warning Если Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда МенеджерыОбъектов.Добавить(Документы[ПустаяСсылка.Метаданные().Имя]); ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда МенеджерыОбъектов.Добавить(Справочники[ПустаяСсылка.Метаданные().Имя]); - ИначеЕсли Задачи.ТипВсеСсылки(ТипСсылки) Тогда + ИначеЕсли Задачи.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда МенеджерыОбъектов.Добавить(Задачи[ПустаяСсылка.Метаданные().Имя]); - ИначеЕсли БизнесПроцессы.ТипВсеСсылки(ТипСсылки) Тогда + ИначеЕсли БизнесПроцессы.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда МенеджерыОбъектов.Добавить(БизнесПроцессы[ПустаяСсылка.Метаданные().Имя]); - ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки(ТипСсылки) Тогда + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда МенеджерыОбъектов.Добавить(ПланыВидовХарактеристик[ПустаяСсылка.Метаданные().Имя]); Иначе @@ -924,20 +977,25 @@ МассивСсылок.Добавить(Ссылка); - Если НЕ ПервыйЗапрос Тогда + Если ПервыйЗапрос Тогда + Запрос.Текст = Запрос.Текст + + "ВЫБРАТЬ РАЗРЕШЕННЫЕ Таблица.Ссылка КАК Ссылка + |ИЗ &МетаданныеСсылкиПолноеИмя КАК Таблица + |ГДЕ Ссылка В (&МассивСсылок) + |"; + Иначе Запрос.Текст = Запрос.Текст + "ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ Таблица.Ссылка КАК Ссылка + |ИЗ &МетаданныеСсылкиПолноеИмя КАК Таблица + |ГДЕ Ссылка В (&МассивСсылок) |"; КонецЕсли; - - Запрос.Текст = Запрос.Текст + - "ВЫБРАТЬ" + ?(ПервыйЗапрос," " + "РАЗРЕШЕННЫЕ" + " "," ") + "Таблица.Ссылка КАК Ссылка - |ИЗ " + МетаданныеСсылки.ПолноеИмя() + " КАК Таблица - |ГДЕ Ссылка В (&МассивСсылок) - |"; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&МетаданныеСсылкиПолноеИмя", МетаданныеСсылки.ПолноеИмя()); ПервыйЗапрос = Ложь; - + КонецЦикла; Если Не ПервыйЗапрос Тогда @@ -952,7 +1010,7 @@ // Процедура обрабатывает действия по учету оригиналов после сканирования штрихкода документа. // // Параметры: -// Штрихкод - Строка - отсканированный штрихкод документа. +// Штрихкод - Строка - отсканированный штрихкод документа. // Процедура ОбработатьШтрихкод(Штрихкод) Экспорт @@ -964,11 +1022,11 @@ // Проверяет после записи состояний печатных форм документа в регистр, имеют ли они одинаковые состояния. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ,у которого необходимо проверить состояния печатных форм. -// ИмяСостояния - Строка - имя состояния, которое было установлено. +// ДокументСсылка - ДокументСсылка - ссылка на документ,у которого необходимо проверить состояния печатных форм. +// ИмяСостояния - Строка - имя состояния, которое было установлено. // // Возвращаемое значение: -// Булево - ИСТИНА, если все печатные формы документа имеют одинаковое состояние. +// Булево - Истина, если все печатные формы документа имеют одинаковое состояние. // Функция СостояниеПечатныхФормОдинаково(ДокументСсылка,ИмяСостояния) Экспорт @@ -980,7 +1038,7 @@ |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ - | СостоянияОригиналовПервичныхДокументов.Ссылка = &Ссылка + | СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка | И НЕ СостоянияОригиналовПервичныхДокументов.ОбщееСостояние"; Запрос.УстановитьПараметр("Ссылка",ДокументСсылка); @@ -1004,11 +1062,13 @@ // Возвращает структуру с данными о текущим общем состоянии оригинала документа по ссылке. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ, для которого необходимо получить сведения о общем состоянии. +// ДокументСсылка - ДокументСсылка - ссылка на документ, для которого необходимо получить сведения о общем состоянии. // -// Возвращаемые значения: -// Структура/Строка - основные сведения о общем состоянии оригинала,если до этого состояние оригинала было записано, -// если нет, то пустая строка. +// Возвращаемое значение: +// Структура - основные сведения о общем состоянии оригинала: +// * Ссылка - ДокументСсылка - ссылка на документ; +// * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - текущее +// состояние оригинала документа; // Функция СведенияОСостоянииОригиналаПоСсылке(ДокументСсылка) Экспорт @@ -1019,20 +1079,19 @@ |ИЗ | РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов |ГДЕ - | СостоянияОригиналовПервичныхДокументов.Ссылка = &Ссылка + | СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка | И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние = ИСТИНА"; Запрос.УстановитьПараметр("Ссылка",ДокументСсылка); - СведенияОСостоянии=""; - + СведенияОСостоянии = Новый Структура; + Если Не Запрос.Выполнить().Пустой() Тогда Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); - СведенияОСостоянии = Новый Структура; СведенияОСостоянии.Вставить("Ссылка",ДокументСсылка); - СведенияОСостоянии.Вставить("СостояниеОригиналаПервичногоДокумента",Выборка.Состояние); + СведенияОСостоянии.Вставить("СостояниеОригиналаПервичногоДокумента",Выборка.Состояние); КонецЕсли; Возврат СведенияОСостоянии; @@ -1046,21 +1105,21 @@ ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); СостояниеОригинала.Наименование = НСтр("ru='Форма напечатана'"); СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что печатная форма только печаталась.'"); - СостояниеОригинала.РеквизитДопУпорядочивания = "1"; + СостояниеОригинала.РеквизитДопУпорядочивания = 1; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); СостояниеОригинала.Наименование = НСтр("ru='Оригиналы не все'"); СостояниеОригинала.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'"); - СостояниеОригинала.РеквизитДопУпорядочивания = "99998"; + СостояниеОригинала.РеквизитДопУпорядочивания = 99998; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка); СостояниеОригинала.Наименование = НСтр("ru='Оригинал получен'"); СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'"); - СостояниеОригинала.РеквизитДопУпорядочивания = "99999"; + СостояниеОригинала.РеквизитДопУпорядочивания = 99999; ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала); diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl index ea6ecaa0f..9eea4e1db 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовВызовСервера/Module.bsl @@ -11,8 +11,8 @@ // Вызывается для записи состояний оригиналов печатных форм в регистр, после печати формы. // // Параметры: -// ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. -// СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. +// ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. +// СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. // Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати) Экспорт @@ -27,7 +27,20 @@ #Область СлужебныеПроцедурыИФункции // Записывает новое состояние оригинала документа -// Подробнее - см. описание УправлениеФиксациейПервичныхДокументов.УстановитьНовоеСостояниеОригинала(ДанныеЗапись,ИмяСостояния) +// +// Параметры: +// ДанныеЗаписи - Массив из Структура - массив содержащий данные об изменяемом состоянии оригинала: +// * ОбщееСостояние - Булево - Истина, если текущее состояние является общим; +// * Ссылка - ДокументСсылка - ссылка на документ, для которого необходимо изменить состояние оригинала; +// * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - +// текущие состояние оригинала первичного документа; +// * ПервичныйДокумент - Строка - идентификатор первичного документа. Задается, если данное состояние не является общим; +// * Извне - Булево - Истина, если первичный документ был добавлен пользователем вручную. Задается, если данное состояние не является общим. +// - Структура - структура содержащие данные об изменяемом состоянии оригинала: +// * Ссылка - ДокументСсылка - ссылка на документ, для которого необходимо изменить состояние оригинала. +// ИмяСостояния - Строка - устанавливаемое состояние. +// Изменено - Булево - Истина, если состояние оригинала документа не повторяется и было записано. Значение по умолчанию +// Ложь. // Процедура УстановитьНовоеСостояниеОригинала(ДанныеЗаписи, ИмяСостояния, Изменено = Ложь) Экспорт @@ -37,7 +50,8 @@ // Возвращает ссылку на документ по штрихкоду табличного документа // -// Подробнее - см. описание УчетОригиналовПервичныхДокументов.ОбработатьШтрихкод(ШтрихКод) +// Параметры: +// Штрихкод - Строка - отсканированный штрихкод документа. // Процедура ОбработатьШтрихкод(Штрихкод) Экспорт @@ -45,9 +59,16 @@ КонецПроцедуры -// Возвращает структуру с данными о текущим общем состоянии оригинала документа по ссылке +// Возвращает структуру с данными о текущим общем состоянии оригинала документа по ссылке. // -// Подробнее - см. описание УчетОригиналовПервичныхДокументов.СведенияОСостоянииОригиналаПоСсылке(ДокументСсылка) +// Параметры: +// ДокументСсылка - ДокументСсылка - ссылка на документ, для которого необходимо получить сведения о общем состоянии. +// +// Возвращаемое значение: +// Структура - основные сведения о общем состоянии оригинала: +// * Ссылка - ДокументСсылка - ссылка на документ; +// * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - текущее +// состояние оригинала документа; // Функция СведенияОСостоянииОригиналаПоСсылке(ДокументСсылка) Экспорт @@ -79,7 +100,8 @@ // Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов // -// Подробнее - см. описание УчетОригиналовПервичныхДокументов.ВозможностьЗаписиОбъектов(МассивСсылок) +// Возвращаемое значение: +// см. УчетОригиналовПервичныхДокументов.ВозможностьЗаписиОбъектов // Функция ВозможностьЗаписиОбъектов(МассивСсылок) Экспорт @@ -87,9 +109,13 @@ КонецФункции -// Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов +// Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов. // -// Подробнее - см. описание УчетОригиналовПервичныхДокументов.ЭтоОбъектУчета(ОбъектСсылка) +// Параметры: +// ОбъектСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить. +// +// Возвращаемое значение: +// Булево - Истина, если документ является объектом учетом оригиналов. // Функция ЭтоОбъектУчета(ОбъектСсылка) Экспорт @@ -99,7 +125,8 @@ // Проверяет и возвращает признак того, есть ли у текущего пользователя права на изменение состояния // -// Подробнее - см. описание Пользователи.РолиДоступны(...); +// Возвращаемое значение: +// Булево - Истина, если у текущего пользователя есть права на изменение состояния оригинала. // Функция ПраваНаИзменениеСостояния() Экспорт @@ -112,9 +139,13 @@ КонецФункции -// Возвращает ключ записи регистра общего состояния оригинала документа по ссылке +// Возвращает ключ записи регистра общего состояния оригинала документа по ссылке. // -// Подробнее - см. описание УчетОригиналовПервичныхДокументов.КлючЗаписиОбщегоСостояния(ДокументСсылка) +// Параметры: +// ДокументСсылка - ДокументСсылка - ссылка на документ,для которого необходимо получить ключ записи общего состояния. +// +// Возвращаемое значение: +// РегистрСведенийКлючЗаписи.СостоянияОригиналовПервичныхДокументов - ключ записи регистра общего состояния оригинала документа. // Функция КлючЗаписиОбщегоСостояния(ДокументСсылка) Экспорт diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl index f11905e53..4f0d96dd6 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиент/Module.bsl @@ -11,8 +11,8 @@ // Устанавливает состояние оригинала для выделенных документов. Вызывается через подсистему "Подключаемые команды". // // Параметры: -// Ссылка - ДокументСсылка - ссылка на документ. -// Параметры - Структура - параметры выполнения команды. +// Ссылка - ДокументСсылка - ссылка на документ. +// Параметры -см. ПодключаемыеКоманды.ПараметрыВыполненияКоманды. // Процедура Подключаемый_УстановитьСостояниеОригинала(Ссылка, Параметры) Экспорт @@ -68,9 +68,9 @@ // Устанавливает состояние оригинала для выделенных документов. Вызывается без подключения подсистемы "Подключаемые команды". // // Параметры: -// Команда - Строка- имя выполняемой команды формы. -// Форма - УправляемаяФорма - форма списка или документа. -// Список - ЭлементФормы - список формы, в котором будет происходить изменение состояния. +// Команда - Строка- имя выполняемой команды формы. +// Форма - ФормаКлиентскогоПриложения - форма списка или документа. +// Список - ТаблицаФормы - список формы, в котором будет происходить изменение состояния. // Процедура УстановитьСостояниеОригинала(Команда, Форма, Список) Экспорт @@ -126,8 +126,8 @@ // Открывает на форме списка или документа выпадающие меню выбора состояния оригинала. // // Параметры: -// Форма - УправляемаяФорма - форма списка документов или документа. -// Источник - ЭлементФормы - список или декорация формы, у которого будет открыт выпадающий список. +// Форма - ФормаКлиентскогоПриложения - форма списка документов или документа. +// Источник - ТаблицаФормы - список или декорация формы, у которого будет открыт выпадающий список. // Процедура ОткрытьМенюВыбораСостояния(Форма, Источник) Экспорт @@ -202,8 +202,8 @@ // Обработчик оповещения событий подсистемы "Учет оригиналов первичных документов" для формы документа. // // Параметры: -// ИмяСобытия - Строка - имя произошедшего события. -// Форма - УправляемаяФорма - форма документа. +// ИмяСобытия - Строка - имя произошедшего события. +// Форма - ФормаКлиентскогоПриложения - форма документа. // Процедура ОбработчикОповещенияФормаДокумента(ИмяСобытия, Форма) Экспорт @@ -218,9 +218,9 @@ // Обработчик оповещения событий подсистемы "Учет оригиналов первичных документов" для формы списка. // // Параметры: -// ИмяСобытия - Строка - имя произошедшего события. -// Форма - УправляемаяФорма - форма списка документов. -// Список - ЭлементФормы - основной список формы. +// ИмяСобытия - Строка - имя произошедшего события. +// Форма - ФормаКлиентскогоПриложения - форма списка документов. +// Список - ТаблицаФормы - основной список формы. // Процедура ОбработчикОповещенияФормаСписка(ИмяСобытия, Форма, Список) Экспорт @@ -245,9 +245,9 @@ // Обработчик события "Выбор" списка. // // Параметры: -// ИмяПоля - Строка - наименование выбранного поля. -// Форма - УправляемаяФорма - форма списка документов. -// Список - ЭлементФормы - основной список формы. +// ИмяПоля - Строка - наименование выбранного поля. +// Форма - ФормаКлиентскогоПриложения - форма списка документов. +// Список - ТаблицаФормы - основной список формы. // СтандартнаяОбработка - Булево - Истина, если в форме используется стандартная обработка события "Выбор" // Процедура СписокВыбор(ИмяПоля, Форма, Список, СтандартнаяОбработка) Экспорт @@ -274,8 +274,8 @@ // Процедура обрабатывает действия по учету оригиналов после сканирования штрихкода документа. // // Параметры: -// Штрихкод - Строка - отсканированный штрихкод документа. -// ИмяСобытия - Строка - имя события формы. +// Штрихкод - Строка - отсканированный штрихкод документа. +// ИмяСобытия - Строка - имя события формы. // Процедура ОбработатьШтрихкод(Штрихкод, ИмяСобытия) Экспорт @@ -289,10 +289,10 @@ // Процедура показывает пользователю оповещение об изменении состояний оригинала документа. // // Параметры: -// КоличествоОбработанных - Число - количество успешно обработанных документов. -// ДокументСсылка - ДокументСсылка - ссылка на документ для обработки нажатия на оповещение пользователя -// в случае единичной установки состояния, необязательный параметр. -// ИмяСостояния - Строка - устанавливаемое состояние. +// КоличествоОбработанных - Число - количество успешно обработанных документов. +// ДокументСсылка - ДокументСсылка - ссылка на документ для обработки нажатия на оповещение пользователя +// в случае единичной установки состояния. Необязательный параметр. +// ИмяСостояния - Строка - устанавливаемое состояние. // Процедура ОповеститьПользователяОбУстановкеСостояний(КоличествоОбработанных, ДокументСсылка = Неопределено, ИмяСостояния = Неопределено) Экспорт @@ -321,8 +321,8 @@ // Вызывается для записи состояний оригиналов печатных форм в регистр, после печати формы. // // Параметры: -// ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. -// СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. +// ОбъектыПечати - СписокЗначений - список ссылок на объекты печати. +// СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм. // Процедура ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати) Экспорт @@ -341,7 +341,7 @@ // Открывает форму уточнения состояний печатных форм документа. // // Параметры: -// ДокументСсылка - СсылкаДокумент - ссылка на документ,для которого необходимо получить ключ записи общего состояния. +// ДокументСсылка - ДокументСсылка - ссылка на документ,для которого необходимо получить ключ записи общего состояния. // Процедура ОткрытьФормуИзмененияСостоянийПечатныхФорм(ДокументСсылка) Экспорт @@ -360,10 +360,10 @@ КонецПроцедуры // Вызывается при открытии журнала оригиналов первичных документов в случае использования подключаемого оборудования. -// Позволяет определить собственный процесс подключения подключаемого оборудования к журналу +// Позволяет определить собственный процесс подключения подключаемого оборудования к журналу. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. // Процедура ПриПодключенииСканераШтрихкода(Форма) Экспорт @@ -378,14 +378,14 @@ // Формирует надпись для вывода информации о текущем состоянии на форму документа. // // Параметры: -// Форма - УправляемаяФорма - форма списка документа. +// Форма - ФормаКлиентскогоПриложения - форма списка документа. // Процедура СформироватьНадписьТекущегоСостоянияОригинала(Форма) Если Не Форма.Элементы.Найти("ДекорацияСостояниеОригинала") = Неопределено Тогда Если ЗначениеЗаполнено(Форма.Объект.Ссылка) Тогда ТекущиеСостояниеОригинала = УчетОригиналовПервичныхДокументовВызовСервера.СведенияОСостоянииОригиналаПоСсылке(Форма.Объект.Ссылка); - Если ПустаяСтрока(ТекущиеСостояниеОригинала) Тогда + Если ТекущиеСостояниеОригинала.Количество() = 0 Тогда ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'"); Форма.Элементы.ДекорацияСостояниеОригинала.ЦветТекста = WebЦвета.Серебряный; Иначе @@ -451,9 +451,9 @@ // Параметры: // ВыбранноеСостояниеИзСписка - Строка - выбранное пользователем состояние оригинала. // ДополнительныеПараметры - Структура - сведения необходимые для установки состояния оригинала: -// * Ссылка - ЛюбаяСсылка - ссылка на документ для установки состояния оригинала. +// * Ссылка - ДокументСсылка - ссылка на документ для установки состояния оригинала. // - Массив из Структура: -// * Ссылка - ЛюбаяСсылка - ссылка на документ для установки состояния оригинала +// * Ссылка - ДокументСсылка - ссылка на документ для установки состояния оригинала. // Процедура ОткрытьМенюВыбораСостоянияЗавершение(ВыбранноеСостояниеИзСписка, ДополнительныеПараметры) Экспорт diff --git a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовКлиентПереопределяемый/Module.bsl index dc15902b3..fa8ddc083 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 fd206108c..acc4e160f 100644 --- a/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УчетОригиналовПервичныхДокументовПереопределяемый/Module.bsl @@ -11,7 +11,7 @@ // Определяет объекты конфигурации, в формах списках которых размещены команды учета оригиналов первичных документов, // // Параметры: -// СписокОбъектов - Массив - менеджеры объектов с процедурой ДобавитьКомандыПечати. +// СписокОбъектов - Массив из Строка - менеджеры объектов с процедурой ДобавитьКомандыПечати. // Процедура ПриОпределенииОбъектовСКомандамиУчетаОригиналов(СписокОбъектов) Экспорт diff --git a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl index ca23eafcf..eddf2099b 100644 --- a/SSL/src/CommonModules/ФайловаяСистема/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистема/Module.bsl @@ -78,6 +78,21 @@ КонецПроцедуры +// Формирует уникальное имя файла в указанной папке, при необходимости добавляя к имени файла порядковый номер, +// например: "файл (2).txt", "файл (3).txt" и т.п. +// +// Параметры: +// ИмяФайла - Строка - полное имя файла с папкой, например, "C:\Документы\файл.txt". +// +// Возвращаемое значение: +// Строка - например, "C:\Документы\файл (2).txt", если "файл.txt" уже существует в указанной папке. +// +Функция УникальноеИмяФайла(Знач ИмяФайла) Экспорт + + Возврат ФайловаяСистемаСлужебныйКлиентСервер.УникальноеИмяФайла(ИмяФайла); + +КонецФункции + #КонецОбласти #Область ЗапускВнешнихПриложений @@ -136,7 +151,7 @@ // - Массив - первый элемент массива, путь к исполняемому приложению, // остальные элементы массива - это передаваемые параметры, // массив соответствует тому, который получит вызываемая программа в argv. -// ПараметрыЗапускаПрограммы - - см. ФайловаяСистема.ПараметрыЗапускаПрограммы +// ПараметрыЗапускаПрограммы - см. ФайловаяСистема.ПараметрыЗапускаПрограммы // // Возвращаемое значение: // Структура: diff --git a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl index 866a4f36c..bd31ec005 100644 --- a/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловаяСистемаКлиент/Module.bsl @@ -189,9 +189,7 @@ // - Массив - содержит объекты типа ОписаниеПереданногоФайла. Сохраненные файлы. // * ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта // ОписаниеОповещения. -// СохраняемыеФайлы - Массив - содержит объекты типа ОписаниеПереданногоФайла: -// * Хранение - расположение данных во временном хранилище. -// * Имя - Строка - полный путь, по которому должен быть сохранен получаемый файл или имя файла с расширением. +// СохраняемыеФайлы - Массив из ОписаниеПереданногоФайла - содержит объекты типа ОписаниеПереданногоФайла. // ПараметрыСохранения - см. ФайловаяСистемаКлиент.ПараметрыСохраненияФайла // // Пример: @@ -679,7 +677,7 @@ // * Результат - Массив из Строка - выбранные имена файлов. // - Строка - пустая строка, если пользователь отказался от установки расширения. // - Неопределено - если пользователь отказался от выбора файла. -// * ДополнительныеПараметры - Структура - дополнительные параметры оповещения. +// * ДополнительныеПараметры - Структура - дополнительные параметры оповещения. // Диалог - ДиалогВыбораФайла - свойства см. в синтакс-помощнике. // Процедура ПоказатьДиалогВыбора(ОбработчикЗавершения, Диалог) Экспорт @@ -768,6 +766,21 @@ КонецПроцедуры +// Формирует уникальное имя файла в указанной папке, при необходимости добавляя к имени файла порядковый номер, +// например: "файл (2).txt", "файл (3).txt" и т.п. +// +// Параметры: +// ИмяФайла - Строка - полное имя файла с папкой, например, "C:\Документы\файл.txt". +// +// Возвращаемое значение: +// Строка - например, "C:\Документы\файл (2).txt", если "файл.txt" уже существует в указанной папке. +// +Функция УникальноеИмяФайла(Знач ИмяФайла) Экспорт + + Возврат ФайловаяСистемаСлужебныйКлиентСервер.УникальноеИмяФайла(ИмяФайла); + +КонецФункции + #КонецОбласти #КонецОбласти diff --git a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/Module.bsl new file mode 100644 index 000000000..7d58f1e8f --- /dev/null +++ b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/Module.bsl @@ -0,0 +1,28 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция УникальноеИмяФайла(Знач ИмяФайла) Экспорт + + Файл = Новый Файл(ИмяФайла); + ИмяБезРасширения = Файл.ИмяБезРасширения; + Расширение = Файл.Расширение; + ИмяКаталога = Файл.Путь; + + Счетчик = 1; + Пока Файл.Существует() Цикл + Счетчик = Счетчик + 1; + Файл = Новый Файл(ИмяКаталога + ИмяБезРасширения + " (" + Счетчик + ")" + Расширение); + КонецЦикла; + + Возврат Файл.ПолноеИмя; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/ФайловаяСистемаСлужебныйКлиентСервер.mdo b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/ФайловаяСистемаСлужебныйКлиентСервер.mdo new file mode 100644 index 000000000..0a3bccbab --- /dev/null +++ b/SSL/src/CommonModules/ФайловаяСистемаСлужебныйКлиентСервер/ФайловаяСистемаСлужебныйКлиентСервер.mdo @@ -0,0 +1,12 @@ + + + ФайловаяСистемаСлужебныйКлиентСервер + + ru + Файловая система служебный клиент сервер + + true + true + true + true + diff --git a/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl b/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl index d03b1dc60..014995051 100644 --- a/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторинга/Module.bsl @@ -12,7 +12,7 @@ // Проверяет состояние подсистемы. // Возвращаемое значение: -// Булево - Истина включен, Ложь выключен. +// Булево - Истина включен, Ложь выключен. // Функция ЦентрМониторингаВключен() Экспорт ПараметрыЦентраМониторинга = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме"); @@ -51,7 +51,7 @@ // Возвращает строковое представление идентификатора информационной базы в центре мониторинга. // Возвращаемое значение: -// Строка - уникальный идентификатор информационной базы в центре мониторинга. +// Строка - уникальный идентификатор информационной базы в центре мониторинга. // Функция ИдентификаторИнформационнойБазы() Экспорт @@ -83,7 +83,7 @@ // ИмяОперации - Строка - имя операции статистики, в случае отсутствия создается новое. // Значение - Число - количественное значение операции статистики. // Комментарий - Строка - произвольный комментарий. -// Разделитель - Строка - разделитель значений в ИмяОперации, если разделитель не точка. +// Разделитель - Строка - разделитель значений в ИмяОперации, если разделитель не точка. // Процедура ЗаписатьОперациюБизнесСтатистики(ИмяОперации, Значение, Комментарий = Неопределено, Разделитель = ".") Экспорт Если ЗаписыватьОперацииБизнесСтатистики() Тогда @@ -146,7 +146,7 @@ // Возвращает состояние регистрации бизнес-статистики. // Возвращаемое значение: -// Булево - регистрировать бизнес статистику. +// Булево - регистрировать бизнес статистику. // Функция ЗаписыватьОперацииБизнесСтатистики() Экспорт ПараметрыЦентраМониторинга = Новый Структура("ВключитьЦентрМониторинга, ЦентрОбработкиИнформацииОПрограмме, РегистрироватьБизнесСтатистику"); diff --git a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl index 93aa294e2..edc0018de 100644 --- a/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЦентрМониторингаСлужебный/Module.bsl @@ -41,7 +41,7 @@ // Параметры: // Параметр - Строка - ключ параметра центра мониторинга, возможные значения ключа // см. в процедуре ПолучитьПараметрыПоУмолчанию в модуле ЦентрМониторингаСлужебный. -// Значение - Произвольный тип - значение параметра центра мониторинга. +// Значение - Произвольный - значение параметра центра мониторинга. // Функция УстановитьПараметрЦентраМониторингаВнешнийВызов(Параметр, Значение) Экспорт Возврат УстановитьПараметрЦентраМониторинга(Параметр, Значение); @@ -86,7 +86,7 @@ // См. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий. // Параметры: -// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки +// Зависимости - см. РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий.Настройки // Процедура ПриОпределенииНастроекРегламентныхЗаданий(Зависимости) Экспорт Зависимость = Зависимости.Добавить(); @@ -99,9 +99,6 @@ КонецПроцедуры // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -291,9 +288,8 @@ КонецПроцедуры -// См. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел. // Параметры: -// ТекущиеДела - см. ТекущиеДелаПереопределяемый.ПриОпределенииОбработчиковТекущихДел.Обработчики +// ТекущиеДела - см. ТекущиеДелаСервер.ТекущиеДела. // Процедура ПриЗаполненииСпискаТекущихДел(ТекущиеДела) Экспорт @@ -2676,7 +2672,7 @@ ДанныеОбИспользованииРолей = Новый Структура; // Получение данных об использовании ролей. - Запрос = Новый Запрос(ТекстЗапросаИспользованияРолей()); + Запрос = Новый Запрос(УправлениеДоступомСлужебный.ТекстЗапросаИспользованияРолей()); Запрос.УстановитьПараметр("ПустойУИД", ОбщегоНазначенияКлиентСервер.ПустойУникальныйИдентификатор()); Запрос.УстановитьПараметр("ТекущаяДата", НачалоДня(ТекущаяДатаСеанса())); РезультатПакет = Запрос.ВыполнитьПакет(); @@ -2723,256 +2719,6 @@ Возврат ДанныеОбИспользованииРолей; КонецФункции -Функция ТекстЗапросаИспользованияРолей() - - Возврат - "ВЫБРАТЬ - | СоставыГруппПользователей.ГруппаПользователей КАК ГруппаПользователей, - | СведенияОПользователях.Пользователь КАК Пользователь, - | ВЫБОР - | КОГДА РАЗНОСТЬДАТ(СведенияОПользователях.ДатаПоследнейАктивности, &ТекущаяДата, ДЕНЬ) <= 7 - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК АктивныхЗаНеделю, - | ВЫБОР - | КОГДА РАЗНОСТЬДАТ(СведенияОПользователях.ДатаПоследнейАктивности, &ТекущаяДата, ДЕНЬ) <= 30 - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК АктивныхЗаМесяц - |ПОМЕСТИТЬ ВТСоставыГруппИАктивность - |ИЗ - | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях - | ПО СоставыГруппПользователей.Пользователь = СведенияОПользователях.Пользователь - |ГДЕ - | СоставыГруппПользователей.Используется - | И НЕ СоставыГруппПользователей.Пользователь.ИдентификаторПользователяИБ = &ПустойУИД - | - |ИНДЕКСИРОВАТЬ ПО - | ГруппаПользователей, - | Пользователь - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПрофилиГруппДоступа.Ссылка КАК Профиль, - | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, - | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, - | ПрофилиГруппДоступа.Наименование КАК Наименование, - | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа, - | ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) - | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) - | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = НЕОПРЕДЕЛЕНО КАК ОбщаяГруппаДоступа, - | ГруппыДоступаПользователи.Пользователь КАК ПользовательТЧ, - | СоставыГруппПользователей.Пользователь КАК ПользовательРС, - | СоставыГруппПользователей.АктивныхЗаНеделю КАК АктивныхЗаНеделю, - | СоставыГруппПользователей.АктивныхЗаМесяц КАК АктивныхЗаМесяц - |ПОМЕСТИТЬ ВТДанныеПрофилей - |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСоставыГруппИАктивность КАК СоставыГруппПользователей - | ПО ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа - | ПО (ПрофилиГруппДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка.Профиль) - | И (НЕ ГруппыДоступаПользователи.Ссылка.Профиль.ПометкаУдаления) - |ГДЕ - | НЕ ГруппыДоступаПользователи.Ссылка.Профиль.ПометкаУдаления - | - |СГРУППИРОВАТЬ ПО - | ПрофилиГруппДоступа.Ссылка, - | ПрофилиГруппДоступа.Наименование, - | ГруппыДоступаПользователи.Пользователь, - | СоставыГруппПользователей.Пользователь, - | СоставыГруппПользователей.АктивныхЗаНеделю, - | СоставыГруппПользователей.АктивныхЗаМесяц, - | ГруппыДоступаПользователи.Ссылка, - | ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) - | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = ЗНАЧЕНИЕ(Справочник.ВнешниеПользователи.ПустаяСсылка) - | ИЛИ ГруппыДоступаПользователи.Ссылка.Пользователь = НЕОПРЕДЕЛЕНО, - | ПрофилиГруппДоступа.ИдентификаторПоставляемыхДанных, - | ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВТДанныеПрофилей.Профиль КАК Профиль, - | ВТДанныеПрофилей.Наименование КАК Наименование, - | ВТДанныеПрофилей.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, - | ВТДанныеПрофилей.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен - |ПОМЕСТИТЬ Профили - |ИЗ - | ВТДанныеПрофилей КАК ВТДанныеПрофилей - | - |ИНДЕКСИРОВАТЬ ПО - | Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Профили.Профиль КАК Профиль, - | СУММА(ВЫБОР - | КОГДА НЕ ПрофилиГруппДоступаВидыДоступа.ВидДоступа ЕСТЬ NULL - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ВсегоВидовДоступа, - | СУММА(ВЫБОР - | КОГДА ЕСТЬNULL(ПрофилиГруппДоступаВидыДоступа.Предустановленный, ЛОЖЬ) - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ПредустановленныхВидовДоступа - |ПОМЕСТИТЬ ВидыДоступа - |ИЗ - | Профили КАК Профили - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа - | ПО Профили.Профиль = ПрофилиГруппДоступаВидыДоступа.Ссылка - | - |СГРУППИРОВАТЬ ПО - | Профили.Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Вложенный.Профиль КАК Профиль, - | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Вложенный.ГруппаДоступа) КАК ГруппаДоступа, - | СУММА(ВЫБОР - | КОГДА НЕ Вложенный.ОбщаяГруппаДоступа - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ПерсональнаяГруппа - |ПОМЕСТИТЬ ГруппыДоступа - |ИЗ - | (ВЫБРАТЬ - | ВТДанныеПрофилей.Профиль КАК Профиль, - | ВТДанныеПрофилей.ГруппаДоступа КАК ГруппаДоступа, - | ВТДанныеПрофилей.ОбщаяГруппаДоступа КАК ОбщаяГруппаДоступа - | ИЗ - | ВТДанныеПрофилей КАК ВТДанныеПрофилей - | - | СГРУППИРОВАТЬ ПО - | ВТДанныеПрофилей.Профиль, - | ВТДанныеПрофилей.ГруппаДоступа, - | ВТДанныеПрофилей.ОбщаяГруппаДоступа) КАК Вложенный - | - |СГРУППИРОВАТЬ ПО - | Вложенный.Профиль - | - |ИНДЕКСИРОВАТЬ ПО - | Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Вложенный.Профиль КАК Профиль, - | СУММА(ВЫБОР - | КОГДА Вложенный.ПользовательТЧ ССЫЛКА Справочник.ГруппыПользователей - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ГруппПользователей, - | СУММА(ВЫБОР - | КОГДА Вложенный.ПользовательТЧ ССЫЛКА Справочник.ГруппыВнешнихПользователей - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ГруппВнешнихПользователей - |ПОМЕСТИТЬ ГруппыПользователей - |ИЗ - | (ВЫБРАТЬ - | ВТДанныеПрофилей.Профиль КАК Профиль, - | ВТДанныеПрофилей.ПользовательТЧ КАК ПользовательТЧ - | ИЗ - | ВТДанныеПрофилей КАК ВТДанныеПрофилей - | - | СГРУППИРОВАТЬ ПО - | ВТДанныеПрофилей.Профиль, - | ВТДанныеПрофилей.ПользовательТЧ) КАК Вложенный - | - |СГРУППИРОВАТЬ ПО - | Вложенный.Профиль - | - |ИНДЕКСИРОВАТЬ ПО - | Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Вложенный.Профиль КАК Профиль, - | СУММА(ВЫБОР - | КОГДА Вложенный.ПользовательРС ССЫЛКА Справочник.Пользователи - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК Пользователи, - | СУММА(ВЫБОР - | КОГДА Вложенный.ПользовательРС ССЫЛКА Справочник.ВнешниеПользователи - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ) КАК ВнешниеПользователи, - | СУММА(Вложенный.АктивныхЗаНеделю) КАК АктивныхЗаНеделю, - | СУММА(Вложенный.АктивныхЗаМесяц) КАК АктивныхЗаМесяц - |ПОМЕСТИТЬ ПользователиПрофиля - |ИЗ - | (ВЫБРАТЬ - | ВТДанныеПрофилей.Профиль КАК Профиль, - | ВТДанныеПрофилей.ПользовательРС КАК ПользовательРС, - | СУММА(ВТДанныеПрофилей.АктивныхЗаНеделю) КАК АктивныхЗаНеделю, - | СУММА(ВТДанныеПрофилей.АктивныхЗаМесяц) КАК АктивныхЗаМесяц - | ИЗ - | ВТДанныеПрофилей КАК ВТДанныеПрофилей - | - | СГРУППИРОВАТЬ ПО - | ВТДанныеПрофилей.Профиль, - | ВТДанныеПрофилей.ПользовательРС) КАК Вложенный - | - |СГРУППИРОВАТЬ ПО - | Вложенный.Профиль - | - |ИНДЕКСИРОВАТЬ ПО - | Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Профили.Профиль КАК Профиль, - | Профили.Наименование КАК Наименование, - | Профили.ИдентификаторПоставляемыхДанных КАК ИдентификаторПоставляемыхДанных, - | Профили.ПоставляемыйПрофильИзменен КАК ПоставляемыйПрофильИзменен, - | ЕСТЬNULL(ГруппыДоступа.ГруппаДоступа, 0) КАК ГруппаДоступа, - | ЕСТЬNULL(ГруппыДоступа.ПерсональнаяГруппа, 0) КАК ПерсональнаяГруппа, - | ЕСТЬNULL(ГруппыПользователей.ГруппПользователей, 0) КАК ГруппПользователей, - | ЕСТЬNULL(ГруппыПользователей.ГруппВнешнихПользователей, 0) КАК ГруппВнешнихПользователей, - | ЕСТЬNULL(ПользователиПрофиля.Пользователи, 0) КАК Пользователи, - | ЕСТЬNULL(ПользователиПрофиля.ВнешниеПользователи, 0) КАК ВнешниеПользователи, - | ЕСТЬNULL(ПользователиПрофиля.АктивныхЗаНеделю, 0) КАК АктивныхЗаНеделю, - | ЕСТЬNULL(ПользователиПрофиля.АктивныхЗаМесяц, 0) КАК АктивныхЗаМесяц, - | ЕСТЬNULL(ВидыДоступа.ВсегоВидовДоступа, 0) КАК ВсегоВидовДоступа, - | ЕСТЬNULL(ВидыДоступа.ПредустановленныхВидовДоступа, 0) КАК ПредустановленныхВидовДоступа - |ИЗ - | Профили КАК Профили - | ЛЕВОЕ СОЕДИНЕНИЕ ПользователиПрофиля КАК ПользователиПрофиля - | ПО Профили.Профиль = ПользователиПрофиля.Профиль - | ЛЕВОЕ СОЕДИНЕНИЕ ГруппыПользователей КАК ГруппыПользователей - | ПО Профили.Профиль = ГруппыПользователей.Профиль - | ЛЕВОЕ СОЕДИНЕНИЕ ГруппыДоступа КАК ГруппыДоступа - | ПО Профили.Профиль = ГруппыДоступа.Профиль - | ЛЕВОЕ СОЕДИНЕНИЕ ВидыДоступа КАК ВидыДоступа - | ПО Профили.Профиль = ВидыДоступа.Профиль - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | Профили.Профиль КАК Профиль, - | ЕСТЬNULL(ПрофилиГруппДоступаРоли.Роль.Имя, """") КАК РольИмя - |ИЗ - | Профили КАК Профили - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли - | ПО Профили.Профиль = ПрофилиГруппДоступаРоли.Ссылка - | И (Профили.ИдентификаторПоставляемыхДанных = &ПустойУИД - | ИЛИ Профили.ПоставляемыйПрофильИзменен) - | - |УПОРЯДОЧИТЬ ПО - | Профиль"; - -КонецФункции - - #КонецОбласти @@ -4125,7 +3871,6 @@ #Область НастройкаОбработкиОшибок Процедура УстановитьДополнительнуюИнформациюОбработкиОшибок() Экспорт - ТекстИсключения = Неопределено; ИдентификаторИнформационнойБазы = ЦентрМониторинга.ИдентификаторИнформационнойБазы(); // Если идентификатор не задан - ничего не делаем. Если Не ЗначениеЗаполнено(ИдентификаторИнформационнойБазы) Тогда @@ -4141,12 +3886,13 @@ КодДляВыполнения = "Параметры.ОбработкаОшибок = ОбработкаОшибок; |Параметры.КодВыполнен = Истина;"; // Инициализируем менеджер обработки ошибок. + // АПК:280-выкл обработка исключения не требуется Попытка ОбщегоНазначения.ВыполнитьВБезопасномРежиме(КодДляВыполнения, Параметры); Исключение - ТекстИсключения = ОписаниеОшибки(); + // Исключение не выбрасываем. КонецПопытки; - Если Параметры.КодВыполнен Тогда + Если Параметры.КодВыполнен Тогда Попытка Если БезопасныйРежим() = Истина Тогда УстановитьОтключениеБезопасногоРежима(Истина); @@ -4175,9 +3921,10 @@ Параметры.ОбработкаОшибок.УстановитьОбщиеНастройки(ОбщиеНастройки); УстановитьПривилегированныйРежим(Ложь); Исключение - ТекстИсключения = ОписаниеОшибки(); - КонецПопытки; + // Исключение не выбрасываем. + КонецПопытки; КонецЕсли; + // АПК:280-вкл КонецПроцедуры #КонецОбласти diff --git a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl index 4c9526358..fcf755384 100644 --- a/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщений/Module.bsl @@ -17,7 +17,7 @@ // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы, необходим для размещения вложений во // временном хранилище при клиент-серверном вызове. Если вызов // происходит только на сервере, то можно использовать любой идентификатор. -// ДополнительныеПараметры - Структура - необязательный, список дополнительных параметров, который будет передан в +// ДополнительныеПараметры - Структура - список дополнительных параметров, который будет передан в // параметр Сообщение в процедурах ПриФормированииСообщения при создании сообщения: // * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет // необходимо ли преобразование HTML текста сообщения содержащего картинки в тексте письма из-за @@ -51,7 +51,7 @@ // определяемом типе ПредметШаблонаСообщения. // УникальныйИдентификатор - УникальныйИдентификатор - идентификатор формы, необходим для размещения вложений во // временном хранилище. -// ДополнительныеПараметры - Структура - необязательный, список дополнительных параметров, который будет передан в +// ДополнительныеПараметры - Структура - список дополнительных параметров, который будет передан в // параметр Сообщение в процедурах ПриФормированииСообщения при создании сообщения: // * ПреобразовыватьHTMLДляФорматированногоДокумента - Булево - необязательный, по умолчанию Ложь, определяет, // необходимо ли преобразование HTML-текста сообщения, содержащего картинки в тексте письма, из-за @@ -365,7 +365,7 @@ // ТекущийПользователь // // Параметры: -// ОбщиеРеквизиты - соответствие из КлючЗначение: +// ОбщиеРеквизиты - Соответствие из КлючИЗначение: // * Ключ - Строка - имя общего реквизита // * Значение - Строка - значение заполненного реквизита. // @@ -398,11 +398,7 @@ Возврат ТипЗнч(ШаблонСсылка) = Тип("СправочникСсылка.ШаблоныСообщений"); КонецФункции -// См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании -// -// Параметры: -// Объекты - см. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании.Объекты -// +// См. СозданиеНаОснованииПереопределяемый.ПриОпределенииОбъектовСКомандамиСозданияНаОсновании. Процедура ПриОпределенииОбъектовСКомандамиСозданияНаОсновании(Объекты) Экспорт Объекты.Добавить(Метаданные.Справочники.ШаблоныСообщений); diff --git a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl index 378ed88d1..14f068cb0 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийКлиентСервер/Module.bsl @@ -122,6 +122,14 @@ #Область СлужебныеПроцедурыИФункции +Функция ИмяШаблонаЭлектронныхПисем() Экспорт + Возврат "Email"; +КонецФункции + +Функция ИмяШаблонаSMS() Экспорт + Возврат "SMS"; +КонецФункции + Функция ИдентификаторОбщий() Экспорт Возврат "Общий"; КонецФункции diff --git a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl index ff20ad814..7e2b20f36 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийПереопределяемый/Module.bsl @@ -36,18 +36,19 @@ // // Параметры: // Реквизиты - ДеревоЗначений - список реквизитов шаблона: -// * Имя - Строка - уникальное имя общего реквизита; -// * Представление - Строка - представление общего реквизита; -// * Тип - Тип - тип реквизита. По умолчанию строка; -// * Подсказка - Строка - расширенная информация о реквизите; -// * Формат - Строка - формат вывода значения для чисел, дат, строк и булевых значений. +// * Имя - Строка - уникальное имя реквизита. +// * Представление - Строка - представление реквизита. +// * Тип - Тип - тип реквизита. +// * Подсказка - Строка - расширенная информация о реквизите. +// * Формат - Строка - формат вывода значения для чисел, дат, строк и булевых значений. +// Например, "ДЛФ=D" для даты. // Вложения - ТаблицаЗначений - печатные формы и вложения, где: -// * Имя - Строка - уникальное имя вложения; -// * Идентификатор - Строка - идентификатор вложения; -// * Представление - Строка - представление варианта; -// * Подсказка - Строка - расширенная информация о вложении; +// * Имя - Строка - уникальное имя вложения. +// * Идентификатор - Строка - идентификатор вложения. +// * Представление - Строка - представление варианта. +// * Подсказка - Строка - расширенная информация о вложении. // * ТипФайла - Строка - тип вложения, который соответствует расширению файла: "pdf", "png", "jpg", mxl" и др. -// НазначениеШаблона - Строка - имя назначения шаблон сообщения. +// НазначениеШаблона - Строка - назначение шаблона сообщения, например, "ОповещениеКлиентаИзменениеЗаказа". // ДополнительныеПараметры - Структура - дополнительные сведения о шаблоне сообщения. // Процедура ПриПодготовкеШаблонаСообщения(Реквизиты, Вложения, НазначениеШаблона, ДополнительныеПараметры) Экспорт @@ -60,13 +61,13 @@ // // Параметры: // Сообщение - Структура: -// * ЗначенияРеквизитов - Соответствие - список используемых в шаблоне реквизитов: +// * ЗначенияРеквизитов - Соответствие из КлючИЗначение - список используемых в шаблоне реквизитов: // ** Ключ - Строка - имя реквизита в шаблоне; // ** Значение - Строка - значение заполнения в шаблоне. -// * ЗначенияОбщихРеквизитов - Соответствие - список используемых в шаблоне общих реквизитов: +// * ЗначенияОбщихРеквизитов - Соответствие из КлючИЗначение - список используемых в шаблоне общих реквизитов: // ** Ключ - Строка - имя реквизита в шаблоне; // ** Значение - Строка - значение заполнения в шаблоне. -// * Вложения - Соответствие: +// * Вложения - Соответствие из КлючИЗначение: // ** Ключ - Строка - имя вложения в шаблоне; // ** Значение - ДвоичныеДанные // - Строка - двоичные данные или адрес во временном хранилище вложения. diff --git a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl index dc5a0514d..44ca0f1df 100644 --- a/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ШаблоныСообщенийСлужебный/Module.bsl @@ -284,10 +284,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -425,6 +421,9 @@ Возврат Сообщение; КонецФункции +// Возвращаемое значение: +// см. КонструкторСведенийОШаблоне +// Функция СведенияОШаблоне(ПараметрыШаблона) Экспорт СведенияОШаблоне = КонструкторСведенийОШаблоне(); @@ -855,8 +854,8 @@ Функция ВидыШаблонов() Экспорт ТипыШаблонов = Новый СписокЗначений; - ТипыШаблонов.Добавить("Email", НСтр("ru = 'Электронного письма'")); - ТипыШаблонов.Добавить("SMS", НСтр("ru = 'Сообщения SMS'")); + ТипыШаблонов.Добавить(ШаблоныСообщенийКлиентСервер.ИмяШаблонаЭлектронныхПисем(), НСтр("ru = 'Электронного письма'")); + ТипыШаблонов.Добавить(ШаблоныСообщенийКлиентСервер.ИмяШаблонаSMS(), НСтр("ru = 'Сообщения SMS'")); Возврат ТипыШаблонов; КонецФункции @@ -1028,7 +1027,7 @@ // // Параметры: // Владелец - СправочникСсылка.ШаблоныСообщений -// Сведения - см. ШаблоныСообщенийКлиентСервер.СтрокаВложений +// Сведения - см. ШаблоныСообщений.СтрокаВложений // ИмяФайла - Строка // Размер - Число // КоличествоПустыхИменВоВложениях - Число @@ -1847,6 +1846,14 @@ // Подставляет в шаблон значения параметров сообщения и формирует текст сообщения. // +// Параметры: +// ШаблонСтроки - Строка +// ВставляемыеЗначения - Соответствие +// Префикс - Строка +// +// Возвращаемое значение: +// Строка +// Функция ВставитьПараметрыВСтрокуСогласноТаблицеПараметров(Знач ШаблонСтроки, ВставляемыеЗначения, Знач Префикс = "") Экспорт Результат = ШаблонСтроки; @@ -1968,11 +1975,12 @@ // // Параметры: // ТекстHTML - Строка - HTML текст. +// Кодировка - Строка - кодировка текста // // Возвращаемое значение: // ДокументHTML - созданный документ HTML. // -Функция ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекстHTML,Кодировка = Неопределено) Экспорт +Функция ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекстHTML, Кодировка = Неопределено) Экспорт Построитель = Новый ПостроительDOM; ЧтениеHTML = Новый ЧтениеHTML; @@ -2117,11 +2125,11 @@ // Реквизит - ОбъектМетаданных // Префикс - Строка // СведенияОСпискеРеквизитов - Структура: -// * СписокРеквизитов -// * СписокСодержитДанные +// * СписокРеквизитов - Массив +// * СписокСодержитДанные - Булево // СведенияОИсключаемыхРеквизитах - Структура: -// * СписокРеквизитов -// * СписокСодержитДанные +// * СписокРеквизитов - Массив +// * СписокСодержитДанные - Булево // Процедура ДобавитьРеквизитПоМетаданнымОбъекта(Реквизиты, Реквизит, Префикс, СведенияОСпискеРеквизитов, СведенияОИсключаемыхРеквизитах) diff --git a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl index 435455f15..432f82120 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl @@ -141,7 +141,7 @@ // Устанавливает реквизиту ПодписанЭП значение Истина. // // Параметры: -// Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. +// Объект - ЛюбаяСсылка - по ссылке будет получен объект, заблокирован, изменен, записан. // Объект должен иметь реквизит ПодписанЭП. // - Объект - объект будет изменен без блокировки и без записи. // @@ -268,7 +268,7 @@ // Обновляет подпись объекта. // // Параметры: -// Объект - Ссылка - ссылка на подписанный объект, для которого требуется обновить подпись. +// Объект - ЛюбаяСсылка - ссылка на подписанный объект, для которого требуется обновить подпись. // // СвойстваПодписи - Строка - адрес временного хранилища, содержащий описанную ниже структуру. // - Структура - развернутое описание подписи: @@ -479,7 +479,7 @@ // Устанавливает реквизит Зашифрован по наличию сертификатов в регистре сведений СертификатаШифрования. // // Параметры: -// Объект - Ссылка - по ссылке будет получен объект, заблокирован, изменен, записан. +// Объект - ЛюбаяСсылка - по ссылке будет получен объект, заблокирован, изменен, записан. // Объект должен иметь реквизит Зашифрован. // - Объект - объект будет изменен без блокировки и без записи. // @@ -640,7 +640,7 @@ // - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. // // ДополнительныеПараметры - Неопределено - без дополнительных параметров. -// - Структура - с произвольным составом из следующих свойств: +// - Структура - с произвольным составом из следующих свойств: // * Наименование - Строка - представление сертификата в списке. // // * Пользователь - СправочникСсылка.Пользователь - пользователь, которому принадлежит сертификат. @@ -764,7 +764,23 @@ // Возвращаемое значение: // ТабличныйДокумент - табличный документ, содержащий готовый штамп электронной подписи. // -Функция ШтампВизуализацииЭлектроннойПодписи(Сертификат, ДатаПодписи = Неопределено, ТекстОтметки = "", ЛоготипОрганизации = Неопределено) Экспорт +Функция ШтампВизуализацииЭлектроннойПодписи(Сертификат, ДатаПодписи = Неопределено, + ТекстОтметки = "", ЛоготипОрганизации = Неопределено) Экспорт + + Если ЛоготипОрганизации = Неопределено И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда + МодульОрганизацииСервер = ОбщегоНазначения.ОбщийМодуль("ОрганизацииСервер"); + СертификатСсылка = СсылкаНаСертификат(Сертификат); + Если ЗначениеЗаполнено(СертификатСсылка) Тогда + Организация = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СертификатСсылка, "Организация"); + Если ЗначениеЗаполнено(Организация) Тогда + ДополнительныеСведения = МодульОрганизацииСервер.ДополнительныеСведенияОрганизации( + Организация, , ДатаПодписи); + Если ДополнительныеСведения.Свойство("ЭмблемаОрганизацииДляШтампаЭлектроннойПодписи") Тогда + ЛоготипОрганизации = ДополнительныеСведения.ЭмблемаОрганизацииДляШтампаЭлектроннойПодписи; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; СвойстваСертификата = СвойстваСертификата(Сертификат); @@ -773,15 +789,16 @@ Формат(СвойстваСертификата.ДатаНачала, "ДЛФ=D"), Формат(СвойстваСертификата.ДатаОкончания, "ДЛФ=D")); + ПараметрыШтампа = Новый Структура; + ПараметрыШтампа.Вставить("ДатаПодписи", ДатаПодписи); + ПараметрыШтампа.Вставить("НомерСертификата", СвойстваСертификата.СерийныйНомер); + ПараметрыШтампа.Вставить("ВыдалСертификат", СвойстваСертификата.КемВыдан); + ПараметрыШтампа.Вставить("ВладелецСертификата", СвойстваСертификата.КомуВыдан); + ПараметрыШтампа.Вставить("СрокДействия", ПериодДействия); + ПараметрыШтампа.Вставить("ТекстОтметки", ТекстОтметки); + Штамп = Справочники.СертификатыКлючейЭлектроннойПодписиИШифрования.ПолучитьМакет("Штамп"); - - Штамп.Параметры.ДатаПодписи = ДатаПодписи; - Штамп.Параметры.НомерСертификата = СвойстваСертификата.СерийныйНомер; - Штамп.Параметры.ВыдалСертификат = СвойстваСертификата.КемВыдан; - Штамп.Параметры.ВладелецСертификата = СвойстваСертификата.КомуВыдан; - Штамп.Параметры.СрокДействия = ПериодДействия; - Штамп.Параметры.ТекстОтметки = ТекстОтметки; - + ЗаполнитьЗначенияСвойств(Штамп.Параметры, ПараметрыШтампа); Если ЛоготипОрганизации <> Неопределено Тогда Штамп.Области.Картинка.Картинка = ЛоготипОрганизации; КонецЕсли; @@ -805,13 +822,13 @@ // например: ШтампЭП1 и т.д. // В таком случае штампы будут выведены в заданные области в том // порядке, в котором документ был подписан. -// - Соответствие - описывает места вывода штампов, где: +// - Соответствие из КлючИЗначение - описывает места вывода штампов, где: // * Ключ - Строка - имя области, куда выводить штамп. Для такой области должна // быть установлена произвольная ширина колонок, // отличная от ширины колонок остального документа. // * Значение - ТабличныйДокумент - штамп, полученный функцией // ЭлектроннаяПодпись.ШтампВизуализацииЭлектроннойПодписи. -// Размеры - Структура - необязательный параметр, позволяет изменять размеры штампа, со свойствами: +// Размеры - Структура - позволяет изменять размеры штампа, со свойствами: // * ЛеваяКолонка - Число - ширина левой колонки штампа, содержащей заголовки свойств. // По умолчанию - 10. // * ПраваяКолонка - Число - ширина правой колонки штампа, содержащей значения свойств. @@ -1112,6 +1129,11 @@ КонецЕсли; Возврат Ложь; КонецЕсли; + + ДатаПодписания = ДатаПодписания(ПодписьДляПроверки); + Если Не ЗначениеЗаполнено(ДатаПодписания) Тогда + ДатаПодписания = НаДату; + КонецЕсли; Иначе Сертификат = Неопределено; Попытка @@ -1208,8 +1230,17 @@ Или МенеджерКриптографииДляПроверки = "СервисКриптографии" Тогда МодульСервисКриптографии = ОбщегоНазначения.ОбщийМодуль("СервисКриптографии"); + ПараметрыПроверки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПроверкиСертификатаВСервисе( + ОбщиеНастройки(), РежимыПроверкиСертификата); Попытка - Результат = МодульСервисКриптографии.ПроверитьСертификат(ДанныеСертификата); + Если ПараметрыПроверки <> Неопределено Тогда + // АПК:287-выкл - №640 - допустимо вызывать несуществующую процедуру БТС, + // так как проверяется версия БТС 2.0.3, начиная с которой процедура существует. + Результат = МодульСервисКриптографии.ПроверитьСертификатСПараметрами(ДанныеСертификата, ПараметрыПроверки); + // АПК:287-вкл + Иначе + Результат = МодульСервисКриптографии.ПроверитьСертификат(ДанныеСертификата); + КонецЕсли; Исключение ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); Если ВызыватьИсключение Тогда @@ -1484,9 +1515,9 @@ // Возвращаемое значение: // Структура - персональные настройки для работы с электронной подписью: // * ДействияПриСохраненииСЭП - Строка - что делать при сохранении файлов с электронной подписью: -// ** "Спрашивать" - показывать диалог выбора подписей для сохранения. -// ** "СохранятьВсеПодписи" - всегда все подписи. -// * ПутиКПрограммамЭлектроннойПодписиИШифрования - Соответствие: +// "Спрашивать" - показывать диалог выбора подписей для сохранения; +// "СохранятьВсеПодписи" - всегда все подписи. +// * ПутиКПрограммамЭлектроннойПодписиИШифрования - Соответствие из КлючИЗначение: // ** Ключ - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования - программа. // ** Значение - Строка - путь к программе на компьютере пользователя. // * РасширениеДляФайловПодписи - Строка - расширение для файлов ЭП. @@ -1541,7 +1572,7 @@ // * ОписанияПрограмм - ФиксированныйМассив из см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы - // сведения о поддерживаемых программах криптографии. // -// * ОписанияПрограммПоСсылке - ФиксированноеСоответствие: +// * ОписанияПрограммПоСсылке - ФиксированноеСоответствие из КлючИЗначение: // ** Ключ - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // ** Значение - см. ЭлектроннаяПодписьСлужебныйПовтИсп.ОписаниеПрограммы // diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl index 9f6627198..3dcb42706 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl @@ -132,7 +132,7 @@ // модуля ЭлектроннаяПодписьКлиент. // * Данные - Строка - произвольная строка для подписания, // - ДвоичныеДанные - двоичные данные для подписания. -// * Объект - Ссылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. +// * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // Если не указан, то подпись не требуется добавлять. // - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в // регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). @@ -141,12 +141,12 @@ // свойство ТекущийЭлементНабораДанных, содержащее параметр СвойстваПодписи. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением подписи. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка // - Структура - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. // Структура содержит свойства: -// * Значение - Ссылка +// * Значение - ЛюбаяСсылка // - ОписаниеОповещения - для открытия. // * Представление - Строка - представление значения. // Вариант 2: @@ -169,7 +169,7 @@ // использоваться при блокировке объекта. // - Неопределено - использовать стандартную форму. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, например, если не указан параметр Объект и/или Форма. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: // * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение @@ -257,13 +257,13 @@ // * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл. // * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме // добавления подписей. Если не указан, значит Ложь. -// * Объект - Ссылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. +// * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект , к которому нужно добавить подпись. // - ОписаниеОповещения - (необязательный) - обработчик добавления подписи в // регистр сведений ЭлектронныеПодписи. Следует учесть общий подход (см. выше). // В момент вызова в ОписаниеДанных уже вставлен параметр Подписи. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением подписи. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. // * Данные - ДвоичныеДанные - (необязательный) - данные для проверки подписи. @@ -277,7 +277,7 @@ // использоваться при блокировке объекта. // - Неопределено - использовать стандартную форму. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата - например, если не указан параметр Объект и/или Форма. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: // * Успех - Булево - Истина, если все прошло успешно. @@ -374,10 +374,10 @@ // * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл. // * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме // добавления подписей. Если не указан, значит Ложь. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. -// * Объект - Ссылка - ссылка на объект, из которого нужно получить список подписей. +// * Объект - ЛюбаяСсылка - ссылка на объект, из которого нужно получить список подписей. // - Строка - адрес временного хранилища массива подписей с составом свойств, // как возвращает процедура ДобавитьПодписьИзФайла. // * Данные - ОписаниеОповещения - обработчик сохранения данных и получения полного имени @@ -397,7 +397,7 @@ // оповещения для метода НачатьЗапросРазрешенияПользователя. // Если разрешение не получено, значит, все отменено. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // В результат передается параметр: // * Булево - Истина, если все прошло успешно. // @@ -469,7 +469,7 @@ // - Массив - (необязательный) содержит значения // типа СправочникСсылка.СертификатыКлючейЭлектроннойПодписиИШифрования или // типа ДвоичныеДанные (выгрузка сертификата). -// - Ссылка - (необязательный) - ссылка на объект, для которого необходимо получить сертификаты. +// - ЛюбаяСсылка - (необязательный) - ссылка на объект, для которого необходимо получить сертификаты. // * ИзменятьНабор - Булево - если Истина и НаборСертификатов задан и содержит только ссылки // на сертификаты, тогда будет возможность изменить состав сертификатов. // * БезПодтверждения - Булево - (необязательный) - пропустить подтверждение пользователя, @@ -506,16 +506,16 @@ // В момент вызова в ОписаниеДанных уже вставлен параметр ЗашифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр ЗашифрованныеДанные. -// * Объект - Ссылка - (необязательный) - ссылка на объект, который необходимо зашифровать. +// * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект, который необходимо зашифровать. // Если не указан, то сертификаты шифрования не требуется добавлять. // * ВерсияОбъекта - Строка - (необязательный) - версия данных объекта для проверки и // блокировки объекта перед добавлением сертификатов шифрования. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка // - Структура - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. // Структура содержит свойства: -// * Значение - Ссылка +// * Значение - ЛюбаяСсылка // - ОписаниеОповещения - для открытия. // * Представление - Строка - представление значения. // @@ -539,7 +539,7 @@ // использоваться при помещении зашифрованных данных во временное хранилище. // - Неопределено - использовать стандартную форму. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата. // В результат передается входной параметр ОписаниеДанных, который в успешном случае дополняется свойствами: // * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение @@ -667,7 +667,7 @@ // В момент вызова в ОписаниеДанных уже вставлен параметр РасшифрованныеДанные. // В случае параметра НаборДанных, в ОписаниеДанных вставляется // свойство ТекущийЭлементНабораДанных, содержащее параметр РасшифрованныеДанные. -// * Объект - Ссылка - (необязательный) - ссылка на объект, который необходимо расшифровать, +// * Объект - ЛюбаяСсылка - (необязательный) - ссылка на объект, который необходимо расшифровать, // а также очистить записи из регистра сведений СертификатыШифрования // после успешного завершения расшифровки. // Если не указан, то сертификаты не требуется получать из объекта и очищать. @@ -678,12 +678,12 @@ // полученное из двоичных данных сертификата. // * Сертификат - ДвоичныеДанные - содержит выгрузку сертификата, // который использовался для шифрования. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка // - Структура - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. // Структура содержит свойства: -// * Значение - Ссылка +// * Значение - ЛюбаяСсылка // - ОписаниеОповещения - для открытия. // * Представление - Строка - представление значения. // @@ -711,7 +711,7 @@ // при помещении расшифрованных данных во временное хранилище. // - Неопределено - использовать стандартную форму. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // Требуется для нестандартной обработки результата, если не указан параметр Форма и/или РазмещениеРезультата. // В результат передается входной параметр ОписаниеДанных, который в успешном случае, дополняется свойствами: // * Успех - Булево - Истина, если все прошло успешно. Если Успех = Ложь, то частичное завершение @@ -1192,22 +1192,30 @@ КонецФункции -// Формирует структуру свойств для уточнения данных конверта SOAP и -// алгоритмов подписания и хеширования. +// Формирует структуру свойств для уточнения данных конверта SOAP и алгоритмов +// подписания и хеширования. +// +// Не требуется заполнять алгоритмы при использовании сертификатов +// с алгоритмами открытого ключа ГОСТ 94, ГОСТ 2001, ГОСТ 2012/256 и ГОСТ 2012/512. // +// Из сертификата извлекается OIDАлгоритмаОткрытогоКлюча и по нему из переданной таблицы +// определяются идентификаторы и XML-имена алгоритмов подписания и хеширования. +// // Возвращаемое значение: // Структура: -// * XPathSignedInfo - Строка - например, "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]". -// * XPathПодписываемыйТег - Строка - например, "(//. | //@* | //namespace::*)[ancestor-or-self::soap:Body]". -// * ИмяАлгоритмаПодписи - Строка - например, "GOST R 34.10-2001" + Символы.ПС + "GOST R 34.11-2012" + ... -// * OIDАлгоритмаПодписи - Строка - например, "1.2.643.2.2.3" + Символы.ПС + "1.2.643.7.1.1.3.2" + ... -// * ИмяАлгоритмаХеширования - Строка - например, "GOST R 34.11-94" + Символы.ПС + "GOST R 34.11-12" + ... -// * OIDАлгоритмаХеширования - Строка - например, "1.2.643.2.2.9" + Символы.ПС + "1.2.643.7.1.1.2.2" + ... -// * АлгоритмПодписи - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" -// + Символы.ПС + -// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" + ... -// * АлгоритмХеширования - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr3411" -// + Символы.ПС + "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" + ... +// * XPathSignedInfo - Строка - по умолчанию: "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]". +// * XPathПодписываемыйТег - Строка - по умолчанию: "(//. | //@* | //namespace::*)[ancestor-or-self::soap:Body]". +// +// * OIDАлгоритмаОткрытогоКлюча - Строка - например, "1.2.643.2.2.19" + Символы.ПС + "1.2.643.7.1.1.1.1" + ... +// * ИмяАлгоритмаПодписи - Строка - например, "GOST R 34.10-2001" + Символы.ПС + "GOST R 34.11-2012" + ... +// * OIDАлгоритмаПодписи - Строка - например, "1.2.643.2.2.3" + Символы.ПС + "1.2.643.7.1.1.3.2" + ... +// * ИмяАлгоритмаХеширования - Строка - например, "GOST R 34.11-94" + Символы.ПС + "GOST R 34.11-12" + ... +// * OIDАлгоритмаХеширования - Строка - например, "1.2.643.2.2.9" + Символы.ПС + "1.2.643.7.1.1.2.2" + ... +// * АлгоритмПодписи - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" +// + Символы.ПС + +// "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256" + ... +// * АлгоритмХеширования - Строка - например, "http://www.w3.org/2001/04/xmldsig-more#gostr3411" +// + Символы.ПС + "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256" + ... // Функция ПараметрыXMLDSig() Экспорт @@ -1537,7 +1545,7 @@ // * Данные - Строка - адрес временного хранилища, содержащего двоичные данные сертификата. // * Организация - СправочникСсылка.Организация - организация к которой относится сертификат. // Отбор - Неопределено - использовать значения по умолчанию, для свойств структуры, описанных ниже. -// - Структура: +// - Структура: // * ПроверятьСрокДействия - Булево - если свойства нет, значит Истина. // * ТолькоСертификатыСЗаполненнойПрограммой - Булево - если свойства нет, значит Истина, // в запросе к справочнику выбираются только те сертификаты, diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl index 0157d7ef6..1d8d268ef 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебный/Module.bsl @@ -115,7 +115,7 @@ // ИменаФайлов - Массив - имена файлов типа Строка. // // Возвращаемое значение: -// Соответствие: +// Соответствие из КлючИЗначение: // * Ключ - Строка - имя файла. // * Значение - Массив - имена файлов подписей типа Строка. // @@ -217,10 +217,6 @@ // Обработчики событий подсистем конфигурации. // См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления. -// -// Параметры: -// Обработчики - см. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления -// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -325,7 +321,7 @@ // См. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных. // // Параметры: -// Обработчики - см. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных.Обработчики +// Обработчики - см. ПоставляемыеДанныеПереопределяемый.ПолучитьОбработчикиПоставляемыхДанных.Обработчики // Процедура ПриОпределенииОбработчиковПоставляемыхДанных(Обработчики) Экспорт @@ -939,7 +935,6 @@ СертификатКриптографии = Новый СертификатКриптографии(Контекст.ДанныеСертификата); ЭтоПолноправныйПользователь = Пользователи.ЭтоПолноправныйПользователь(,, Ложь); - Сертификат = Неопределено; Для Каждого ОписаниеПрограммы Из ОписанияПрограмм Цикл ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); @@ -1032,7 +1027,7 @@ КонецЕсли; МодульСервисКриптографии = ОбщегоНазначения.ОбщийМодуль("СервисКриптографии"); - СвойстваСертификата = МодульСервисКриптографии.ПолучитьСвойстваСертификата(Сертификат); + СвойстваСертификата = МодульСервисКриптографии.ПолучитьСвойстваСертификата(ДанныеСертификата); МаркерыБезопасности = МаркерыБезопасности(СвойстваСертификата.Идентификатор); @@ -1554,14 +1549,15 @@ СвойстваКриптопровайдера = СвойстваКриптопровайдера(МенеджерКриптографии); ОбъектКомпоненты.ПутьККриптопровайдеру = СвойстваКриптопровайдера.Путь; + СертификатКриптографииBase64 = СертификатКриптографииBase64(СертификатКриптографии.Выгрузить()); + КонвертSOAP = СтрЗаменить( КонвертSOAP, "%BinarySecurityToken%", - СертификатКриптографииBase64(СертификатКриптографии.Выгрузить())); + СертификатКриптографииBase64); - ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты, - СертификатКриптографииBase64(СертификатКриптографии.Выгрузить()), - ДанныеАлгоритмаПодписания); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверитьВыбратьАлгоритмПодписи( + СертификатКриптографииBase64, ДанныеАлгоритмаПодписания, Истина); АтрибутDigestValue = РезультатHash( ОбъектКомпоненты, @@ -1600,7 +1596,8 @@ СертификатКриптографииBase64 = ЭлектроннаяПодписьСлужебныйКлиентСервер.СертификатИзКонвертаSOAP(КонвертSOAP); - ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты, СертификатКриптографииBase64, ДанныеАлгоритмаПодписания); + ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверитьВыбратьАлгоритмПодписи( + СертификатКриптографииBase64, ДанныеАлгоритмаПодписания, Истина); ПодписьВерна = РезультатVerifySign( ОбъектКомпоненты, @@ -1730,24 +1727,6 @@ КонецФункции -Функция OIDАлгоритмаПодписи(ОбъектКомпоненты, СертификатКриптографииBase64) - - Попытка - OIDАлгоритмаПодписи = ОбъектКомпоненты.GetSignOIDFromCert(СертификатКриптографииBase64); - Исключение - ВызватьИсключение НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") - + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - - Если OIDАлгоритмаПодписи = Неопределено Тогда - ВызватьИсключение НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") - + Символы.ПС + ОбъектКомпоненты.GetLastError(); - КонецЕсли; - - Возврат OIDАлгоритмаПодписи; - -КонецФункции - Функция C14N(ОбъектКомпоненты, КонвертSOAP, XPath) Попытка @@ -1858,14 +1837,8 @@ Функция РезультатCMSVerifySign(ОбъектКомпоненты, Подпись, Данные, ПараметрыCMS, ТипКриптопровайдера) - ПараметрыКомпоненты = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыКомпонентыCMSSign(ПараметрыCMS, Данные); - Попытка - ПодписьВерна = ОбъектКомпоненты.CMSVerifySign( - Base64Строка(Подпись), - 0, - "", - ТипКриптопровайдера); + ПодписьВерна = ОбъектКомпоненты.CMSVerifySign(Base64Строка(Подпись), 0, "", ТипКриптопровайдера); Исключение ВызватьИсключение НСтр("ru = 'Ошибка вызова метода CMSVerifySign компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; @@ -1878,42 +1851,6 @@ КонецФункции -Процедура ПроверитьВыбратьАлгоритмПодписи(ОбъектКомпоненты, СертификатКриптографииBase64, ДанныеАлгоритмаПодписания) - - OIDАлгоритмаПодписи = OIDАлгоритмаПодписи(ОбъектКомпоненты, СертификатКриптографииBase64); - - OIDАлгоритмовПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи, Символы.ПС); - OIDАлгоритмовХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Символы.ПС); - АлгоритмыПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмПодписи, Символы.ПС); - АлгоритмыХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмХеширования, Символы.ПС); - - ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаПодписи", Неопределено); - ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаХеширования", Неопределено); - ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмПодписи", Неопределено); - ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмХеширования", Неопределено); - Для Индекс = 0 По OIDАлгоритмовПодписи.Количество() - 1 Цикл - - Если OIDАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс] Тогда - - ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс]; - ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = OIDАлгоритмовХеширования[Индекс]; - ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи = АлгоритмыПодписи[Индекс]; - ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования = АлгоритмыХеширования[Индекс]; - - Прервать; - - КонецЕсли; - - КонецЦикла; - - Если Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Алгоритм подписи сертификата криптографии отличается от алгоритма %1.'"), - ДанныеАлгоритмаПодписания.ИмяАлгоритмаПодписи); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции. @@ -2374,10 +2311,10 @@ Возврат Ложь; КонецЕсли; - МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер = - ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьВМоделиСервисаКлиентСервер"); + МодульЭлектроннаяПодписьВМоделиСервиса = + ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьВМоделиСервиса"); - Возврат МодульЭлектроннаяПодписьВМоделиСервисаКлиентСервер.ИспользованиеВозможно(); + Возврат МодульЭлектроннаяПодписьВМоделиСервиса.ИспользованиеВозможно(); КонецФункции @@ -2562,7 +2499,7 @@ // Возвращаемое значение: // Структура: // * Ключ - Строка - начало идентификатора программы, например, CryptoPro. -// * Значение - ФиксированноеСоответствие: +// * Значение - ФиксированноеСоответствие из КлючИЗначение: // * Ключ - ТипПлатформы // * Значение - ФиксированныйМассив из Строка - пути // с именами модулей, разделенные символом двоеточие. diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl index 2ecb436c8..becc960e4 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйВызовСервера/Module.bsl @@ -653,9 +653,9 @@ КонецПроцедуры // Возвращаемое значение: -// Массив Из Структура: -// * Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования -// * Представление - Строка +// Массив из Структура: +// * Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования +// * Представление - Строка // Функция ИспользуемыеПрограммы() Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl index 65cb1322a..d17f6519a 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиент/Module.bsl @@ -31,7 +31,6 @@ КонецФункции - Процедура ПолучитьПутьКПрограмме(ОбработкаЗавершения, ПрограммаСсылка) Экспорт Результат = Новый Структура("ПутьКПрограмме, Существует", "", Ложь); @@ -111,7 +110,6 @@ КонецФункции - Процедура ПроверитьПутьКПрограмме(ОбработкаЗавершения, ПутьКПрограмме) Контекст = Новый Структура; @@ -180,7 +178,6 @@ КонецПроцедуры - Процедура ПолучитьПутьКПрограммеПоУмолчанию(ОбработкаЗавершения, ПрограммаСсылка) Экспорт Результат = Новый Структура("ПутьКПрограмме, Существует", "", Ложь); @@ -273,7 +270,6 @@ КонецПроцедуры - // Продолжение процедуры ДатаПодписания. Процедура ДатаПодписанияПослеЧтенияВБуферДвоичныхДанных(БуферДанныхПодписи, Контекст) Экспорт @@ -436,7 +432,7 @@ КонецПроцедуры // Возвращаемое значение: -// Структура: +// Структура: // * АдресСертификата - Строка // * ОткрытьДанные - см. ОткрытьСертификат.ОткрытьДанные // * ДанныеСертификата - см. ОткрытьСертификат.ДанныеСертификата @@ -567,7 +563,7 @@ КонецПроцедуры // Возвращаемое значение: -// Структура: +// Структура: // * АдресСертификата - Строка // * ИмяФайлаБезРасширения - Строка // * Сертификат - см. СохранитьСертификат.Сертификат @@ -632,8 +628,8 @@ // Продолжение процедуры СохранитьСертификат. // // Параметры: -// ПолученныеФайлы - Массив из ОписаниеПереданногоФайла -// Контекст - Структура +// ПолученныеФайлы - Массив из ОписаниеПереданногоФайла +// Контекст - Структура // Процедура СохранитьСертификатПослеПолученияФайлов(ПолученныеФайлы, Контекст) Экспорт @@ -676,8 +672,8 @@ // Продолжение процедуры СохранитьПодпись. // // Параметры: -// ПолученныеФайлы - Массив из ОписаниеПереданногоФайла -// Контекст - Структура +// ПолученныеФайлы - Массив из ОписаниеПереданногоФайла +// Контекст - Структура // Процедура СохранитьПодписьПослеПолученияФайла(ПолученныеФайлы, Контекст) Экспорт @@ -1244,7 +1240,7 @@ КонецПроцедуры // Возвращаемое значение: -// Структура: +// Структура: // * ОписаниеОшибкиНаСервере - Строка // * ОписаниеОшибкиНаКлиенте - Строка // * ПоказатьОшибку - см. ПроверитьСертификат.ПоказатьОшибку @@ -1289,11 +1285,37 @@ // Продолжение процедуры ПроверитьСертификат. Процедура ПроверитьСертификатНаКлиенте(Контекст) - Если ТипЗнч(Контекст.Сертификат) = Тип("СертификатКриптографии") Тогда - Контекст.Сертификат.НачатьВыгрузку(Новый ОписаниеОповещения( + СертификатДляПроверки = Контекст.Сертификат; + + Если ТипЗнч(СертификатДляПроверки) = Тип("Строка") Тогда + СертификатДляПроверки = ПолучитьИзВременногоХранилища(СертификатДляПроверки); + КонецЕсли; + Контекст.Вставить("СертификатДляПроверки", СертификатДляПроверки); + + Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда + СертификатКриптографии = Новый СертификатКриптографии; + СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения( + "ПроверитьСертификатПослеИнициализацииСертификата", ЭтотОбъект, Контекст), + СертификатДляПроверки); + Иначе + ПроверитьСертификатПослеИнициализацииСертификата(СертификатДляПроверки, Контекст) + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПроверитьСертификат. +Процедура ПроверитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт + + Контекст.Вставить("СертификатКриптографии", СертификатКриптографии); + Контекст.Вставить("РежимыПроверкиСертификата", + ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата( + ЗначениеЗаполнено(Контекст.НаДату))); + + Если ТипЗнч(Контекст.СертификатДляПроверки) = Тип("СертификатКриптографии") Тогда + Контекст.СертификатДляПроверки.НачатьВыгрузку(Новый ОписаниеОповещения( "ПроверитьСертификатПослеОпределенияАлгоритмаПодписания", ЭтотОбъект, Контекст)); Иначе - ПроверитьСертификатПослеОпределенияАлгоритмаПодписания(Контекст.Сертификат, Контекст); + ПроверитьСертификатПослеОпределенияАлгоритмаПодписания(Контекст.СертификатДляПроверки, Контекст); КонецЕсли; КонецПроцедуры @@ -1355,35 +1377,10 @@ Контекст.МенеджерКриптографии = Результат; - СертификатДляПроверки = Контекст.Сертификат; - - Если ТипЗнч(СертификатДляПроверки) = Тип("Строка") Тогда - СертификатДляПроверки = ПолучитьИзВременногоХранилища(СертификатДляПроверки); - КонецЕсли; - - Если ТипЗнч(СертификатДляПроверки) = Тип("ДвоичныеДанные") Тогда - СертификатКриптографии = Новый СертификатКриптографии; - СертификатКриптографии.НачатьИнициализацию(Новый ОписаниеОповещения( - "ПроверитьСертификатПослеИнициализацииСертификата", ЭтотОбъект, Контекст), - СертификатДляПроверки); - Иначе - ПроверитьСертификатПослеИнициализацииСертификата(СертификатДляПроверки, Контекст) - КонецЕсли; - -КонецПроцедуры - -// Продолжение процедуры ПроверитьСертификат. -Процедура ПроверитьСертификатПослеИнициализацииСертификата(СертификатКриптографии, Контекст) Экспорт - - РежимыПроверкиСертификата = ЭлектроннаяПодписьСлужебныйКлиентСервер.РежимыПроверкиСертификата( - ЗначениеЗаполнено(Контекст.НаДату)); - - Контекст.Вставить("СертификатКриптографии", СертификатКриптографии); - Контекст.МенеджерКриптографии.НачатьПроверкуСертификата(Новый ОписаниеОповещения( "ПроверитьСертификатНаКлиентеПослеПроверки", ЭтотОбъект, Контекст, "ПроверитьСертификатНаКлиентеПослеОшибкиПроверки", ЭтотОбъект), - Контекст.СертификатКриптографии, РежимыПроверкиСертификата); + Контекст.СертификатКриптографии, Контекст.РежимыПроверкиСертификата); КонецПроцедуры @@ -1448,8 +1445,19 @@ КонецЕсли; МодульСервисКриптографииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СервисКриптографииКлиент"); - МодульСервисКриптографииКлиент.ПроверитьСертификат(Новый ОписаниеОповещения( - "ПроверитьСертификатПослеПроверкиВМоделиСервиса", ЭтотОбъект, Контекст), ДанныеСертификата); + ПараметрыПроверки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыПроверкиСертификатаВСервисе( + ЭлектроннаяПодписьКлиент.ОбщиеНастройки(), Контекст.РежимыПроверкиСертификата); + + Если ПараметрыПроверки <> Неопределено Тогда + // АПК:287-выкл - №640 - допустимо вызывать несуществующую процедуру БТС, + // так как проверяется версия БТС 2.0.3, начиная с которой процедура существует. + МодульСервисКриптографииКлиент.ПроверитьСертификатСПараметрами(Новый ОписаниеОповещения( + "ПроверитьСертификатПослеПроверкиВМоделиСервиса", ЭтотОбъект, Контекст), ДанныеСертификата, ПараметрыПроверки); + // АПК:287-вкл + Иначе + МодульСервисКриптографииКлиент.ПроверитьСертификат(Новый ОписаниеОповещения( + "ПроверитьСертификатПослеПроверкиВМоделиСервиса", ЭтотОбъект, Контекст), ДанныеСертификата); + КонецЕсли; КонецПроцедуры @@ -1469,6 +1477,15 @@ Возврат; КонецЕсли; + ОшибкаПросрочки = ЭлектроннаяПодписьСлужебныйКлиентСервер.СертификатПросрочен( + Контекст.СертификатКриптографии, Контекст.НаДату, ДобавкаВремени()); + + Если ЗначениеЗаполнено(ОшибкаПросрочки) Тогда + Контекст.ОписаниеОшибкиНаСервере = ОшибкаПросрочки; + ПроверитьСертификатПослеНеуспешнойПроверки(Контекст); + Возврат; + КонецЕсли; + ВыполнитьОбработкуОповещения(Контекст.Оповещение, Истина); КонецПроцедуры @@ -1768,8 +1785,8 @@ // Продолжение процедуры СоздатьМенеджерКриптографии. // // Параметры: -// ИнформацияМодуля - ИнформацияМодуляКриптографии -// Контекст - Структура +// ИнформацияМодуля - ИнформацияМодуляКриптографии +// Контекст - Структура // Процедура СоздатьМенеджерКриптографииЦиклПослеПолученияИнформации(ИнформацияМодуля, Контекст) Экспорт @@ -1888,7 +1905,7 @@ // ПараметрыСоздания - Структура: // * ВЛичныйСписок - Булево - если не указано, значит Ложь. // Если Истина, то реквизит Пользователь будет заполнено текущим пользователем. -// * Организация - СправочникСсылка.Организации - значение по умолчанию. +// * Организация - ОпределяемыйТип.Организация - значение по умолчанию. // * СкрытьЗаявление - Булево - не предлагать создать заявление на выпуск сертификата. // * СоздатьЗаявление - Булево - сразу открыть форму создания заявления на выпуск сертификата. // @@ -2138,8 +2155,10 @@ ПараметрыФормы.Вставить("АдресДанныхСертификата", Адрес); ПараметрыФормы.Вставить("ЛичныйСписокПриДобавлении", Контекст.ВЛичныйСписок); ПараметрыФормы.Вставить("Организация", Контекст.Организация); + + ОбработчикЗавершения = ?(Контекст.Свойство("ОбработчикЗавершения"), Контекст.ОбработчикЗавершения, Неопределено); Форма = ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ДобавлениеСертификатаДляШифрования", - ПараметрыФормы, , , , , Контекст.ОбработчикЗавершения); + ПараметрыФормы, , , , , ОбработчикЗавершения); Если Форма = Неопределено Тогда ПоказатьПредупреждение(, @@ -2533,10 +2552,10 @@ // * ЗаголовокДанных - Строка - заголовок элемента данных, например Файл. // * ПоказатьКомментарий - Булево - (необязательный) - разрешает ввод комментария в форме // добавления подписей. Если не указан, значит Ложь. -// * Представление - Ссылка +// * Представление - ЛюбаяСсылка // - Строка - (необязательный), если не указан, тогда // представление вычисляется по значению свойства Объект. -// * Объект - Ссылка - ссылка на объект с табличной частью ЭлектронныеПодписи, +// * Объект - ЛюбаяСсылка - ссылка на объект с табличной частью ЭлектронныеПодписи, // из которой нужно получить список подписей. // * --// -- - Строка - адрес временного хранилища массива подписей с составом свойств, // как возвращает процедура ДобавитьПодписьИзФайла. @@ -2557,7 +2576,7 @@ // оповещения для метода НачатьЗапросРазрешенияПользователя. // Если разрешение не получено, значит все отменено. // -// ОбработкаРезультата - ОписаниеОповещения - необязательный параметр. +// ОбработкаРезультата - ОписаниеОповещения - // В результат передается параметр: // * Булево - Истина, если все прошло успешно. // @@ -2933,6 +2952,7 @@ ИначеЕсли РазрешенияПолучены Тогда ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов(); + ПараметрыСохранения.Интерактивно = Ложь; ПараметрыСохранения.Диалог.Каталог = Контекст.ПутьКФайлам; ФайловаяСистемаКлиент.СохранитьФайлы(Новый ОписаниеОповещения( "СохранитьДанныеВместеСПодписьюПослеПолученияФайлов", ЭтотОбъект, Контекст), @@ -3436,8 +3456,7 @@ // Только для внутреннего использования. Процедура ВыполнитьНаСтороне(Оповещение, Операция, СторонаВыполнения, ПараметрыВыполнения) Экспорт - Контекст = Новый Структура("ОписаниеДанных, Форма, ИдентификаторФормы, ЗначениеПароля, - |СертификатВерен, СертификатАдрес, ТекущийСписокПредставлений, ПолноеПредставлениеДанных"); + Контекст = ВыполнитьНаСторонеНовыйКонтекст(); ЗаполнитьЗначенияСвойств(Контекст, ПараметрыВыполнения); @@ -3614,6 +3633,11 @@ КонецПроцедуры // Продолжение процедуры ВыполнитьНаСтороне. +// +// Параметры: +// Результат - Число +// Контекст - см. ВыполнитьНаСторонеНовыйКонтекст +// Процедура ВыполнитьНаСторонеЦиклНачалоПродолжение(Результат, Контекст) Экспорт Контекст.Индекс = Контекст.Индекс + 1; @@ -3853,10 +3877,10 @@ // Продолжение процедуры ВыполнитьНаСтороне. // // Параметры: -// ДвоичныеДанные - Структура: -// * ИнформацияОбОшибке - Структура: -// ** Описание - Строка -// Контекст - Структура +// ДвоичныеДанные - Структура: +// * ИнформацияОбОшибке - Структура: +// ** Описание - Строка +// Контекст - Структура // Процедура ВыполнитьНаСторонеЦиклПослеОперацииНаКлиенте(ДвоичныеДанные, Контекст) Экспорт @@ -4084,6 +4108,35 @@ КонецПроцедуры +// Возвращаемое значение: +// Структура: +// * Оповещение - ОписаниеОповещения +// * Операция - Строка +// * НаСторонеКлиента - Булево +// * ОперацияНачалась - Булево +// * ОписаниеДанных - Структура +// * Форма - ФормаКлиентскогоПриложения +// * ИдентификаторФормы - УникальныйИдентификатор +// * ЗначениеПароля - Строка +// * СертификатВерен - Неопределено +// - Булево +// * СертификатАдрес - Строка +// * ТекущийСписокПредставлений - СписокЗначений +// - Массив +// * ПолноеПредставлениеДанных - Строка +// * МенеджерКриптографии - МенеджерКриптографии +// - Строка +// * СертификатКриптографии - СертификатКриптографии +// * Индекс - Число +// * СвойстваСертификатов - Структура +// * СертификатыШифрования - Массив +// +Функция ВыполнитьНаСторонеНовыйКонтекст() + + Возврат Новый Структура("ОписаниеДанных, Форма, ИдентификаторФормы, ЗначениеПароля, + |СертификатВерен, СертификатАдрес, ТекущийСписокПредставлений, ПолноеПредставлениеДанных"); + +КонецФункции // Только для внутреннего использования. Функция СвойстваТекущегоЭлементаДанных(ПараметрыВыполнения, СвойстваПодписи = Неопределено) Экспорт @@ -4433,8 +4486,8 @@ КонецПроцедуры // Параметры: -// ИнформацияМодуляКриптографии - ИнформацияМодуляКриптографии -// Контекст - Структура +// ИнформацияМодуляКриптографии - ИнформацияМодуляКриптографии +// Контекст - Структура // Процедура ПослеПолученияИнформацииМодуляКриптографии(ИнформацияМодуляКриптографии, Контекст) Экспорт @@ -4604,71 +4657,11 @@ Процедура НачатьПодписаниеXMLDSig(Контекст) - Попытка - ОписаниеОповещения = Новый ОписаниеОповещения( - "Подписание_ПослеВыполненияGetSignOIDFromCert", ЭтотОбъект, Контекст, - "Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка", ЭтотОбъект); - - Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( - ОписаниеОповещения, - Контекст.СертификатКриптографииBase64); - Исключение - ЗавершитьОперациюСОшибкой( - Контекст, - НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; + ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверитьВыбратьАлгоритмПодписи( + Контекст.СертификатКриптографииBase64, Контекст.ДанныеАлгоритмаПодписания); -КонецПроцедуры - -Процедура Подписание_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - - ЗавершитьОперациюСОшибкой( - Контекст, - НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - -КонецПроцедуры - -Процедура Подписание_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт - - Если OIDАлгоритмаПодписи = Неопределено Тогда - НачатьПолучениеТекстаОшибки(НСтр("ru = 'При выполнении метода GetSignOIDFromCert произошла ошибка:'"), Контекст); - Возврат; - КонецЕсли; - - OIDАлгоритмовПодписи = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи, Символы.ПС); - OIDАлгоритмовХеширования = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Символы.ПС); - АлгоритмыПодписи = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.АлгоритмПодписи, Символы.ПС); - АлгоритмыХеширования = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.АлгоритмХеширования, Символы.ПС); - - Контекст.ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаПодписи", Неопределено); - Контекст.ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаХеширования", Неопределено); - Контекст.ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмПодписи", Неопределено); - Контекст.ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмХеширования", Неопределено); - Для Индекс = 0 По OIDАлгоритмовПодписи.Количество() - 1 Цикл - - Если OIDАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс] Тогда - - Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс]; - Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = OIDАлгоритмовХеширования[Индекс]; - Контекст.ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи = АлгоритмыПодписи[Индекс]; - Контекст.ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования = АлгоритмыХеширования[Индекс]; - - Прервать; - - КонецЕсли; - - КонецЦикла; - - Если Не ЗначениеЗаполнено(Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи) Тогда - - ЗавершитьОперациюСОшибкой( - Контекст, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Алгоритм подписи сертификата криптографии отличается от алгоритма %1.'"), - Контекст.ДанныеАлгоритмаПодписания.ИмяАлгоритмаПодписи)); - + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ЗавершитьОперациюСОшибкой(Контекст, ТекстОшибки); Иначе Контекст.КонвертSOAP = СтрЗаменить(Контекст.КонвертSOAP, "%SignatureMethod%", Контекст.ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи); @@ -4825,54 +4818,11 @@ Процедура НачатьПроверкуПодписиXMLDSig(Контекст) - Попытка - ОписаниеОповещения = Новый ОписаниеОповещения( - "Проверка_ПослеВыполненияGetSignOIDFromCert", ЭтотОбъект, Контекст, - "Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка", ЭтотОбъект); - - Контекст.ОбъектКомпоненты.НачатьВызовGetSignOIDFromCert( - ОписаниеОповещения, - Контекст.СертификатКриптографииBase64); - Исключение - ЗавершитьОперациюСОшибкой(Контекст, - НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; + ТекстОшибки = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПроверитьВыбратьАлгоритмПодписи( + Контекст.СертификатКриптографииBase64, Контекст.ДанныеАлгоритмаПодписания); -КонецПроцедуры - -Процедура Проверка_ПослеВыполненияGetSignOIDFromCert_Ошибка(ИнформацияОбОшибке, СтандартнаяОбработка, Контекст) Экспорт - - СтандартнаяОбработка = Ложь; - - ЗавершитьОперациюСОшибкой( - Контекст, - НСтр("ru = 'Ошибка вызова метода GetSignOIDFromCert компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - -КонецПроцедуры - -Процедура Проверка_ПослеВыполненияGetSignOIDFromCert(OIDАлгоритмаПодписи, Параметры, Контекст) Экспорт - - Если OIDАлгоритмаПодписи = Неопределено Тогда - НачатьПолучениеТекстаОшибки(НСтр("ru = 'При выполнении метода GetSignOIDFromCert произошла ошибка:'"), Контекст); - Возврат; - КонецЕсли; - - OIDАлгоритмовПодписи = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи, Символы.ПС); - OIDАлгоритмовХеширования = СтрРазделить(Контекст.ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Символы.ПС); - - Контекст.ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаПодписи", Неопределено); - Контекст.ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаХеширования", Неопределено); - Для Индекс = 0 По OIDАлгоритмовПодписи.Количество() - 1 Цикл - Если OIDАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс] Тогда - Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс]; - Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = OIDАлгоритмовХеширования[Индекс]; - КонецЕсли; - КонецЦикла; - - Если Не ЗначениеЗаполнено(Контекст.ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи) Тогда - ЗавершитьОперациюСОшибкой( - Контекст, - НСтр("ru = 'Ошибка вызова метода Hash компоненты XMLDSig.'") + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + ЗавершитьОперациюСОшибкой(Контекст, ТекстОшибки); Иначе Попытка @@ -5489,9 +5439,9 @@ // Продолжение процедуры ВыполнитьНаСтороне. // // Параметры: -// РезультатПоиска - Структура: -// * ОписаниеОшибки - ИнформацияОбОшибке -// Контекст - Структура +// РезультатПоиска - Структура: +// * ОписаниеОшибки - ИнформацияОбОшибке +// Контекст - Структура // Процедура ВыполнитьНаСторонеПослеВыгрузкиСертификатаВМоделиСервиса(РезультатПоиска, Контекст) Экспорт @@ -5867,7 +5817,7 @@ КонецФункции -Функция ДиагностическаяИнформацияОПрограммах(Оповещение) +Процедура ДиагностическаяИнформацияОПрограммах(Оповещение) ИспользуемыеПрограммы = ЭлектроннаяПодписьСлужебныйВызовСервера.ИспользуемыеПрограммы(); Если ИспользуемыеПрограммы.Количество() = 0 Тогда @@ -5883,9 +5833,9 @@ ИнформацияОПрограммахЦиклНачало(Контекст); -КонецФункции +КонецПроцедуры -Функция ИнформацияОПрограммахЦиклНачало(Контекст) +Процедура ИнформацияОПрограммахЦиклНачало(Контекст) ПараметрыСоздания = ПараметрыСозданияМенеджераКриптографии(); ПараметрыСоздания.ПоказатьОшибку = Неопределено; @@ -5897,15 +5847,15 @@ СоздатьМенеджерКриптографии(Оповещение, "", ПараметрыСоздания); -КонецФункции +КонецПроцедуры // Описание // // Параметры: -// МенеджерКриптографии - МенеджерКриптографии -// Контекст - Структура: -// * Индекс - Число +// МенеджерКриптографии - МенеджерКриптографии +// Контекст - Структура: +// * Индекс - Число // Процедура ИнформацияОПрограммахПослеСозданияМенеджераКриптографии(МенеджерКриптографии, Контекст) Экспорт diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl index 409d06794..068316447 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйКлиентСервер/Module.bsl @@ -63,7 +63,7 @@ // когда операция одна (не заполнен, когда операций несколько). // * Общая - Булево - если Истина, то одна ошибка общая для всех программ. // * ИмяКомпьютера - Строка - имя компьютера при выполнении операции на стороне сервера. -// * Ошибки - Массив Из см. НовыеСвойстваОшибки +// * Ошибки - Массив из см. НовыеСвойстваОшибки // Функция НовоеОписаниеОшибок(ИмяКомпьютера = "") Экспорт @@ -233,9 +233,9 @@ // Параметры: // ОписаниеПрограммы - Структура: // * Ссылка - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования -// АлгоритмыПодписи - Массив Из Строка +// АлгоритмыПодписи - Массив из Строка // АлгоритмПодписи - Строка -// Ошибки - Массив Из см. НовыеСвойстваОшибки +// Ошибки - Массив из см. НовыеСвойстваОшибки // ЭтоСервер - Булево // ДобавлятьОшибку - Булево // @@ -427,7 +427,7 @@ // Только для внутреннего использования. // // Параметры: -// Ошибки - Массив Из см. НовыеСвойстваОшибки +// Ошибки - Массив из см. НовыеСвойстваОшибки // Программа - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // Описание - Строка // КАдминистратору - Булево @@ -663,6 +663,30 @@ КонецФункции +// Только для внутреннего использования. +Функция ПараметрыПроверкиСертификатаВСервисе(ОбщиеНастройки, РежимыПроверкиСертификата) Экспорт + + Если Не ОбщиеНастройки.ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами Тогда + Возврат Неопределено; + КонецЕсли; + + Режимы = Новый Массив; + Для Каждого Режим Из РежимыПроверкиСертификата Цикл + Если Режим = РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия Тогда + Режимы.Добавить("ИгнорироватьВремяДействия"); + ИначеЕсли Режим = РежимПроверкиСертификатаКриптографии.ИгнорироватьДействительностьПодписи Тогда + Режимы.Добавить("ИгнорироватьДействительностьПодписи"); + ИначеЕсли Режим = РежимПроверкиСертификатаКриптографии.ИгнорироватьПроверкуВСпискеОтозванныхСертификатов Тогда + Режимы.Добавить("ИгнорироватьПроверкуВСпискеОтозванныхСертификатов"); + ИначеЕсли Режим = РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты Тогда + Режимы.Добавить("РазрешитьТестовыеСертификаты"); + КонецЕсли; + КонецЦикла; + + Возврат Новый Структура("РежимПроверкиСертификата", СтрСоединить(Режимы, ",")); + +КонецФункции + // Только для внутреннего использования. Функция СертификатПросрочен(Сертификат, НаДату, ДобавкаВремени) Экспорт @@ -1244,8 +1268,10 @@ ДанныеАлгоритмаПодписания = Новый Структура; - ДанныеАлгоритмаПодписания.Вставить("XPathSignedInfo", ""); - ДанныеАлгоритмаПодписания.Вставить("XPathПодписываемыйТег", ""); + ДанныеАлгоритмаПодписания.Вставить("XPathSignedInfo", "(//. | //@* | //namespace::*)[ancestor-or-self::*[local-name()='SignedInfo']]"); + ДанныеАлгоритмаПодписания.Вставить("XPathПодписываемыйТег", "(//. | //@* | //namespace::*)[ancestor-or-self::soap:Body]"); + + ДанныеАлгоритмаПодписания.Вставить("OIDАлгоритмаОткрытогоКлюча", ""); ДанныеАлгоритмаПодписания.Вставить("ИмяАлгоритмаПодписи", ""); ДанныеАлгоритмаПодписания.Вставить("OIDАлгоритмаПодписи", ""); @@ -1260,6 +1286,96 @@ КонецФункции +// Возвращаемое значение: +// см. НовыйНаборАлгоритмовДляСозданияПодписи +// Неопределено - если набор не найден. +// +Функция НаборАлгоритмовДляСозданияПодписи(ИдентификаторАлгоритмаОткрытогоКлюча) + + Наборы = НаборыАлгоритмовДляСозданияПодписи(); + Для Каждого Набор Из Наборы Цикл + Если Набор.ИдентификаторАлгоритмаОткрытогоКлюча = ИдентификаторАлгоритмаОткрытогоКлюча Тогда + Возврат Набор; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +Функция ПроверитьВыбратьАлгоритмПодписи(СертификатКриптографииBase64, ДанныеАлгоритмаПодписания, ВызыватьИсключение = Ложь) Экспорт + + OIDАлгоритмаОткрытогоКлюча = АлгоритмПодписиСертификата( + Base64Значение(СертификатКриптографииBase64),, Истина); + + Если Не ЗначениеЗаполнено(OIDАлгоритмаОткрытогоКлюча) Тогда + ТекстОшибки = НСтр("ru = 'Не удалось получить алгоритм открытого ключа из сертификата.'"); + Если ВызыватьИсключение Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Возврат ТекстОшибки; + КонецЕсли; + + ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаПодписи", Неопределено); + ДанныеАлгоритмаПодписания.Вставить("OIDВыбранногоАлгоритмаХеширования", Неопределено); + ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмПодписи", Неопределено); + ДанныеАлгоритмаПодписания.Вставить("ВыбранныйАлгоритмХеширования", Неопределено); + + OIDАлгоритмовОткрытогоКлюча = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаОткрытогоКлюча, Символы.ПС); + OIDАлгоритмовПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаПодписи, Символы.ПС); + OIDАлгоритмовХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.OIDАлгоритмаХеширования, Символы.ПС); + АлгоритмыПодписи = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмПодписи, Символы.ПС); + АлгоритмыХеширования = СтрРазделить(ДанныеАлгоритмаПодписания.АлгоритмХеширования, Символы.ПС); + + АлгоритмыУказаны = Ложь; + Для Индекс = 0 По OIDАлгоритмовОткрытогоКлюча.Количество() - 1 Цикл + + Если OIDАлгоритмаОткрытогоКлюча = OIDАлгоритмовОткрытогоКлюча[Индекс] Тогда + + ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = OIDАлгоритмовПодписи[Индекс]; + ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = OIDАлгоритмовХеширования[Индекс]; + ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи = АлгоритмыПодписи[Индекс]; + ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования = АлгоритмыХеширования[Индекс]; + + АлгоритмыУказаны = Истина; + Прервать; + + КонецЕсли; + + КонецЦикла; + + Если Не АлгоритмыУказаны Тогда + НаборАлгоритмов = НаборАлгоритмовДляСозданияПодписи( + OIDАлгоритмаОткрытогоКлюча); + + Если НаборАлгоритмов <> Неопределено Тогда + ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи = НаборАлгоритмов.ИдентификаторАлгоритмаПодписи; + ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования = НаборАлгоритмов.ИдентификаторАлгоритмаХеширования; + ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи = НаборАлгоритмов.ИмяАлгоритмаПодписиXML; + ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования = НаборАлгоритмов.ИмяАлгоритмаХешированияXML; + КонецЕсли; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаПодписи) + Или Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.OIDВыбранногоАлгоритмаХеширования) + Или Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмПодписи) + Или Не ЗначениеЗаполнено(ДанныеАлгоритмаПодписания.ВыбранныйАлгоритмХеширования) Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не указаны алгоритмы подписания и хеширования для создания подписи, + |соответствующие алгоритму открытого ключа сертификата (OID %1).'"), + OIDАлгоритмаОткрытогоКлюча); + + Если ВызыватьИсключение Тогда + ВызватьИсключение ТекстОшибки; + КонецЕсли; + Возврат ТекстОшибки; + КонецЕсли; + + Возврат ""; + +КонецФункции + // См. ЭлектроннаяПодписьКлиент.ПараметрыCMS. Функция ПараметрыCMS() Экспорт @@ -1584,19 +1700,19 @@ #Область АлгоритмыПодписи -Функция АлгоритмСформированнойПодписи(ДанныеПодписи, ВключаяOID = Ложь) Экспорт +Функция АлгоритмСформированнойПодписи(ДанныеПодписи, ВключаяOID = Ложь, ТолькоOID = Ложь) Экспорт - Возврат АлгоритмПодписи(ДанныеПодписи, Ложь, ВключаяOID); + Возврат АлгоритмПодписи(ДанныеПодписи, Ложь, ВключаяOID, ТолькоOID); КонецФункции -Функция АлгоритмПодписиСертификата(ДанныеСертификата, ВключаяOID = Ложь) Экспорт +Функция АлгоритмПодписиСертификата(ДанныеСертификата, ВключаяOID = Ложь, ТолькоOID = Ложь) Экспорт - Возврат АлгоритмПодписи(ДанныеСертификата, Истина, ВключаяOID); + Возврат АлгоритмПодписи(ДанныеСертификата, Истина, ВключаяOID, ТолькоOID); КонецФункции -Функция АлгоритмПодписи(Данные, ЭтоДанныеСертификата, ВключаяOID = Ложь) +Функция АлгоритмПодписи(Данные, ЭтоДанныеСертификата, ВключаяOID = Ложь, ТолькоOID = Ложь) ДвоичныеДанные = ДвоичныеДанныеИзДанных(Данные, "ЭлектроннаяПодписьСлужебныйКлиентСервер.АлгоритмПодписи"); @@ -1671,6 +1787,10 @@ Возврат ""; КонецЕсли; + Если ТолькоOID Тогда + Возврат OIDАлгоритмаПодписи; + КонецЕсли; + ИдентификаторыАлгоритмов = ИдентификаторыАлгоритмовПодписи(ЭтоДанныеСертификата); Алгоритм = АлгоритмПоOID(OIDАлгоритмаПодписи, ИдентификаторыАлгоритмов, ВключаяOID); @@ -1773,7 +1893,7 @@ // * ЭтоОшибкаКодированияASN1 - Булево // * ЭтоОшибкаСтруктурыДанных - Булево // * Смещение - Число -// * Родители - Массив Из Структура +// * Родители - Массив из Структура // * Буфер - БуферДвоичныхДанных // Функция НовыйАнализДанных(ДвоичныеДанные) @@ -2184,34 +2304,167 @@ ИдентификаторыАлгоритмов = Новый Соответствие; - ИдентификаторыАлгоритмов.Вставить("1.2.643.2.2.20", ИменаАлгоритмовПодписиГОСТ_34_10_94()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.2.2.19", ИменаАлгоритмовПодписиГОСТ_34_10_2001()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.1.1", ИменаАлгоритмовПодписиГОСТ_34_10_2012_256()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.1.2", ИменаАлгоритмовПодписиГОСТ_34_10_2012_512()); - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.1.1.1", "RSA_SIGN"); // RSAEncryption. - - Если Не ТолькоАлгоритмыОткрытогоКлюча Тогда - ИдентификаторыАлгоритмов.Вставить("1.2.643.2.2.4", ИменаАлгоритмовПодписиГОСТ_34_10_94()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.2.2.3", ИменаАлгоритмовПодписиГОСТ_34_10_2001()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.3.2", ИменаАлгоритмовПодписиГОСТ_34_10_2012_256()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.3.3", ИменаАлгоритмовПодписиГОСТ_34_10_2012_512()); - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.1.1.2", "RSA_SIGN"); // md2WithRSAEncryption. - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.1.1.3", "RSA_SIGN"); // md4withRSAEncryption. - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.1.1.4", "RSA_SIGN"); // md5WithRSAEncryption. - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.1.1.5", "RSA_SIGN"); // sha1WithRSAEncryption. - КонецЕсли; + Наборы = НаборыАлгоритмовДляСозданияПодписи(); + Для Каждого Набор Из Наборы Цикл + ИдентификаторыАлгоритмов.Вставить(Набор.ИдентификаторАлгоритмаОткрытогоКлюча, + СтрСоединить(Набор.ИменаАлгоритмаПодписи, ", ")); + Если ТолькоАлгоритмыОткрытогоКлюча Тогда + Продолжить; + КонецЕсли; + ИдентификаторыАлгоритмов.Вставить(Набор.ИдентификаторАлгоритмаПодписи, + СтрСоединить(Набор.ИменаАлгоритмаПодписи, ", ")); + КонецЦикла; Возврат ИдентификаторыАлгоритмов; КонецФункции +Функция ИдентификаторыАлгоритмовХеширования() + + ИдентификаторыАлгоритмов = Новый Соответствие; + + Наборы = НаборыАлгоритмовДляСозданияПодписи(); + Для Каждого Набор Из Наборы Цикл + ИдентификаторыАлгоритмов.Вставить(Набор.ИдентификаторАлгоритмаХеширования, + СтрСоединить(Набор.ИменаАлгоритмаХеширования, ", ")); + КонецЦикла; + + Возврат ИдентификаторыАлгоритмов; + +КонецФункции + + +// Возвращаемое значение: +// Массив из см. НовыйНаборАлгоритмовДляСозданияПодписи +// +Функция НаборыАлгоритмовДляСозданияПодписи() + + Наборы = Новый Массив; + + // ГОСТ 94 + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.2.2.20"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.643.2.2.4"; + Свойства.ИменаАлгоритмаПодписи = ИменаАлгоритмовПодписиГОСТ_34_10_94(); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.643.2.2.9"; + Свойства.ИменаАлгоритмаХеширования = ИменаАлгоритмовХешированияГОСТ_34_11_94(); + Свойства.ИмяАлгоритмаПодписиXML = "http://www.w3.org/2001/04/xmldsig-more#gostr341094-gostr3411"; + Свойства.ИмяАлгоритмаХешированияXML = "http://www.w3.org/2001/04/xmldsig-more#gostr3411"; + Наборы.Добавить(Свойства); + + // ГОСТ 2001 + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.2.2.19"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.643.2.2.3"; + Свойства.ИменаАлгоритмаПодписи = ИменаАлгоритмовПодписиГОСТ_34_10_2001(); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.643.2.2.9"; + Свойства.ИменаАлгоритмаХеширования = ИменаАлгоритмовХешированияГОСТ_34_11_94(); + Свойства.ИмяАлгоритмаПодписиXML = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"; + Свойства.ИмяАлгоритмаХешированияXML = "http://www.w3.org/2001/04/xmldsig-more#gostr3411"; + Наборы.Добавить(Свойства); + + // ГОСТ 2012/256 + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.7.1.1.1.1"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.643.7.1.1.3.2"; + Свойства.ИменаАлгоритмаПодписи = ИменаАлгоритмовПодписиГОСТ_34_10_2012_256(); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.643.7.1.1.2.2"; + Свойства.ИменаАлгоритмаХеширования = ИменаАлгоритмовХешированияГОСТ_34_11_2012_256(); + Свойства.ИмяАлгоритмаПодписиXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"; + Свойства.ИмяАлгоритмаХешированияXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"; + Наборы.Добавить(Свойства); + + // ГОСТ 2012/512 + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.643.7.1.1.1.2"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.643.7.1.1.3.3"; + Свойства.ИменаАлгоритмаПодписи = ИменаАлгоритмовПодписиГОСТ_34_10_2012_512(); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.643.7.1.1.2.3"; + Свойства.ИменаАлгоритмаХеширования = ИменаАлгоритмовХешированияГОСТ_34_11_2012_512(); + Свойства.ИмяАлгоритмаПодписиXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512"; + Свойства.ИмяАлгоритмаХешированияXML = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512"; + Наборы.Добавить(Свойства); + + // md2WithRSAEncryption + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.840.113549.1.1.1"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.840.113549.1.1.2"; + Свойства.ИменаАлгоритмаПодписи = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("RSA_SIGN"); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.840.113549.2.2"; + Свойства.ИменаАлгоритмаХеширования = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("MD2"); + Свойства.ИмяАлгоритмаПодписиXML = ""; + Свойства.ИмяАлгоритмаХешированияXML = ""; + Наборы.Добавить(Свойства); + + // md4withRSAEncryption + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.840.113549.1.1.1"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.840.113549.1.1.3"; + Свойства.ИменаАлгоритмаПодписи = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("RSA_SIGN"); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.840.113549.2.4"; + Свойства.ИменаАлгоритмаХеширования = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("MD4"); + Свойства.ИмяАлгоритмаПодписиXML = ""; + Свойства.ИмяАлгоритмаХешированияXML = ""; + Наборы.Добавить(Свойства); + + // md5WithRSAEncryption + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.840.113549.1.1.1"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.840.113549.1.1.4"; + Свойства.ИменаАлгоритмаПодписи = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("RSA_SIGN"); + Свойства.ИдентификаторАлгоритмаХеширования = "1.2.840.113549.2.5"; + Свойства.ИменаАлгоритмаХеширования = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("MD5"); + Свойства.ИмяАлгоритмаПодписиXML = ""; + Свойства.ИмяАлгоритмаХешированияXML = ""; + Наборы.Добавить(Свойства); + + // sha1WithRSAEncryption + Свойства = НовыйНаборАлгоритмовДляСозданияПодписи(); + Свойства.ИдентификаторАлгоритмаОткрытогоКлюча = "1.2.840.113549.1.1.1"; + Свойства.ИдентификаторАлгоритмаПодписи = "1.2.840.113549.1.1.5"; + Свойства.ИменаАлгоритмаПодписи = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("RSA_SIGN"); + Свойства.ИдентификаторАлгоритмаХеширования = "1.3.14.3.2.26"; + Свойства.ИменаАлгоритмаХеширования = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("SHA-1"); + Свойства.ИмяАлгоритмаПодписиXML = ""; + Свойства.ИмяАлгоритмаХешированияXML = ""; + Наборы.Добавить(Свойства); + + Возврат Наборы; + +КонецФункции + +// Возвращаемое значение: +// Структура: +// * ИдентификаторАлгоритмаОткрытогоКлюча - Строка +// * ИдентификаторАлгоритмаПодписи - Строка +// * ИменаАлгоритмаПодписи - Массив из Строка +// * ИдентификаторАлгоритмаХеширования - Строка +// * ИменаАлгоритмаХеширования - Массив из Строка +// * ИмяАлгоритмаПодписиXML - Строка +// * ИмяАлгоритмаХешированияXML - Строка +// +Функция НовыйНаборАлгоритмовДляСозданияПодписи() + + Свойства = Новый Структура; + Свойства.Вставить("ИдентификаторАлгоритмаОткрытогоКлюча", ""); + Свойства.Вставить("ИдентификаторАлгоритмаПодписи", ""); + Свойства.Вставить("ИменаАлгоритмаПодписи", Новый Массив); + Свойства.Вставить("ИдентификаторАлгоритмаХеширования", ""); + Свойства.Вставить("ИменаАлгоритмаХеширования", Новый Массив); + Свойства.Вставить("ИмяАлгоритмаПодписиXML", ""); + Свойства.Вставить("ИмяАлгоритмаХешированияXML", ""); + + Возврат Свойства; + +КонецФункции + Функция ИменаАлгоритмовПодписиГОСТ_34_10_94() Имена = Новый Массив; Имена.Добавить("ГОСТ 34.10-94"); // Представление. Имена.Добавить("GOST R 34.10-94"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции @@ -2222,7 +2475,7 @@ Имена.Добавить("GOST R 34.10-2001"); Имена.Добавить("ECR3410-CP"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции @@ -2235,7 +2488,7 @@ Имена.Добавить("GOST R 34.10-12 256"); Имена.Добавить("GOST3410-12-256"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции @@ -2246,24 +2499,7 @@ Имена.Добавить("GR 34.10-2012 512"); Имена.Добавить("GOST 34.10-2012 512"); - Возврат СтрСоединить(Имена, ", "); - -КонецФункции - - -Функция ИдентификаторыАлгоритмовХеширования() - - ИдентификаторыАлгоритмов = Новый Соответствие; - - ИдентификаторыАлгоритмов.Вставить("1.2.643.2.2.9", ИменаАлгоритмовХешированияГОСТ_34_11_94()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.2.2", ИменаАлгоритмовХешированияГОСТ_34_11_2012_256()); - ИдентификаторыАлгоритмов.Вставить("1.2.643.7.1.1.2.3", ИменаАлгоритмовХешированияГОСТ_34_11_2012_512()); - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.2.2", "MD2"); - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.2.4", "MD4"); - ИдентификаторыАлгоритмов.Вставить("1.2.840.113549.2.5", "MD5"); - ИдентификаторыАлгоритмов.Вставить("1.3.14.3.2.26", "SHA-1"); - - Возврат ИдентификаторыАлгоритмов; + Возврат Имена; КонецФункции @@ -2274,7 +2510,7 @@ Имена.Добавить("GOST R 34.11-94"); Имена.Добавить("RUS-HASH-CP"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции @@ -2287,7 +2523,7 @@ Имена.Добавить("GOST R 34.11-12 256"); Имена.Добавить("GOST3411-12-256"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции @@ -2298,7 +2534,7 @@ Имена.Добавить("GR 34.11-2012 512"); Имена.Добавить("GOST 34.11-2012 512"); - Возврат СтрСоединить(Имена, ", "); + Возврат Имена; КонецФункции diff --git a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl index d31d144b6..2a79b4fa6 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьСлужебныйПовтИсп/Module.bsl @@ -18,7 +18,7 @@ // * СоздаватьЭлектронныеПодписиНаСервере - Булево // * ЗаявлениеНаВыпускСертификатаДоступно - Булево // * ОписанияПрограмм - ФиксированныйМассив из см. ОписаниеПрограммы -// * ОписанияПрограммПоСсылке - ФиксированноеСоответствие: +// * ОписанияПрограммПоСсылке - ФиксированноеСоответствие из КлючИЗначение: // ** Ключ - СправочникСсылка.ПрограммыЭлектроннойПодписиИШифрования // ** Значение - см. ОписаниеПрограммы // @@ -51,8 +51,8 @@ ОбщиеНастройки.Вставить("ЗаявлениеНаВыпускСертификатаДоступно", Метаданные.Обработки.Найти("ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата") <> Неопределено); Если ОбщиеНастройки.ЗаявлениеНаВыпускСертификатаДоступно Тогда - Заявление = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); - ОбщиеНастройки.ЗаявлениеНаВыпускСертификатаДоступно = Заявление.ЗаявлениеНаВыпускСертификатаДоступно(); + МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата = ОбщегоНазначения.ОбщийМодуль("Обработки.ЗаявлениеНаВыпускНовогоКвалифицированногоСертификата"); + ОбщиеНастройки.ЗаявлениеНаВыпускСертификатаДоступно = МодульЗаявлениеНаВыпускНовогоКвалифицированногоСертификата.ЗаявлениеНаВыпускСертификатаДоступно(); КонецЕсли; Запрос = Новый Запрос; @@ -115,6 +115,9 @@ ОбщиеНастройки.Вставить("ВерсияНастроек", Строка(Новый УникальныйИдентификатор)); + ОбщиеНастройки.Вставить("ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами", + ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами()); + Возврат Новый ФиксированнаяСтруктура(ОбщиеНастройки); КонецФункции @@ -283,4 +286,17 @@ КонецФункции +Функция ДоступнаПроверкаСертификатаВОблачномСервисеСПараметрами() + + Если Не ЭлектроннаяПодписьСлужебный.ИспользоватьЭлектроннуюПодписьВМоделиСервиса() Тогда + Возврат Ложь; + КонецЕсли; + + МодульТехнологияСервиса = ОбщегоНазначения.ОбщийМодуль("ТехнологияСервиса"); + Версия = МодульТехнологияСервиса.ВерсияБиблиотеки(); + + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(Версия, "2.0.3.0") > 0; + +КонецФункции + #КонецОбласти diff --git a/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl b/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl new file mode 100644 index 000000000..526f24980 --- /dev/null +++ b/SSL/src/CommonModules/ЯндексПереводчик/Module.bsl @@ -0,0 +1,282 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2020, ООО 1С-Софт +// Все права защищены. Эта программа и сопроводительные материалы предоставляются +// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0) +// Текст лицензии доступен по ссылке: +// https://creativecommons.org/licenses/by/4.0/legalcode +/////////////////////////////////////////////////////////////////////////////////////////////////////// + +#Область СлужебныеПроцедурыИФункции + +Функция ПеревестиТекст(Текст, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + Если Не ЗначениеЗаполнено(Текст) Тогда + Возврат Текст; + КонецЕсли; + + Возврат ПеревестиТексты(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Текст), ЯзыкПеревода, ИсходныйЯзык)[Текст]; + +КонецФункции + +Функция ПеревестиТексты(Тексты, ЯзыкПеревода = Неопределено, ИсходныйЯзык = Неопределено) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ПеревестиТексты", "Тексты", Тексты, Тип("Массив")); + + Если Не ЗначениеЗаполнено(ЯзыкПеревода) Тогда + ЯзыкПеревода = ОбщегоНазначения.КодОсновногоЯзыка(); + КонецЕсли; + + УстановитьПривилегированныйРежим(Истина); + НастройкиАвторизации = НастройкиАвторизации(); + УстановитьПривилегированныйРежим(Ложь); + + ИмяХоста = "translate.api.cloud.yandex.net"; + + HTTPЗапрос = Новый HTTPЗапрос("/translate/v2/translate"); + HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); + HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer" + " " + IAMТокен()); + + ПараметрыЗапроса = Новый Структура; + ПараметрыЗапроса.Вставить("folder_id", НастройкиАвторизации.ИдентификаторКаталога); + ПараметрыЗапроса.Вставить("texts", Тексты); + ПараметрыЗапроса.Вставить("targetLanguageCode", ЯзыкПеревода); + + Если ЗначениеЗаполнено(ИсходныйЯзык) Тогда + ПараметрыЗапроса.Вставить("sourceLanguageCode", ИсходныйЯзык); + КонецЕсли; + + HTTPЗапрос.УстановитьТелоИзСтроки(ЗначениеВJSON(ПараметрыЗапроса)); + РезультатЗапроса = ВыполнитьЗапрос(HTTPЗапрос, ИмяХоста); + + Если Не РезультатЗапроса.ЗапросВыполнен Тогда + ВызватьИсключение ТекстОшибки(НСтр("ru = 'Не удалось выполнить перевод текста.'")); + КонецЕсли; + + ОтветСервера = JSONВЗначение(РезультатЗапроса.ОтветСервера); + + Результат = Новый Соответствие; + Для Индекс = 0 По Тексты.ВГраница() Цикл + Перевод = ОтветСервера["translations"][Индекс]; + Результат.Вставить(Тексты[Индекс], Перевод["text"]); + Если Не ЗначениеЗаполнено(ИсходныйЯзык) Тогда + ИсходныйЯзык = Перевод["detectedLanguageCode"]; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция МаксимальныйРазмерПорции() Экспорт + + Возврат 10000; + +КонецФункции + +Функция IAMТокен() + + ПараметрыТокена = Новый Структура("IAMТокен,СрокДействия"); + + УстановитьПривилегированныйРежим(Истина); + ЗаполнитьЗначенияСвойств(ПараметрыТокена, НастройкиАвторизации()); + УстановитьПривилегированныйРежим(Ложь); + + Если Не ЗначениеЗаполнено(ПараметрыТокена.IAMТокен) + Или Не ЗначениеЗаполнено(ПараметрыТокена.СрокДействия) Или ПараметрыТокена.СрокДействия <= УниверсальноеВремя(ТекущаяДата()) Тогда // АПК:143 + ПараметрыТокена = НовыйIAMТокен(); + УстановитьПривилегированныйРежим(Истина); + Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.СервисПереводаТекста"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ПараметрыТокена.IAMТокен, "IAMТокен"); + ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, ПараметрыТокена.СрокДействия, "СрокДействия"); + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Возврат ПараметрыТокена.IAMТокен; + +КонецФункции + +Функция НовыйIAMТокен() + + ИмяХоста = "iam.api.cloud.yandex.net"; + + HTTPЗапрос = Новый HTTPЗапрос("/iam/v1/tokens"); + HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); + + ПараметрыЗапроса = Новый Структура; + + УстановитьПривилегированныйРежим(Истина); + ПараметрыЗапроса.Вставить("yandexPassportOauthToken", НастройкиАвторизации().OAuthТокен); + УстановитьПривилегированныйРежим(Ложь); + + HTTPЗапрос.УстановитьТелоИзСтроки(ЗначениеВJSON(ПараметрыЗапроса)); + + РезультатЗапроса = ВыполнитьЗапрос(HTTPЗапрос, ИмяХоста); + + Если Не РезультатЗапроса.ЗапросВыполнен Тогда + ВызватьИсключение ТекстОшибки(НСтр("ru = 'Не удалось авторизоваться в сервисе Яндекс.Переводчик.'")); + КонецЕсли; + + НастройкаАвторизации = JSONВЗначение(РезультатЗапроса.ОтветСервера, "expiresAt"); + IAMТокен = НастройкаАвторизации["iamToken"]; + СрокДействия = НастройкаАвторизации["expiresAt"]; + + Результат = Новый Структура; + Результат.Вставить("IAMТокен", IAMТокен); + Результат.Вставить("СрокДействия", СрокДействия); + + Возврат Результат; + +КонецФункции + +Функция ДоступныеЯзыки() Экспорт + + ИмяХоста = "translate.api.cloud.yandex.net"; + + HTTPЗапрос = Новый HTTPЗапрос("/translate/v2/languages"); + HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json"); + HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer" + " " + IAMТокен()); + + + ПараметрыЗапроса = Новый Структура; + + УстановитьПривилегированныйРежим(Истина); + ПараметрыЗапроса.Вставить("folder_id", НастройкиАвторизации().ИдентификаторКаталога); + УстановитьПривилегированныйРежим(Ложь); + + HTTPЗапрос.УстановитьТелоИзСтроки(ЗначениеВJSON(ПараметрыЗапроса)); + + РезультатЗапроса = ВыполнитьЗапрос(HTTPЗапрос, ИмяХоста); + + Если Не РезультатЗапроса.ЗапросВыполнен Тогда + ВызватьИсключение ТекстОшибки(НСтр("ru = 'Не удалось получить список доступных языков.'")); + КонецЕсли; + + Результат = Новый Массив; + ДоступныеЯзыки = JSONВЗначение(РезультатЗапроса.ОтветСервера); + Для Каждого Язык Из ДоступныеЯзыки["languages"] Цикл + КодЯзыка = Язык["code"]; + Если ЗначениеЗаполнено(КодЯзыка) Тогда + Результат.Добавить(КодЯзыка); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция ВыполнитьЗапрос(Знач HTTPЗапрос, Знач ИмяХоста) + + Прокси = ПолучениеФайловИзИнтернета.ПолучитьПрокси("https"); + ЗащищенноеСоединение = ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение(); + + Попытка + Соединение = Новый HTTPСоединение(ИмяХоста, , , , Прокси, 60, ЗащищенноеСоединение); + HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос); + Исключение + ЗаписатьОшибкуВЖурналРегистрации(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось установить соединение с сервером %1 по причине: + |%2'"), ИмяХоста, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); + ВызватьИсключение; + КонецПопытки; + + Результат = Новый Структура; + Результат.Вставить("ЗапросВыполнен", Ложь); + Результат.Вставить("ОтветСервера", ""); + + Если HTTPОтвет.КодСостояния <> 200 Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Запрос ""%1"" не выполнен. Код состояния: %2.'"), HTTPЗапрос.АдресРесурса, HTTPОтвет.КодСостояния) + Символы.ПС + + HTTPОтвет.ПолучитьТелоКакСтроку(); + ЗаписатьОшибкуВЖурналРегистрации(ТекстОшибки); + КонецЕсли; + + Если HTTPОтвет.КодСостояния = 401 + Или HTTPОтвет.КодСостояния = 403 Тогда + ИнформацияОбОшибке = JSONВЗначение(HTTPОтвет.ПолучитьТелоКакСтроку()); + ВызватьИсключение ИнформацияОбОшибке["message"]; + КонецЕсли; + + Результат.ЗапросВыполнен = HTTPОтвет.КодСостояния = 200; + Результат.ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(); + + Возврат Результат; + +КонецФункции + +Функция НастройкиАвторизации() Экспорт + + ИменаПараметров = "OAuthТокен,ИдентификаторКаталога,IAMТокен,СрокДействия"; + Результат = Новый Структура(ИменаПараметров); + + Владелец = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Константа.СервисПереводаТекста"); + Настройки = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(Владелец, ИменаПараметров); + Если ЗначениеЗаполнено(Настройки) Тогда + ЗаполнитьЗначенияСвойств(Результат, Настройки); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Параметры: +// Настройки - см. ПереводТекстаНаДругиеЯзыки.НастройкиСервисаПереводаТекста +// +Процедура ПриОпределенииНастроек(Настройки) Экспорт + + Настройки.ИнструкцияПоПодключению = СтроковыеФункции.ФорматированнаяСтрока(НСтр( + "ru = 'Как настроить: + |1. Подключите сервис Yandex.Cloud и активируйте платежный аккаунт. + |2. Перейдите на страницу Яндекс OAuth и скопируйте строку из букв и цифр в поле OAuth-токен. + |3. Перейдите в консоль управления Yandex Cloud, в списке Ваши ресурсы справа от каталога default скопируйте строку из букв и цифр и вставьте в поле Идентификатор каталога.'")); + + Параметр = Настройки.ПараметрыАвторизации.Добавить(); + Параметр.Имя = "OAuthТокен"; + Параметр.Представление = НСтр("ru = 'OAuth-токен'"); + Параметр.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСверху; + + Параметр = Настройки.ПараметрыАвторизации.Добавить(); + Параметр.Имя = "ИдентификаторКаталога"; + Параметр.Представление = НСтр("ru = 'Идентификатор каталога'"); + Параметр.ОтображениеПодсказки = ОтображениеПодсказки.ОтображатьСверху; + +КонецПроцедуры + +Функция НастройкаВыполнена() Экспорт + + УстановитьПривилегированныйРежим(Истина); + НастройкиАвторизации = НастройкиАвторизации(); + Возврат ЗначениеЗаполнено(НастройкиАвторизации.OAuthТокен) И ЗначениеЗаполнено(НастройкиАвторизации.ИдентификаторКаталога); + +КонецФункции + +Функция ЗначениеВJSON(Значение) + ЗаписьJSON = Новый ЗаписьJSON; + ЗаписьJSON.УстановитьСтроку(); + ЗаписатьJSON(ЗаписьJSON, Значение); + Возврат ЗаписьJSON.Закрыть(); +КонецФункции + +Функция JSONВЗначение(Строка, ИменаСвойствСоЗначениямиДата = Неопределено) + ЧтениеJSON = Новый ЧтениеJSON; + ЧтениеJSON.УстановитьСтроку(Строка); + Возврат ПрочитатьJSON(ЧтениеJSON, Истина, ИменаСвойствСоЗначениямиДата); +КонецФункции + +Процедура ЗаписатьОшибкуВЖурналРегистрации(Комментарий) + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Перевод текста'", ОбщегоНазначения.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , Перечисления.СервисыПереводаТекста.ЯндексПереводчик, Комментарий); + +КонецПроцедуры + +Функция ТекстОшибки(ТекстОшибки) + + Если Пользователи.ЭтоПолноправныйПользователь() Тогда + Возврат ТекстОшибки + Символы.ПС + НСтр("ru = 'Подробности см. в журнале регистрации.'"); + КонецЕсли; + + Возврат ТекстОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'"); + +КонецФункции + +#КонецОбласти diff --git a/SSL/src/CommonModules/ЯндексПереводчик/ЯндексПереводчик.mdo b/SSL/src/CommonModules/ЯндексПереводчик/ЯндексПереводчик.mdo new file mode 100644 index 000000000..0b9d96204 --- /dev/null +++ b/SSL/src/CommonModules/ЯндексПереводчик/ЯндексПереводчик.mdo @@ -0,0 +1,11 @@ + + + ЯндексПереводчик + + ru + Яндекс переводчик + + true + true + true + diff --git a/SSL/src/CommonPictures/ВидыСравнения/Picture.zip b/SSL/src/CommonPictures/ВидыСравнения/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..d3430f953252a92303b0af63857e7d4ca010d6ab GIT binary patch literal 7243 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 O4&V& + + ВидыСравнения + + ru + Виды сравнения + + diff --git a/SSL/src/CommonPictures/ВставитьГруппировкуВыше/Picture.zip b/SSL/src/CommonPictures/ВставитьГруппировкуВыше/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..8a13f5dac8575320eab8ed73b0870eb1ad1305bc GIT binary patch literal 6701 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 + + ВставитьГруппировкуВыше + + ru + Вставить группировку выше + + diff --git a/SSL/src/CommonPictures/ВставитьГруппировкуНиже/Picture.zip b/SSL/src/CommonPictures/ВставитьГруппировкуНиже/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..07b659604a6ffc2dc77c68c645f80dced12ab0a5 GIT binary patch literal 6783 zcmaJ`1z3~q_kOpLqeh1`1DO&7QE5g=!=zI}LehbNsB}uGlyr!c2q@AiNJ}FP5-RI`J7$#~X~vSXz)H zqW+Fgt&L7+59%&8wK38cN&BakQ)9?nuDevd-B7dc^~jvG*;o8zvOJ94K-*y3qU%8N z-t((+6in%SRo6K%rpx;kODdh*E25frSw5VNZnCAXc(MBpd6jBI2irvSNXIbJ$Rjic zOI8A9YE~YORCrL^>`k|M8N1t5`Tn-H1L^H0i!~S5)V9smYWoYRI>d!|(ilIC(m9MX_i#8n?XyA37r;KWSBbpaMwOKQ?Vp_I`ClJdh?xrW1*}q#-vFwx+&iVNcKf|hs{q6N5U{Wr3ff z%Wh1>H=5ygvlm}Kqiwl;on!h=M3Q^yHz~5iJD_;?rZh<#q9zokPQDqJj=U0A~!+OdHf>Y*~2p60gX70c#I$r!vXOqD)iey z=ZJWSG_X9RL3nz_MZn;H5f2JKBwmA_lx7Q>##gf$Zn9D$(*0Ou|ARc?YrtWg@rkz?y372 zq89}KbBBG!)ccIf7@P{eP_lZZP;npk#Y+Rr?&4XG3-t?~Bw4k##AkOG%B`k$q!z6k z6$v`2d*o>p=W9PuUtT*E#~8Cua}8!LkSMR-q00=tRKhI(uAQ`|9uvIzXs|dpC`#E~ zNChUS!n*avxcEZL8+4CyQQNmV!RY{)m=BEI&cRtMDjc^t7ivP%ujG2|{HU|sa~XDN zgPNey1!JbV>rofD?ygO~&_*IZhEbBVcE>J#m>zi-c~eX5QHXb9dz$S@|IEAB{n<@2 zkh5xpRdR#7V*FGB6|S`An}lu4ce2ujT9$f> z;92&K%XfPg00SMhNpGW&wt*~dcB%YivUlLnTQ*Lqu{nf+H@z>dJ4BVzD?D0N9zp4) zF9)(K&j-E0bS3h4Prgvzk;p?u25ya9WsdI|T8URPYn(L@Jh@O>GOJAL*qoW$yB3;TsclR=NaHC-e~RIOIgq9qCF^jSN7>*MgiBk8DTjO_MJt*KC4Wv6k#ow= zdq2ZbDctcix&5-1`1JJGTkA7*cGPAN1saYPwDzW#q{iikAaS`Q%#4l2^;B0xc!CjZ zFMuChuK7}L#%euhEIrEWcJku*n*y1?z5D5ZJ%kixv{Ykp834CR<+l5 z$hrevzhst0I3!YFD$uBS(_vimj7Iitq6l{Q_{#8bd~50IAg4rwIw?Q050%GN%gk%q zcurN5-}D)6^H2?Tc^__bo7mS)QHW2Y7$q`6_eE%Ku!^U33>7N1T#%{+ZpQiAn=K`+AUYvuI9-mKr^G*W6DgbL?3IdnNVt>MyO`FjxHiGQZQpLXe#TuPVm#_^fZ)^sle&?Rl||+)8X$sGI&C z(QlefkAm|GRTH$|wo{Gx&8oX$I4hn35;vEFy5dOfdpr(BO)7C+at`eQi<$h^`fL`ArU#^Ya>W zNU}(NXw+lIgm&iKiqUpQA{1?GZ5N}?&%~{C7tFl(Ec~8UD`RUK6{>V%()6Ne8Fn03 zCCp3JhvMmTgl!oCehIHR-?9ZTkOkNn_14tX;E~R_(&|9C-b9>~-*eqX=NcF5{~(zi zkaK4~Szih&;$PHP5#}WNvoYX~nuGAs9uWtcL>GxI*KqcuSd4YIi#(B&3GqDDOow^#{ZC* z=w4TFA>c?Yf{Ci2Z6fOopdlO3ZxZQ}<$YdkulWJ8z=w!etgtOYGOO^9aK z(iy}F@vvrbR;0t#y@?;Dd*U=ggR&z@Zi_Ljjh()UiNB*5 zp*JXk@ePY+i}DVu+B4@VX+!fMOWOWG))S_)rM{1bmjX7b)vMv-ce5Z?MMIQ|^YnYS zSSZVfwPbt(&4m0dn4213<)*dpiW;$hq)bR%TPkNc=B_}}LJ-W&dYb38)43Mj2&f3F;42Sxgpg*jd#W-%oKv?Cnr|o~`G$X1hJXxBlK-^} z58;~1xp)+FgT zM8?;B*hap^3`3ba2DSC4Dt*#ETs6B5th|~fEc^1ckU%mW;v&$Sz5^UA)wtdd8(JHrsHeRC5_ zvlGWWikrN^M%I6=_x@OQv=~jRCh8hZ8md=gM&fZZ(jlYHPPd6KDghVwd~L)E2rc*!qMp6x zKm1xKDe%e0fh7MI zLHU6N6oUr<65#r|(GocllmuSu*JCzX81O5Y13^8ucbx&9BSG=00RW#GBv&e-01W<@ zpkM<>f=X@Fn!?a@%ua;I2grqzCu1+Pmk4u1v!YZ?Je-XXf!t2ht1i>a*vC#;+WD#r z9dsOs&lH^l0mL_!n?`j)unNA_vud(#8dO#t^qJ3OV!548Z#Fz#-=F!~j%aIbRbae8 z#Y-1Cp_#AKk}2k7uYIpYf%BQ!(=m-%{A!Z#X~U$i$-{^unLex6P0w(A3ZlS#u%L~ZrG?nsEHy6on+GY>Vxk%TQmRe2hYH4bk3QjF7*tqI=qC<<`=^EDpoO>=+ zb<5{)GGbCvQawvsWM*Ui>70Ad@zUl3@3RLrDn-fm$St|9KrOmhV>oYfFH7>60rwe1 zsJXbC*sUPEZ}%?2CAKP8Th;tIHRti8FTrmWOuye7B#HX++>0378jhbdE$O92C41s= zxkQeTEn}I9jKhkmMi=Hy-GVaZhp3nz%Yu*#YsDiO5^7hOtzX&=1dZt?;aicWWY zH*f(hup=UOIFW#`s4}0TiS@Gm@gl#NUiw#wwzoXXN~GodsgE=Cyr@+1O#?c zo8Q298RPLw>D1DsrY8O5XEu zMDpHS#iA;CZEDwROjc1=ML`)5ijvOBp;*7l&-oST*G2|Wdcfek-Ze^YLYtj(*y=Px~auF!5!XtFG`>R zD*qHquJclYrV5%=)D5pUKDQD+x5zl)?eK!6Jp~eV(;QV`u;(I1lZz`5nY>wDQiy=9oeMzFNsbwj;fLXIHh_THFfgy^P(9FoyG;9i_HL}u0h z*67&S%EyndO4w4{NjsyV4}`deMA&o-Ug2Xd>&kJ{8D3?F(mP+x!YW&yqf1}PzfU06 zHSlF~bJOr_fK zP6TFnDq!sU<$+btI*)X30{r!EdJ*d4?zlxNC&Nj&lKk6THTl6*US!9OO%5luuuMsQYw1lh(g-+|U;suWabr+D{VF z7r~l}=%e4-jd|EP3|Z^xo#Z87#&T_>S+$@Ec(sJ)HfDQqP%=4}awNG8iP=iaR{iOj za>n5E)!ID#h)%ImCywjdypq+v4TW*`B-UTtm!Cv`(|nd^FYWNTKX#{=ge=oXT4OPu zfjq40inN|51JQ2udm8Ix*QDgujv`w`}2_Y)6!NFO9z9V$7F{{g7CcUng4Ws6#opHDn!A9Pvs1`m19>2t z27k_odN!-3ZXXpB&}EgzGThKib`C}ViVoJlILGxFUW%Ykaj~m5*VO#5`|V|9*2T4u z$<74PR#`mK0;kg|XTzpG)%W@{o_<92n0p@mFyL*q(GtDUU@)E&+F9q*Z4HmVz1 zK9zO1{5bE2Rf9m;fPb5!BY*yO@WFoY`oEbv{3rkcz!^EbP4$xbD8!D{pU(U@`#12P z1L5C+?}FkHIvful2YklT=K%PZ{Tuktf#2`Igkb9zIvoEU2fVf!Z~*+v{tf)+sOERz zJW%UGhl88rfR$?xZ^bYBH}IdQ(BFZP;6D^cXVT+ + + ВставитьГруппировкуНиже + + ru + Вставить группировку ниже + + diff --git a/SSL/src/CommonPictures/ВставитьКолонкуСлева/Picture.zip b/SSL/src/CommonPictures/ВставитьКолонкуСлева/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..8d54aa3fb56cffbc890b9b8f194a42a93c2ef866 GIT binary patch literal 6637 zcmaJ_1z3~q_kK4zrKK6AptPhSqZ=GuN(l~>9xW{*C81J+bi)S%(nyz}sC0*PmvsGK zQGb{E_xrZ%yl2mOpWWBCbKhs@IS3^*bTR+{umPy|4uX3B79|P-0Cu2Zfl*!_9xgi@ zNL-9Kp;A>^Av0Q2tJfMlC|_Je`_{#_2;A1Rh5)xGwCKCdT?azkDO~IhBc#^~ zjjj|aMT;79=f@|{sC}tF3oKemImDWSbM_J3(3r@g<>DZ6+H%`3y*yz(Ad^Eem-KMw zIzxpH4@cnHAv{|tp3zJ4_`Y@*^@Ab2@yycFFQFIo;c@Q|5grdwYX@@yD>B||w7iv? z9@F+m93!jYa{{sZxh@v%hlZRd55yYgJSs!vYtX0v(aH-mPY8NTzi8z>0NZ^3(yQ~T z{eUN7IhOS0JAxtt16)iKdUF=*gh~M_*N00rQF-I6SB30yXX>p)mJPLW z+?2>DF>^a(dMXD!F(|NfVm}c(o<)VZ%9v`7(he=g-4MuHtLb>~aYL@|FzNINU%?pQ zb*(zA%tt9&Kmo*Wd5K?9XJmx}01UMAyzmKp%L@bsoj3_XsLB!GQsaW@B2bW*RtG&f zXk^%!;MG*g`5NeO?Bw-O;QfJb29acocLjqGl)9WGP|!uY2rkf(5-Jh^P!x`LY=Qya zD^-w|&~%0LX%(qLC5T>$a4d{=KkHUiydEwt!48KZk)c5wSQ}W{tt4VT;+73l2Us4B zaR^<+?R>7t>YWd>uul8rOV1XRqT`0#_MC0+wewOTRwKI^4ykP7wx&?ceUn9tJ@j_Y zQg^}?hy8do*q`I-N^PWwq;VUY3(Zi_qN4Z@XtExxdC2kTIC3hFk_i!;jXg3>@ zw~#$z5_1ZzFf7!GJ?I?`offvc<6^becfa(;2G_2|&ZXx;m&1DBq?Br_k*VDeajmc# z*?rf#_~JAz71zXz-4}eNpx4S40O7!e$YV0x$9(s55IT=7U%N!ARY%Wcn7EqzO{i$h8>GS% zvNCvO0%Kr_SFdP5nEg7)lrC)Q)XZ37-;}VxJQ94Rdh~{d&avi-HgwZm!p`{Fsa_fz z@{`NtAUYQ`YDD{@#wfv$C*w^(AE=9Le<4`=BAek~<77D5WTLKrOH#>|o-vz?QtR@Pi$fi~J>-)65Ct@J3vq)3=~KfOwx#;w21ZY}FpnYqOjjYO z%7nC{5DSusI{#TjMiHTl@@b0WHe1xqrQxaCdr*mgvJM}12qkCCE$Pt{`H z413n~IIVdPR8U)Q#o}@6xCN!>ur=Ut;0VrPj9hBDT?plS7x>ZBRD(E zN`}}ahRi>=4HzP3j2OKWH(nXK#8Km8cE#Y_5+>}s$K>}2$#_Y=UR|)@y-g@4@}s~( zQozNw1bxC|Re!cQs#7xs5CH{qe(0@|S&OquN{-mGK_d<3E#rPZj=s+Oa zbNapd_$C)z{GcDH2>_6qKyh*ldOp4U5=m?1_3>%N>+cdag~ zT$MRU-yVCoKJK}5I?OZi3jiT!xp*?uLAL?*b+ zHbq*h*7h{@Dy*b)(hKhLEKtIgX+q$Jql|^U?7>_Pr-d7Z0-GkDzjYPnn`Wv#zQTYynScnAzjKvWUT66LM|SxHZAQ4Qa^n(>ri=7 zu&UrHU0Y;zLSEl}Lw0inv}&xNL_(h{=7D5j8f6k;0#{RqV#XHrom`!#J6I({E0GL7 zYotuwyw`Pl_(`kR)8Z&;KEeG@`Aj*JBCZ|fmG9&2Hob1)3-^3gu9 zIqp-b%i)?LCeIlRp`bCg31Y6lOwzOX2H0U75B=bL%O%i+aUsi1ZL1vh2(w*E5lE$M z_1v}+%=_etx2zHMUS*o_nSOMs33jJYkk+n)WvFZ#6G?EVKVO_OeR14O=!&P0d#PI} z$87T#2hv&_zBoIbKo*RBO?Ey;v@SPA$R!CE>Op_FD1nNWL<4u+riYmAcFN@94Gs-H zuhgg-XXWKbk{FJx`ISx#M-#oXRn1*G0$7dqFRx>;B;}1Fo)dQFe|4(7-8H2@E^}yP zkELKeGS1Vx>~xrw&K8Bn($#7ndbG~=*t=FcFHQ}UP*Sn-qmIE~t5ZjLCw+lHEyF-e zegQniX|>gNevP>YOBkP4jMkOZ!bAA>SNEHSZD%Eexf+*YG%4dU1aha!QWLm=GKExX ze5p6_PK%Er?KfGkx)16OfxP_}jpU}JS?PfKQ2(J3zVA&KL>>Ci-!uXPfnetvLAkqs z1s6XwLct0E6s!;hb(Re<_+J`<%>O9SIv-RU#firChW+n)K03q{l_ZGxI=pZv?2>y# zyin(dc-mgq7uBs-afsaf#UvS0WZ#Y1>*i&0EGEF=IIXwhK1&X9Ri z?CC?8%1^Pm;hXN#K(9!z^d{7+$oB%2=w@?GFxX&5Wsy&~%>@Z`N&Kkr4^PPMdJ_yM zIu>EV(HHiP=otOOoei240ArE(54d&fHsue44|rb^UbDm|Lh4a)QH0QA}CD=9?`+5|odaj@z0N+HnDR8z@cbMr%~A)l6aBuSap zW+mzS@pcKaOH9{Y>eT}d{g=W#cJd!$FZG9AgGqC3w zvxxpipA%k(jnf$0hHo;mYpwREMm&ML>~y7DMEv8iV3-13XYuuTfAc%DuEP>ia~4)K zll8pyo~P__6MOAy>qWu#9525_==K}SNab(^l{OvwVai9q)w^y4^seaDS-zGB`S35? z8~QX$W`G6&+Ms=FG_U>Oo;F&}@n0HE9&iiKIrns+2T#Do5AHDv0|28iL?)Wo7!3Xw z_n^x^xc9Qownv<-ZDL5`ia`V=)l212D>Gvr#ejTBv*KWcxS!S7OB)_md9tF&0`kC8 zDJD@K>DM#dfm@f&-bd{2*R}_B*;pHOA@!n;Bh}B`_twV8w#RnjvAdHG*N{ev_R7&j zl8GF3qU+Bw{0mHWR>LD%=E=>aKlKf5eU*vfn6fY!w}(%zhZghV9qURxM2}sHH+s?? zS*NxXv5REnYU!CR@ABg))&W9Ih${ILKi^6LZ2V!Lr!>ZxB!gAypCWe&ee}Fm-}}F~ zNoT-c+qV0Hl#8nP&_%5JXrEOb;c71!zqs{vD8ivx7`V5yHyV!DICnd#d7OJwMS1{x z1m#I0yIwEQ_`rXsQVi!RbG=oj&fZdWg`?rT!1Rk3Gxc+H7Nz?1gajUh{2lq}FG}8- zIY_*$hugLsv=lrOso4r|owm1tIK_XsXMnwlK2NS9M?MJ89#{rD$BUM&7RSI7=I-SL zmI@EF9o*h!Tifdv@0t11QY;5pt7~+)D+bbTP8SX=TV|+>43F3E$lXRITeql|%cWVO zpx#mwdoJ-3q0dGWnPr?cs^{Ib+U%?L@xL6)^vppCGktr;R5Z&PO@beeT7~bg%p@bgD$7AN2WJP_-;QRR_=!-VV?gRUlIUzr--sRX6JU!-H3lNN!D-IUu8f ziQoqvY8j14H}l90yA0!mpT;TaE}m1JW+vjZzjNAs#q1n%7jL896rG?E)wZGR7wnqf z-tyy}q`1I!<<$P?yP^dBZtXtl4k-Z4kTuuZx56C1gT`}ns>)`C8$Go#`U&ep^1de( z^N%J)J6d^{PK0R)eM;#C1cupq38~om()h|7hRvQS?mu%Hq6s0N?jA&Nt~Kskv~rH+jZr z{(P`<9-cCe5In}}e}JWad#LplsEL2kpN&yYj8Ep23M)cvGFz$j1&3k>+%sNqMUxV;dGJCIIi9D^zIn%? z&LgIKTh3vmS!`r|d4BugxC6#C*YlBpaS+uGv^L|-@4UrK$9_Z^drRysX+48PFpu5D z4THVq2tL{`2#)-zkA&%R$WO9M&09d@?Gt^H+a7Jyipdo5J44pU>U&a{%@jWJ68_3h zFMm<-h4iXn=F56ZI?!Iy#p^%8DI&y?m>$UCYLA7oB_BN~N3HgwC8*{@ zd4-ME%GPTA*psD!)FV_mot!^M|6$PTBhyq-X0y`%TTGib>!tRQ{_pz_71;Iwrsl2K z0|%inO?23$Ks(FO%e}XJA$JprGmF8k0uby2Dii$&C%q}0{H&iW_+Kiu9-zcC)OkZ% zOtr9iLl}@SriAS@!@`04Dk@oiR&2JI;=83iiL7FD2qoX5&1i@{K{KpFPBIJqauH40Hv2BA- z!bCHoqoe(M89sX5v$v0w9&5g?s2<(cb4>sERm1HvUMJ5jNFChajtkB6U>9HJh|Lo( zZwSGIwzoO-w6y#=gt=F<^W^~kT7j+&lWct4Pv|X^+5fZ%cu?j(s$t8f-K*TdZbab+ zH$TakBKLPps4gSSsJ({_cJu-PX(PiUBiqfm5mW6}g#&qq{_QNX*lJfOLZ0ZJ zUF$3sg;25`wj(*N71PN!<(!%4PjmKRKq3IgR_^eM#i})_QKg66JfQ?j=+qa2ldl~U zGv-Xk)*3TFxm#;1)X%tON&EKSN!Lk>-!gRCh#H$X2xPdrb zn0~fFTkN={O!RC*_qBEP4I!aD8e6eTnKVRnxY37?TD=2FNBviC44%qa9c6aJwlHSj zf`8h-L3VHnd5R`dUu^p|oxTAq3I9@l_Csug--5Hh3edidkA%OU&MF{sr+=wFgy0Us z^XkJO&-oc#{HQ)Srr=9ci0R13P%!vk)d!;T{og-Ity;ASf&aEv;RQYwpEI+O_%@cb znTaIs4M|f;e0dK@9fG1cU~n*ZEfU+iK9+Mans(`+_A z*3B@x&n~}j`aopI(eQ2S<4?-D{t_f)s9Z(s z5f^0C92qkbawJE}7%X23nozoDTGnpTJ}psvX2uxAM%l(o6OgiWl<50`D564ay=sjj z(uw=ic9?4pzo5kx-el8(%&dZCitK^*2Sjybuoeir?j4^BtXMlNSYeBP0v&~!@yX?M z)TB^=N$+6@!At6}VPnI(*e~uK-a${z^{9d~3Wy75%B;5~`tvV7(O={~&9krin#lXP zA)P9-e-{za{kJA;Xx|Bb`X8 ztUhLs^zATBpzD3xNFd05v6}+zortJrp91z6S6Hgdg3~*Pl#NEm%GaBfkJ3J2k+wBvwXM?HY*f5$+9~O5Iur6n zC_$hMz`xC`S-yRD@Bur&{%?Yf`y&7WC;~^>4tb&`0OMStEYu{!ifF&l|r2LqK}|IDPyL zco_a2@TdP1`1eNYS76@@|7)xM2K)~G@cfhh^nU{XULt=5{>I7g1@mvX>Q>)#_tXE1 z`~Q{sEAA9H&i_@XzoPq4Z?ZI!^+TG*?a01y`KL!HVSKCK01o(M1xZy*@on{g^oE_w literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ВставитьКолонкуСлева/ВставитьКолонкуСлева.mdo b/SSL/src/CommonPictures/ВставитьКолонкуСлева/ВставитьКолонкуСлева.mdo new file mode 100644 index 000000000..4ebe2c190 --- /dev/null +++ b/SSL/src/CommonPictures/ВставитьКолонкуСлева/ВставитьКолонкуСлева.mdo @@ -0,0 +1,8 @@ + + + ВставитьКолонкуСлева + + ru + Вставить колонку слева + + diff --git a/SSL/src/CommonPictures/ВставитьКолонкуСправа/Picture.zip b/SSL/src/CommonPictures/ВставитьКолонкуСправа/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..65d2a1fc1c2ee85f165dc2c2a59cf319e20d7c50 GIT binary patch literal 6647 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 CEO4#> literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ВставитьКолонкуСправа/ВставитьКолонкуСправа.mdo b/SSL/src/CommonPictures/ВставитьКолонкуСправа/ВставитьКолонкуСправа.mdo new file mode 100644 index 000000000..11db0674b --- /dev/null +++ b/SSL/src/CommonPictures/ВставитьКолонкуСправа/ВставитьКолонкуСправа.mdo @@ -0,0 +1,8 @@ + + + ВставитьКолонкуСправа + + ru + Вставить колонку справа + + diff --git a/SSL/src/CommonPictures/ВысотаСтроки/Picture.zip b/SSL/src/CommonPictures/ВысотаСтроки/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..9935063e99d09c5b2a98c4f1eab6e55cb8998ca9 GIT binary patch literal 5837 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 + + ВысотаСтроки + + ru + Высота строки + + diff --git a/SSL/src/CommonPictures/Группировка/Picture.zip b/SSL/src/CommonPictures/Группировка/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..f8f38eb08b8b9c50f78ba45a3eff3670c46314ab GIT binary patch literal 5059 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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..fd91b8219 --- /dev/null +++ b/SSL/src/CommonPictures/Группировка/Группировка.mdo @@ -0,0 +1,8 @@ + + + Группировка + + ru + Группировка + + diff --git a/SSL/src/CommonPictures/ДобавитьЭлементНастроек/Picture.zip b/SSL/src/CommonPictures/ДобавитьЭлементНастроек/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..fc206114a909a4082eb910829c6a4b49620e10f8 GIT binary patch literal 6289 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 Sus?uTs-g%y@JT`x{ONyF%V?$m literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ДобавитьЭлементНастроек/ДобавитьЭлементНастроек.mdo b/SSL/src/CommonPictures/ДобавитьЭлементНастроек/ДобавитьЭлементНастроек.mdo new file mode 100644 index 000000000..e16093266 --- /dev/null +++ b/SSL/src/CommonPictures/ДобавитьЭлементНастроек/ДобавитьЭлементНастроек.mdo @@ -0,0 +1,8 @@ + + + ДобавитьЭлементНастроек + + ru + Добавить элемент настроек + + diff --git a/SSL/src/CommonPictures/Закрепить/Picture.zip b/SSL/src/CommonPictures/Закрепить/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..df34f4265c3854eaad7e87b0ae2884b590ea34e0 GIT binary patch literal 10349 zcmcgyc|4R||GsC2v1^Q7h_UZNLc-Xx?+MAiMcE0-zLPCv3E8P+%a-i2CL~45z70u| zDAe!P)AM`r&ePjp&+Rj2&Y91gx#ry0b$!qIevg(a42J^12mc;;ZfgO*E;Sec-~mj) z$yZF>)qQlPJ>a7oe0X>f0T7%o5C8x_3;+-{Sk-Q%mc}^}LOMdQO`@zM zuLC|a?mzJ1;Qup%4|BmM0%s*dHvk|v-+w?DZV+{Woe(#jbF#q0=kyq`fn$qSM*~1b z9MP^hE&xEMmF3ZTUXZ7^o8!#2DY^y>ZhcKwvniw@=x3!MjMT=bL=uc^>nQ27OlOa( z6ueHf6G76UEfef09LPiEtrTQ)%#gUD~N| z!nLY4GCac=$Cak`!lEL6)$OD+6G9888K1_-+uOWMclxa{zl2*Hq-SyC<=WPajLI@qTIUq8P>Gr{f_<5GQ9 z!iU5$tsyK`xDyi-iNhGyxGt7&*U7v#i6&M(cQO#IwJR$QJ~wWhr2%%rA&7bVY73d# zarGRnh!{ndNadp83T4u8x%7d>m#dyVAj}q8!E(jCbxrnLWlA{C>=H798tk`nR0?FP z#$s;R2&Hk-lU7lYCnLX6L_b|6bg3J=!dPDLVbh1-oZvoymdcK!olAA`+|t%?KGWGk zC{9mG1-SeB|8Q&QYI|@`>^l8(+}Z6tKdKz0`OLc4owJs0A6uVi{aC0^zbYZ>PaV5d z{(xg{0=B*+=;A14B^KlD<|e$&;pQSnkKd}7sS%!JFG5$bK2e3LD_@6@GPr$2MTj0oq*{v44Zn~$ zJ*ptXImn;Gw4E$d?@ZfL3dLm%W$Zd;i!A~GTm71EWqvbSp4Fvd2u?e>SzXfY)MrmnlW?}YGT}}VvG5rXw0BAf7j015T z;sQeiZ)ea%Kx3Ji(OT?EUBpZ&vbt>%2x^t*10$+jy#h+TWrM1`TwL66t|{aU((JbG z__ArKIWUyls4_LO`idxx1VeVy0teFMrZ-a@|PVe6;p zNu`B#)J_GYS{r6E;hW58ekY0iIx+wJ*7Oi~4-T=r2-&&O2NGbP1lZ}ZPaHCk9tYTs zg(?3Yxpk)6;&7eBev&&&I1c~!Hh|22jD_995MFHTMuL-o{K;

    qU_i6_TEyu0$_{FgrP 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 + + Закрепить + + ru + Закрепить + + diff --git a/SSL/src/CommonPictures/КроссТаблица/Picture.zip b/SSL/src/CommonPictures/КроссТаблица/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..8176f2859500b4e9a5abcf34438192d799661967 GIT binary patch literal 5664 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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..9982daa26 --- /dev/null +++ b/SSL/src/CommonPictures/КроссТаблица/КроссТаблица.mdo @@ -0,0 +1,8 @@ + + + КроссТаблица + + ru + Кросс-таблица + + diff --git a/SSL/src/CommonPictures/Открепить/Picture.zip b/SSL/src/CommonPictures/Открепить/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..ab5bc5b8025dd7f34b06163aa71cad6e3d40ebf1 GIT binary patch literal 12598 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 PZ{P#&B40JIoYnpZ!W0fR literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Открепить/Открепить.mdo b/SSL/src/CommonPictures/Открепить/Открепить.mdo new file mode 100644 index 000000000..c05ed4f34 --- /dev/null +++ b/SSL/src/CommonPictures/Открепить/Открепить.mdo @@ -0,0 +1,8 @@ + + + Открепить + + ru + Открепить + + diff --git a/SSL/src/CommonPictures/ПерейтиВПолноэкранныйРежим/Picture.zip b/SSL/src/CommonPictures/ПерейтиВПолноэкранныйРежим/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..278d7ecee42ca22c4328c836ff150494f61de523 GIT binary patch literal 3300 zcmchZc{J4h9>-^4Y=at%vCNZY+}p@9#u|DeO3V#;xR!2XsBDF?Ot^`L#u_49j`Fyn zYbi_JvNX&j$x`BxEj`&vh)_bA+@Hbi=PBnp_nh0z`Of$J=8xC!d|v1CeSbgJBsh;a z1OnlQoQlr2pe4{euLDnFFbD(*?A|Uuo^B@s0@Z@OPchn=A`t{}-T_Ckm$_9nOZa4Z zvuifClX+iQ3oqG$hPS;QP+SzOC~FTisOR|m`-kWFk}uqF_3b=x`hmQN0_ETdd-I~* zhEv^V5v>l!Y1UZzXaQmI(HA;(O&ucAqm_=czj)vu5mA$&m-CIS=1NEj2PJWelMe>- zi^%)loc0sHv9FZWCB%>{m|)y!yCTc@Ia3d<^HUJDvVAyFL{~*kG{g4`)cQXK?YE|x z|AsA0;)enS0Sf^Xq^GS$^>Lp-P6v#>N*QvcPzL5cPz7Kep>nNk81AnA&j~Oam9fOy zL?lw?bJa4g0=6jF^pkNd5^3j!L<*}Sk#*nUO< zJ9T7o>OQNi$iA2V(Xh&NjEWm&01b0_ND7+x0^#i?8J<1byMr3Ca=-Y9==SKK~);$jcYF=o-aNazJ z4(wU16h`M`z_R&q-dTy1JrSW&n4(S$M%oF334=1E$pk{GG=Xr>fp-P0wF2=q`4p727X1Iu2}iY-O=jdG24xnCjv{1uHUwKUG)k9YDWw9eTTHm&_;L zF$2hI*UQPC9X5mqh>G$>279HzBF~T1HK_lB{mXMnYDLWKw83p%oN77Ym@RE|z)A#dWoAfhXS|WXEHbMK=J8;X3l1as02=b zILeV8$~c}R=ZuI_)<#4{p%GEeM!8XvNMt?&i7Z87FePpTLX2c?3M z@T~Y0&xjv7*c7cvpbF6m!}&F|@N*Gwm9Ey_d@EYHzbdoRbni(rR4^^LS})2YyY7sq z;yZbGa(eWV8P3!cm*$j_H6m-St^VM=D zjcHK3F=mbQr^f~bai7%)L7APm^l8j@tsooMzLmp z%C1POeY2@~=S|J#Q~!~8hw=UzDqmmAk!*O_CDU1<+rV$J+sa5&%J3-XZ(X~Uw4i^m zp^cVS-wCvl_IfMnZqiCbt_|O^n3f-DgBJ4D#zWt1R)5$`QSKnm6R~bfg6f>^MbBPb z#LO!ttG3-?T%yX1-^HS%Pc>I+dDSnX_HRXSK1}m|vD~(54vBI}x=yJ(( z)C)F+@$|TII-QM(#3JMfW;5yNlV&+XwjmAhLqaDk?XZ1v9n4*khiry#XJ?rU+6%&q z|Jgv)ja|BCWUmoi{i&)Xz`_FtlDU#Yi#msr_Xy}YBnNyzBbBtB5$gb8ielTcs;Cd{N zRYa?kr#T|2Q8v!aUXsk4#r|FR9F-1H$ z;Is5tZ<$sxyIbCksFvw1-_5SOqZtaqKhToV-^w^Vxf@Y)0@1Cs{ zB_>`Mlcxb4oHZp{n<)|DDv?5+j)Iy0fS6u$5@859Ax<%wRmn-l=Nj2F6U)o)HYiPo zf#~ng7K?5lmJ4c;O`^45iYpd+nMy3D1{(e@`LXuX_?^!=3|?_rX$*#bpnrlg2=SK< z%Z%S?xbTAIiDeCj9JbBhKB5Y`tD&$Rkj+Ll93W@qBgg&SIJgO}{R@R)ASsn?d4Fbg zKwT}Z!oa&V=_~!)xd}{f2i~wcMS;0&`C-)tlMbk*+1xk=;IHps?zb}rn9Bj8b8X@P zgWvq-!v%}z&vL=*I~e@!Wex^U0<)~f>eUVg#}@W(3B2*51A~=$0PyOy2L>Obw`~c$ z@y-B)^>_jB>J0)03yU)UEBM>|1cMpC2)vf2U~ncjbW7lk;RFWLf%$1Is=(krLBB15 uHy&{?IF%m)Sv&Ax@a3{NF8C(vJ+~{?cWV;w%9IZg0KQ6a2&7P8<>}vIo#dVX literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПерейтиВПолноэкранныйРежим/ПерейтиВПолноэкранныйРежим.mdo b/SSL/src/CommonPictures/ПерейтиВПолноэкранныйРежим/ПерейтиВПолноэкранныйРежим.mdo new file mode 100644 index 000000000..67402f578 --- /dev/null +++ b/SSL/src/CommonPictures/ПерейтиВПолноэкранныйРежим/ПерейтиВПолноэкранныйРежим.mdo @@ -0,0 +1,8 @@ + + + ПерейтиВПолноэкранныйРежим + + ru + Перейти в полноэкранный режим + + diff --git a/SSL/src/CommonPictures/ПереместитьГруппировкуВыше/Picture.zip b/SSL/src/CommonPictures/ПереместитьГруппировкуВыше/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..6ae93fa9ad5f92883010d3c2c31493f0580309af GIT binary patch literal 5281 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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..41d47d82c --- /dev/null +++ b/SSL/src/CommonPictures/ПереместитьГруппировкуВыше/ПереместитьГруппировкуВыше.mdo @@ -0,0 +1,8 @@ + + + ПереместитьГруппировкуВыше + + ru + Переместить группировку выше + + diff --git a/SSL/src/CommonPictures/ПереместитьГруппировкуНиже/Picture.zip b/SSL/src/CommonPictures/ПереместитьГруппировкуНиже/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..9d9ee5a33dec461b61fc58f3aa35015482eaa02d GIT binary patch literal 5388 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 + + ПереместитьГруппировкуНиже + + ru + Переместить группировку ниже + + diff --git a/SSL/src/CommonPictures/ПереместитьКолонкуВлево/Picture.zip b/SSL/src/CommonPictures/ПереместитьКолонкуВлево/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..d31601902cdb1822cdef36fde9b035f272409eb6 GIT binary patch literal 5522 zcmaKw2{@GP_s5?Z+t`<}?>pH-){q(5m8}TX7+XlZLWq_jYnDureT(dGktO>wWQi<^ zROYoW30bqo|FQJDs=u1K?m2UxXRhz{%zZxRJm4O0v8% z|FK)FY#X)0il@9vt>^0V40C)Id6n4R62~zVcduZpoa@xf7;T$4R$EcCxCU;AFX7So;cdIrFeAjycg&Qw1M8$_A7&cGWK0)MdCzYb})Ei`kNSt9_K4%6U`S&A-1t zztlgbLNes4dtNl~mWcCaa{TR@Eq$aK z0tJBWAIm5$ySI#xZ3w|msG+_VB^fIjxVn@&+UmxjWdH{~j2Qg1*7H088d6tnb9eCi z`@I2C6HfF7oe+0pEj8d-C;Mk`LTHaXiv)n82jtsUMBp{7jym$ZH>5PWNWW2%Ca6n4 zikVqjIw+!u&nC~ab%3e>Ek_)%NgN`NfrLhQYKho9EyMBIaHXFPrsD9Y57j*;<%K3- zyq-tA9$W0Tds|UyvFJ+i2O^BkI)PMkW#h;~(|bg2bY*jJXg;tEZ3I-@gD2E{|4Ywo zU-TABS1-?SD78@0IhL)lp_xHDOwMPqRT+j?h-{P=hBmC-USgOm7W*XU)aw|ou~mo~ zcb`xr*CkPAjo{x_^H5GxRq%@U*H?vg&R;Y{4icS@_vvsqy+^im8F8r}v)I<@sOrX$ z{nELD@hZfKB6>lYW|&dbr*(wO_C~^`Quu6{OQi{*(ut}nOuv(qOJsUAVUS&Sz%cNW zkmM)p8=ZZGBCTEmu<#K`e@@@#dQ7iOX}Zkim52c|;-GMve4J6MiP zFDriqR%B(pc3;W94R;li$(~2vWB!zNN-<5v`{gs#3CJi-%)OUyHXqf0(3O=)t{-M{ePuo;QUhWcaV_v zAC$=MCmUoPLUI%(ET9ncJ|)zprp@5wkP@0C0H8^N2);Qf13LdoNyH%~kI(K=64+we zAHo*(D9Uu^MHuh5?OB@G9ADC=hveK6-65`zTnPf6@aM1CV6k8^8Vm%CwRPL|Qess4$4OO9l>#RuLRg~G_Lw7M1Iu)lGymQ z3vsr>S87oCPlRFD<(2!l1wFV0VbHK7N2N)5g^GGIrnmeiCV{oM72gbCn}^N9dW}&+qK0Qt!nVj!)0in)pAJO4K3G?jS45yy?tLd zY198w?gI;27mHf`_kmk5^7YZn3@%+SoGn(U6HZJ&nyPTSUCSw2&~Y-oVnWYP=*6SUYXXoup()8JQX!y$H+bp zPFxarx=g4EVHM%$#0cA6YI;qeE~JW3AB(2F1Bhm7P3z_f{}Uy8S)l0&Vta7&VtHwy zUAf{`xT>S9ukVSixy}xJc%Er~YP2x~BhASaH0EA6^wpbxmOqRya%hwze6h42{+is+ zC-C(3TO-rnE;ml4)=@S}`qPwJh?|Kq_Mj!FU3&A+iVsB%1di6cO5pyhwa=1wB7&p6FzJivHLwTdf|!XmxC+hWy&Yz>r+_ zVQja9%sY>hD&s3Lw;5YXZf*0u{A#AYxjk*Kl+xVNN}8Mb*wCg&BeJ_nuw;Ro-}XhR zC3`X#FURDr;}?z>4_(UB4X$!Q-^v6k;V(+M3rN)-pRfKreKG&yjyF}tJFkMgdn#&# zb~^>Rxs<+HoSrsk{(-Z_6}R`AV%Q61eZ`BUCkfm<)bn5x?8hY;&Ik9zg05X?sw|NFHZ?kwlYJ?!={h?Pfm!`+GAAL&4ntvj zL6`YKUu-`bALQI2mfj?ho9(P`d7OF{MTo>)Zosdg71-yO)v@oon{}YREc0_VeOnUu z@}{%uqL0IqY19Uq(xT)(k(jMk2RUQEF~`CMU%elHn&}~qlwSLKn@?t=<+`=dg%6oM zZ*3J@xIudUKx*sDs?8d(j+GzQGUh9yS0!|J|WfTAaMgfS9 zG5-SS{2Qr|vj?R1#h%p^H zsTdCFi8)$d$&xMU*ruyB9^U=>-ieD*qX^j~1ZeZ{W_~!^n^~BbXYlV0;xFBLdfPXc zgSN_?eIIZk%pc!>ezsRQc5PX?D>Hg~J}B~h9F*=t?dYzb%*kgtHyJ%4>bPe)m>A^D z>F>UE_sXwrc$^eRWH9saYI?0QE=apxUoHv^ye?Ni8e-9aQ(%D!%-eEjD)2R&+g|#1 z`5wv8@e3sOu?w`+4JZP&Ge)C06v6l9(kF~C&J^lMh#dC68oz#pu3ekkGwnU*G?fBL zqX=zyCss0=^m!@fY(1`^mbJ6Ee%8gteMgCRsJec0zR6QPx=6j9@=Ims4zu>d@g4~n z(FG6o7R8cf=5_zp_#(fhxB7J4-tMrUxAbX>(KGT zT6E$t!pEWAN7W)pP)Kq=!WW<$!QkXD!aNE9z@q@scr1kmoqvsR(?Nvi67=?anihS= z0&eznrN|x)eSjp*2_b?n(tBas$K6oN4wNH!C-^I%R$NwB2(d}@>B^UGhA-(j+O%Jt z;(A~i4@2N2!xz3VJ_iQVa89vyA2ibzFRsh|r$HCWCF&YmO1)+E=-rKEMhzoBNMZ2U zBxjX!5LPU<9idx+bILa%xs#12-sL9>+E$R!2##vZ$U@CTbT2ERsWgI7E~JtSa>1ES z8H6p@QNX_hx}rkE#C6oxOdFOw0Ztfzq}w^=bgP^uA-iRb20FA2+Um`7p5k#Fe|_0v zlLLf3Tu762*jic23=kS4y{kP|7p_`y#{`XekiCoybNtFVJh>5sf|j!ytk7{!2z^p9 zJ`U*{(+F3oUn=PKrEq1Ca$w}8ZFoa2Eb#5ysnhn<=O|Dl<*Q9OF>#MVdVF~#cm?M) z6+_}~aTbc>T0_ItF#?k(ikvOT<5R+20~G_Vxi4siWx3fV4<&JlzepFr7{}KqJ&O>B z)P61Q8t_f=%8jieNq~`PYkW3!VbNPsKIt9tvIu2R+^tl;{7@_QzS=Z|UE|p5Y>b_` z7-QHuo+g%l4nH%S*%Hv$n`8Tkj{)b>Cs=ACK=!1tSvhb@Yz{o|%1x*@I zz(7>x3n|0ntrd~gOxg*VXJ_bjw1a81qd&LO-nvIa8VZF^)d*u-2e3dF;bfPPInG9J zdhMn%=L36YZYyTfNBoK{sj`E&BvVtSZsPCMaTUidzzg}-Mb1UL)-#2@k{V!2S;*~o zZ#H9_eL6W2ljX>o5ohTz?V`+SfaHnLtYQ3ca#XQ7_=YMg35V=@wzN{bkYZJ+R) z8RlwpkeMMuN=n4&!i}Iz2F>uDc={cN*XpGfVqLI$5pRMZwU;Gk%?-RuSIbPGORms* zH|A5p=hA0YOl7`Yh|I_$%VbMd(-=PEfuD; zMi;A1Z2H_PlpW;~@eSzidmJ=D=_OiH#A~^xHd!ZL3vy=PsaF}Oa9d%iB$}^B`6%nq zS?Jjho@|gUZ<)m#v$yo>K6OKiid^3!t3rO3VTDuCE2Cb7OI%wa?C_0%fvEl= zEsB}oZSTRS>05B@Z4DI;TEDjt@uME7RNybD_OpUZTf7IH9A*WnHTcyUV*ROWueARy zD6g+vrdGsB(KwS{3=eR9fDxgf0t(r|{S2HYQ6{Cysv z9Z86cUW-duQ4an)l%lBotusJJPANYAYoeuTeqWI8u})?<{UdIe+vZC#z2>bJ~c4c+@Y_knq`_9$llK@gjXM#bklZ$Avp<3;}uOy=_wW=u^k_;XF zAS>H}QfV5a7s-!W8yCcs=<_A?(0n{4*n6(SVkVL31UA8Fu#B*7-sIhxnmZ(>LjP*X zY-nXtW87;wSWrplo{{)$ZzRRZc(!In+nrgx#D&m@6{Ve|!4HuMU#6*Jdz|;)NSJ>9 z4W`YO4i!135Y~=_E-8N%eqHW|k3JW-%q`A(D(F4M3IA1M2-9x#(>jjc`K=v1^}@qq zk+O$x5MVrx2)$1z)^IIltS=k9$^ceG3eY-Rxj0_2bN7(&cD@$aQ$yu1Nl!Fv4j)Rd zsMNYq zDRQrg>c|FvTCIMAVG+%t%M%!veBw7+Za&3i{t-1sf5E+$T%5>U^GUo!vCMQ%ibpQ( z=K$MG4n^hjeL66_MC22V=^Jfs=?gfIio(T;dl}s%@D^Nl%N)DQLU~Q&YH@qxuKZm? zJqVNw_|w4>|K5KGU)=kj|2t+PJ9Iz*W&j|2rHiuchb*iUFV`I7*m1Xn21qe%Rla;@9H&vv3&ok5YP+?x|_Q{Tu#a zf7bo~nfbGB5bdvd`m;KQb&(%O-w)Z%@MGKy;16r4N3>Vj0aEZS077+vZg2K~vw~;P literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ПереместитьКолонкуВлево/ПереместитьКолонкуВлево.mdo b/SSL/src/CommonPictures/ПереместитьКолонкуВлево/ПереместитьКолонкуВлево.mdo new file mode 100644 index 000000000..ea5c96633 --- /dev/null +++ b/SSL/src/CommonPictures/ПереместитьКолонкуВлево/ПереместитьКолонкуВлево.mdo @@ -0,0 +1,8 @@ + + + ПереместитьКолонкуВлево + + ru + Переместить колонку влево + + diff --git a/SSL/src/CommonPictures/ПереместитьКолонкуВправо/Picture.zip b/SSL/src/CommonPictures/ПереместитьКолонкуВправо/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..32a2b31e54e8f817de8c02048324f3025a65d754 GIT binary patch literal 5532 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 + + ПереместитьКолонкуВправо + + ru + Переместить колонку вправо + + diff --git a/SSL/src/CommonPictures/СдвинутьВверх/Picture.zip b/SSL/src/CommonPictures/СдвинутьВверх/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..fd56230ec17cc100c07325cb716116d4e222580e GIT binary patch literal 6734 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 M3w~<>O98 + + СдвинутьВверх + + ru + Сдвинуть вверх + + diff --git a/SSL/src/CommonPictures/СдвинутьВниз/Picture.zip b/SSL/src/CommonPictures/СдвинутьВниз/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..09706fe936d72bdbeae6c98e088ebe2193fe89d6 GIT binary patch literal 6894 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 F{{xq_v^W3& literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/СдвинутьВниз/СдвинутьВниз.mdo b/SSL/src/CommonPictures/СдвинутьВниз/СдвинутьВниз.mdo new file mode 100644 index 000000000..4ae08478e --- /dev/null +++ b/SSL/src/CommonPictures/СдвинутьВниз/СдвинутьВниз.mdo @@ -0,0 +1,8 @@ + + + СдвинутьВниз + + ru + Сдвинуть вниз + + diff --git a/SSL/src/CommonPictures/СортироватьСтрокиПоВозрастанию/Picture.zip b/SSL/src/CommonPictures/СортироватьСтрокиПоВозрастанию/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa1411f306166634b4a2dfd0a8c7b0077fb355f1 GIT binary patch literal 4214 zcmaKv2{@Ep8^>o1$_!?Tke5iZWU0xTeMv$XQkG=Po_&bOE=%FHq~3g%D0{|I_N@?# zjL2?`P$TCw z;{H)Il?d_dDNenS(JRy$?wx2qhmgGe)b>GkS8Tr$_Uc(|J`7FpFhsA7WlkWZo9)=# zpxPX&+OU$9ffwh-PUKCd|H``^iMcl{A~ZGFx_E_*y_5rQfy%|_07RjyUM zM626U?8^ztF4zGDE`&YoE+WND?N8| zj$yQxq!><{ESdT*kW#NC=Z+n*0;|mNP{Eoa>11*$8k~On7C>}h5id)o;powW9&)&$;B@{D(K8s9wL!HnaozGVHq1WmU$vN zE2S&TOM-;HZQ39GjiRO^2vqbp?3Xzea8E_;qN1J`c;-=!dZPj&z@}GOSB(``wL%>P z=UnBNohMKUem#SKV|&(s&-RR|0;cH7a^j<){OkHT35|E)cbsN9zlg^e7jv^6TIHN} z;(28nhhqH z8w^%124I0$`+}UQ$}kn=fZo}T&__MBrU<3Vfmp6lI@@%ie6;Y=%ic@Hjy`oC&`RN{ zlFu%~C-tMREV{_>6hZ!43=b*O;9&_2Wt5Uiw16_dabVJ4;Bf{7 z2C1oNUBoDv1???yC%);u69cj;{yVeh|5X2>TlN28UT!Ujzn$Xm77J=>6nJN*@>x^H-$y1ByBE%82^E;cgPn(3p0AE7-eb-%w$2dW&&EE zgt+XJnE5Z$LUx6g!F6oLLw&zSy$O9Ee6?- zeY=-(CZ}fESRp>CwHOw~oLZ8xUL@UHEv-`V05=AL#6RmwN}5y5Dy_v4^-DRIRjv+( z)-}O?%7x!6CEn1_8ef>xld{xX$~HXpD~0SRs{%t-4}~cf8Vl4aNFS*DJ&&)3&<# z!nOS3TrLKPax-nlQoNpZC{eE97yFm5QrtsEZi3ao4C3meWa461njxL#WkuhLY50HcAvMg|R{r_Ufci7e zTdpxx3=Ng&^JfFu9=ofWs#1qWtq=JhH4Jp4PZ5qjc`VY|d4R+&jxZ;=_+1j9u z@XLs>bGWjw#dPyIn@!&?Kd)_`eyuzoJKH&mbu>vk`MAPa>(MY-czw#tfJ96nNcfqf zC;~Nj8O4P=!}Hc>d{(v7HM|r!o;S4nG{I}Te7y*Czlv9gk-$SZ2rATZVJ`oo5PHRG$t9 z(}3rEA?2BpGk%V%yVs z0erOpTMS|&fs6m@O2@ZdsavN=y#d8oL#%mXiAsAIW9>F+f2a%*J`Q=|kDydEZtPb4 z1!0aI<#ccF5K|7alWR~zOh0Q>IwWSdxMpIj0n?ng?j71JO&n^F9fB1KnI)JdehbXa z71HdI^Tl&urpy=nt0u~FpuLo765i7ni>+Cj{NuRC1Y0|E!5PQDzX(*oRgVN$jNDBT ztx=>iNEngSf*rvf|7w?bXH0UVuZ1l%Ey)|^5f3jg`BJuG!pKebmZEAcPJED_Bq+h4 z)TD^G2t!jxXz&eW9CrB`CU1PtC+=b2N2^yOq`V^7(UV_1zkWjeZ5J(}+u`BM_xLBR z7~kAb`80>CQMH*?yDF}|>Scc^&N@<7Z-ts`Lw1@cvv(4;E^1AG1W@n*r}2)6MG;fR zy0d`0$0$G`S|B=_JK0%Vq1}bO93Ad|s-X`$$4E6|$be6)sQSep8~DK@iT!g;J)Jl| zb0-r7`)%aZDzq5EoakgzZmOjpR*IAAiysE@9N2~indN`ET+N^~MS#XaZ9_Ylh$>=$J8y44Qjgrn0{ zCOqD|rOns7R}?N(1V8UM#L!%y)jY%IG+$oR@Z(i$16jf!r2(ek0R8Fk#J&07ffwi2 z=l_mU(BBupAQlh^`cB=%vA!JP3R-c5Lg3cjA8V-Ueki zcyr7DZdVQh-(uSa@5KG!z5cu#Yy{Z#Z?`@O9FG6G^~5`IKX|Xj>;}&t27!JX&OzYX z@h@B8_L}XuAH28R?FQEX-S>9!JBXWWv7Nh}xSRX`J99VJ9@wb6_vvnW0P6yGJ!22} d^U4PE=E~TKC=II3S`4BA-lriTkTl)q?7!a~$A + + СортироватьСтрокиПоВозрастанию + + ru + Сортировать строки по возрастанию + + diff --git a/SSL/src/CommonPictures/СортироватьСтрокиПоУбыванию/Picture.zip b/SSL/src/CommonPictures/СортироватьСтрокиПоУбыванию/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..4fbde8b399318422b345cb075d2c8a5b691d3db2 GIT binary patch literal 4138 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 + + СортироватьСтрокиПоУбыванию + + ru + Сортировать строки по убыванию + + diff --git a/SSL/src/CommonPictures/СтрелкаВправоЗеленая/Picture.zip b/SSL/src/CommonPictures/СтрелкаВправоЗеленая/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..1ed473b775eaa9d4f0d698ff0f5254aa8b87ff56 GIT binary patch literal 7432 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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..2c7641b48 --- /dev/null +++ b/SSL/src/CommonPictures/СтрелкаВправоЗеленая/СтрелкаВправоЗеленая.mdo @@ -0,0 +1,8 @@ + + + СтрелкаВправоЗеленая + + ru + Стрелка вправо зеленая + + diff --git a/SSL/src/CommonPictures/Таблица/Picture.zip b/SSL/src/CommonPictures/Таблица/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..ec7ffa778c49652e85d4459c22a208e0e2a668ca GIT binary patch literal 5104 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 Dz~)2Y literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Таблица/Таблица.mdo b/SSL/src/CommonPictures/Таблица/Таблица.mdo new file mode 100644 index 000000000..f8376c7d5 --- /dev/null +++ b/SSL/src/CommonPictures/Таблица/Таблица.mdo @@ -0,0 +1,8 @@ + + + Таблица + + ru + Таблица + + diff --git a/SSL/src/CommonPictures/ТипБулево/Picture.zip b/SSL/src/CommonPictures/ТипБулево/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..45985c2bd15091714ede563af0443e7c3c5d2d06 GIT binary patch literal 8464 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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..8aef36ff7 --- /dev/null +++ b/SSL/src/CommonPictures/ТипБулево/ТипБулево.mdo @@ -0,0 +1,8 @@ + + + ТипБулево + + ru + Тип булево + + diff --git a/SSL/src/CommonPictures/ТипГруппа/Picture.zip b/SSL/src/CommonPictures/ТипГруппа/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..f2ecaea0a7a919f01e0aa596d277894df1738b69 GIT binary patch literal 6523 zcmcgwc|4SB8=hfE_AHUD=@e07loFBUBw5BDCS=Q&-AtCUG}e3$(W1ywnrvl1mPu4( zjiDs6M|R4Rv{=6Pox^u#c)yPGPmkYg=AD=OcRkm2&3)g`t*c3k;DRv#KP+xvbz!UP zBpe2#haq7{4@ALUM4|#-R z-{lUXoF_+?uh%ht==*~6V9vCB!sioPQmCf%02)l^T*ODe)(#sy&a@8wVnV#VV zbisaov}pzc7gU6{G;|e&ur+dl$(O$MVqKUg*B(52BU_QaApNYHq_t1mw z?PX%;6D3JY#W(V6swRdiL!-;bjf4-5Z}qz-(^Q_dkkAbF}Gw?$K2Ol%*$SU<-AhvhAUu5pWOE7+@4m))pKKi>M0!FRN=>751Ofe@j= zrvp#60N|xiC@Nc>2Q1~V8C%i(Wh=!M9fW=&oltBwGjn$(vat^36phf0$v;}x6JgaO z8-GiQRrB%v+}*TQH31(LBOWPLM5RaCoT3}-isUEqave31;9Y45SpLzITEa-f#7+FD z7(3)7H~lW%S7rsn-D5mlX4jb5J1l-l7dQOW|0!$4Lx0g%^O9LP9jwyf&s*D?ZIcXC zILVuKna6S51-1ol4SLfBz!MH?#h~{8?#0#ypHgSt9`!dDWOkjs%IA4<Oz3P2*?o6GbK&@0(mc||5g@!qK z8wc7eHCx`E> ze4W)P*@Q!*yGv_(k}jC1zvB%2k0iz*V1$z`01a>kQ&-hKk)vW61ZETa!$;Jv0P=wn zLW>LKO$eQTnKxY|^V}Okh7!r%yip+S@pEsotaLrJ_Is8dBn zebuXVik==Xi)_sBdfR{ytuqn$@bN|7$HYcWWVmq8tM*vDm5t&;$_XQ6VC-r_sn0jd zW~9k3I7TcSB<2+MB`uqtGFGTl|6Uysy)%sc(2tz#ueGgqmUL^ZATvYLm?J76kPZaWLZZY+Dyi|SM zUXK%fTKz$h>D3BvuSGvM;xmjtUe!O>d(o`0Kl6KvF_Q?RllXysiuRc8)ph+=%@a#b z(H(I%#qyslxV!DzP2!nx2ZGZdro5C(4-p|VY&Dd^3~~rwn>Ppq*}u*pd-Il@n*ENG z;fo%v*!y#XG_M&%hB|rq0_O1EXb^Za90irU1b{D=AUSyv^_ZoAo7LpSX$6CETEPYV znQDO#f113`ttKx+<@3S1?1E8<=TS0_3ix6fjpw0{ub5{r-SbI3B8&eb;(9`_g%q;V zdX038(9*)OlR+`?>@drrxt-5~=y+5HC8|*3(&(~5YyUpCS@~QLlP~|`g*hLJ_R(|)9?4*B-d^H7?08YTRXPnTP}_-OzP~S> z)wrgO&fZkR<%Yd;`on?ujpp^$4^sQ4cPqCw^7_=xlXevZl_K~by&kqkw;IkmC)hv3oOD`OpcueN{*n7FA}YNjY7X^;-t)PhxrhtMu-V7-dIegq4fXbm&x}_%Zj; zA~Cv^xK`bwSuNJti69H}KvIr_ogSAa-w>ux`^uJC~{Q#FykcG6K|8eev1Lx z7dm0d55{!t0Wqi&p+^XJ(;L7FpdB{va|qA;GM`T&Td-e7elsHboN*?+{pUU}0X7U4 z>4WPUD`&vtU~{#uNN-GpjO4~D@?lm5?5}>Eo?hxSyWMAI{ckX?bK@sjDwQfAmggqfReqZMcDghE$XPKOs>77sJo;z1i`5{9s|5@{NlnZ1+- zYqFij&0{emH(C&6270ka9I}Bug8SUGfKX)oG67vAP{g4=Rc$i-79Y0Rp9|QsD&V1Y z0=fX=fg=8+fb?VmtKtKSY1af)Wn#C(CE4Bnsemcts{%gWZ5#||dx?)xd@$lv(rh#4 z-D+Yos}&Yu>Jf~r3S;ThH}=cLD(uPsI+@gLt0sgVlyooqJUkcS9ja}NF>)@G49Lov zvzr&d(=KQou~qNE87)t}i>c=F{PrTNkt^)-E$5d_(oZ9KJCfzj}(x^?rkOW z^LqMa*h_!`kcCal3q{p0lXprK<7+#wGzfz3_=98m(J=vZ!EW1 zHkr~?_so5y;!lZ(N7UK^gNu}mQ9h5q6CYtU9B9a7-Pq^2uLGb1q-4`tL-F>@w01d= zXG5Bm{i`W0HqJzC)cRsX?Egk5+%zy4Gmwj2tXv)KY_T{A9~Wox07Z-#f3|nB<*e;S z!9!n_vj(BK==w37efNlEi(;|(2J1w@H|3QqN5ptuZ>Mb@?%(~5v4EW?!PUOhLR%iJ~=a*iMLT-70~@tse%jf zaBvTVV`80uiwLLTqWyaUMmd53Ctz!ffCt|}%vvDkVY-^sF)1e_;P7T`5%BSF7$r{- z;UO4WAD(gs0d@gvi-0!*M1mSNKnz>f2c?`0fa8m`MZjy)QelRQzX{Nkhf`|Mj0gZU z#3>YF+OQrp<&lvZ^awCPpfDs<{7rzSJTOs%P6I|8QV=I2h-2t_(3Hm*YS0V})Sw~a zZvr%B_e%}B7Kkqe(dI%Njn;#v>`AFXPXl8gN~R&=Zvr%B$43o1mkGAnK6gE6%07%5 zbUrf`=uNhc>*G`QG1Q>lSzs`zh6SRxTOX9NyPyUg!%77jD*h&zrYy+Rpmo?_FsRB4 z(Xng*O;IMPLHn^&frg6z51_$XLs^BuV!O5o_+#5(|Ely-A_pT=)&{VOtt|pxo`VYc Yzo}`unsngk6PN>Yz-+;HoZ#Jm0R~@zTL1t6 literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипГруппа/ТипГруппа.mdo b/SSL/src/CommonPictures/ТипГруппа/ТипГруппа.mdo new file mode 100644 index 000000000..97a5c11cc --- /dev/null +++ b/SSL/src/CommonPictures/ТипГруппа/ТипГруппа.mdo @@ -0,0 +1,8 @@ + + + ТипГруппа + + ru + Тип группа + + diff --git a/SSL/src/CommonPictures/ТипДата/Picture.zip b/SSL/src/CommonPictures/ТипДата/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..26ac984d739f0278ed57c1b733a019a784315b99 GIT binary patch literal 8138 zcmcgxXIPWV)=dHl9U}c8C{22os;CqZ=~V%xgeDg$(wj&JDT;`QAWcx3ApIan2Psmd z2%>}%2uwCMtR~l$|3e2*&V2 zgmPQV315R*Jjh-Og8WKEQvVgE!ukp6M@+nJYM=DkGS=>;6!0ZHEEGxB zL8YQ4!TyZ=3R*3U&03GGB(tkDSqVv_i8Myb27^xe}q%lgLHwvYHXo>z@U ze5H2C3oUBf;%c7)TE$wd(zxtXuk^XsihCxfK(<{ad(DJ+V9ZeivB}IzJtYzHtQ_Y^ z{j0&ZD<+)c-{mDBm?h5o%d=kbjhN$ZD-!FSZ{AQmIehgK+x>c`HN}#rde>ZyV<(zZ zE+QHC{Qrl2R#YU5Obg>3gpI?Z4r;I<~UXYT4`sF-1M1ZCW0pZO` z@x@{whL~V$;-odD})(hQBC#wBE|Jk zO+QE!Jsv0gB-jxT9=MS}9}0g^!z? z2gZ$}9HT@$(?NbWd1DIdPJ6?*Xy4K6Mh>7QAmn^_aliz?hrx&&eLwIC0f1guNC=C? zVE}_e|HZX_igtY>a-5weNI z*NiHZY#9nO9g>QFCPS|B?qxn3UPF`5{H3s58K20^2=l8@^jD%tZvtvb{p&uu-Znp0 zAFS%F@;hDRy^%24QJ(0w?$_gQtug6xy7N{%LP}44QYax+*$>ss)3!{SpBw9A;5p!C zY~$@j%qmC3pafzsyxW z|ISqt+A8(|n$-80o3g0h;TihRzHo!O5~TBHG0~%~5CqXeJm;g%l<;cmX&TBJK=9-s z_|xSH&&MhkD_y%uQ) z6;fEFGQaz5|CVC$Qdo*AheVa}qZ`H0DL;mok?XfYeQ1Ytl##joOIkG}HBth)`D=3MOnwSXgY1$m_0PQgi;J)HO3yNsMo#7WCNqQ^X7EG z7YUN|a(#keF%WER(sTHHg|RodcPajkX(j_N5GJfNr>Ry)IS-HoLzLqy00*0Xn*vr9 zP)+`4j2QP70KI(c?XMLu`cna7*m*7*U_V9$N2~QH_!KS$&;x$^V_yNhyz@rD+ zIf&QP>(5?oN*`bkdPi$Y-`YK5Sg_i7scVgMJHvY3lzeeQTloF1=MPQuc)z+2TGU~w zY$ux-cBSB#QV{_jt<`8r2>X5Ok0GKmIYg>yVKxN0XW(-Bp20p}Qp+$-KqPU|~WSKGr-h(RMjmgTJVY@?r z^BU6xsau87mECu){eey1pLCTsorfeNr4*xJt>ocp@UBwR^E(#TuB|pMP*6O(E~n(@ zzokRMny}@bjbwa>C(GH1@Z^vVJX`&svxG7sxISsP*9Ljo>r%tIbfTVl7~)d*F5Mzy zmK++H&Vi6(uH$`@6;3~xb}IVRhTaCu&GEB@^#(#52oDzXPg}#xCINC_2y%Sp<6zP6 zW4SImcK9WXyu#hyVH9+Hsxp64TxNGo)99P}ZIO21sDiIdPG z(4&PkbgJo8O6?j^v|+77K#PRm$sjV48jQUw#(2N%w3cPVScdxEV zbydIa)zS!bFNQSz>FpYn1I9UCpM@{8jNlU|QdP17qzT2E}8NKA) zMVyGJdX+K*foC=!%u(src7~s934V9yUuP9f$KPm`w7l{9dd`{AX)`36??kMZX(!6I zjCDm-8(a$8GNv5?)KHdEdzekDby#eMGsw{l`@k1Sy_ zWu9@quQma*ZWL^@jz}=xn9a;I)zQP~|B5hWlAkMi@XO4X9v^I6QQkhPH>EUGgX zfeW-uoI<+@_|o;VjfRyonvG5Eor5M>nUc~7BAD54I{8V~Fn4;~*nsXpPJr3TD`)`b zVTn58$Dfbu0N!J`e|%Bn5XkQnwF>G-E*tXezNqQa)c=d9O%BSL2##$#X6t@L)c@SJ z6Yp=^BXV9>gSbCJ9<`XkV8Yknw^m5CH$l`EeB@5x?FIdM#Y`%6<3@eIC+KpPDpPLXunJ=n|a(B>0Plt z@K)=lqd|iaY~kizPlHO|)2-&)QEYp4LN7!IJEQ+>`B5U{g>Jhxm0k+bxsy>8E0+Q@b5h#QWd?EV2d#F}A{zmO1rwTMa}HPhejDfBoN@R*zx-rp zAO1+kBZ^-alGy{!ojt<2aDZ=^=LqM(vtTM*TPPtwt3vyQL=UogADA2z5*A4ih(!{t z5G#xT7JpSp!2Sn?B+f`ZNC@6cFi3EEmG)HKeQ4eo+55N9Qx;Sg$DS;~yq<_TFsp;q zU5l;7`3p*f;*v~yN>b0JT83;&KoRsIspBxxQ1nLM`flKqr{=Z3b?s^q0eY0AI?uYw zW-GlNf@~3%wYh%MVT(f{y*7pK{U}pc7h=18c}KzO1^-K>=t}gMyJRKw-1~~tZ;@|w z`d4KwyPnBu6i^!W-}~HQ=e4759mt}a!Ehz}WKp+plU`AG#$umd>aIae%t9C$yp@&p5M5V5}w;Y0oe*}Mf# zd*m8=2RK8RIDdICIz|>_8E-Zp{!F5|R4|-1vEdf!z;eU~sb*U9&$V(_$g-op`l+_q z%5qy=N3c+}pV2mFrV_cS`dZE)HmoryLtGre@-jm(`11UZ;pP@AN>+xUAaTfRWjO^C z=%?X_;T0{+g!7IYAeZ%*V{J92P$alPsGVmMT>Si_d7^O)W(SOwcmP;C-;054GJxM?_C@g8 z+Hn||9EgBV1q9+#0jFPx%?1{KB?8Ea0}%`u*$2qLL8#R0DN+!{uH+Yr1)Tr#3f!6{ zxz{zVb2o6{B(-cUR=y`m!9zkOa-u?C`Plf*%7R#e;Bqe4KeABcHSzc5URak+)cI^;Yi{bfx0u6_t3rW3M8#~fh8^?uDJri1~z_-FVn09 zd4ay&2X@nn;-W42sn+S*0y&a3lI(5L;$DT z0AJ4hpv`MHl@dUeiA|{dQ~?xiXaQ}0rCotrC)d)s-X-Ft0badRfwh9WdjW4XAd_Xy z6}8Er#BuhNe+|s68rQrr&4WZ@6`F1qG^^WZ__>#h*%**GGXbeo8}R)`xi(Ako-btPl^U*x2T6d~f4 z1dILKwk*j(=42iLGd0>?l8ng-k(nauwNB-#4$*9e@%@_uVqfq4sljA(E;&4%yoK{G zl(KYiOnsMQ4+#kG+3mYLQ+L70#099Wb2VK-$9>~kp3`37oc}CD7}s)e2dARHm^>5% z^EUP9jq9s|6_W6?6uz%`3smRd!CPg|=`DwfqqzGlzL|aBQOuexpL;jA-dJkNsQC5}A6d>dC~p>3V4KIww(Vo5V$My65&* zWhUzC^Xt1GB2u+xg9ln-CEv^9lV;oUDv8}ku2y#V{lS|>`TESbP@4Z(nZXpD!GJNE zTF<$fgdb{fB`sc{Sadoo*(LkLw;+pGOj6RieM*Ew0+DG7)2<(!QWxu8$_tjt17CI# zP&L`C}yy147f=)O!KrkH>8@Aw^d0H!@j2RPtR5BmT0#cvDZ zkbuzM(j$TE`$6nTrI`3Tvw|Vicz<809PY7WE>wPwSN@oHIGX7=u2(cwux%dhd}F%v zKgTP70>F!h{Di|i4i6nQf4F0eX{`PnulySU^SD~WIGX84jUMjfVw%lA$1DF?JS@z( z>>mU4;U*t8=p1|iG>&c_j^6N5(1%-Z*r4ZuORYnW#%2E)pbz(FutC2e06^nt#NcS> z9R+>3Yl01Wng|;-4*SOdefa!|4LTFJ`xC}-(8SS+ISTslsSq1<6&W^Y9QKa^`tSh; z8?-lYNr~&Eg5#ul6!hU^1vY45I2LGJ_KyMj@P-o`^dev%*Ul2hQROJ;!`nb?(Bf2B zpmEth2I#{D85{H}U>{fI#j&+K3i@!F#0K3)iv=2&{r>_QQ)>=aAxyFTIbQjP(}Dh{ v(t8*=#`59XfT?0X$1DE`px=Hdh5RoyO;ZJmxl{*k?I=N(z&njUFth&y`!65N literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипДата/ТипДата.mdo b/SSL/src/CommonPictures/ТипДата/ТипДата.mdo new file mode 100644 index 000000000..be2d00731 --- /dev/null +++ b/SSL/src/CommonPictures/ТипДата/ТипДата.mdo @@ -0,0 +1,8 @@ + + + ТипДата + + ru + Тип дата + + diff --git a/SSL/src/CommonPictures/ТипДерево/Picture.zip b/SSL/src/CommonPictures/ТипДерево/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..5d4550bb5313601a7f85f133428673992386c744 GIT binary patch literal 6886 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 G$o~Kcn4OCN literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипДерево/ТипДерево.mdo b/SSL/src/CommonPictures/ТипДерево/ТипДерево.mdo new file mode 100644 index 000000000..bbc2088a7 --- /dev/null +++ b/SSL/src/CommonPictures/ТипДерево/ТипДерево.mdo @@ -0,0 +1,8 @@ + + + ТипДерево + + ru + Тип дерево + + diff --git a/SSL/src/CommonPictures/ТипИдентификатор/Picture.zip b/SSL/src/CommonPictures/ТипИдентификатор/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..8838df79781ea54c21aa12de2ffaf98d79f6104b GIT binary patch literal 7661 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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..e9949b827 --- /dev/null +++ b/SSL/src/CommonPictures/ТипИдентификатор/ТипИдентификатор.mdo @@ -0,0 +1,8 @@ + + + ТипИдентификатор + + ru + Тип идентификатор + + diff --git a/SSL/src/CommonPictures/ТипКонстанта/Picture.zip b/SSL/src/CommonPictures/ТипКонстанта/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..8df8df1d876be16fc04a345f7d2094642f20083e GIT binary patch literal 8989 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 Ty3Y$Xy~zPf@LeXlD**f-5N^Uv literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипКонстанта/ТипКонстанта.mdo b/SSL/src/CommonPictures/ТипКонстанта/ТипКонстанта.mdo new file mode 100644 index 000000000..11d347ff9 --- /dev/null +++ b/SSL/src/CommonPictures/ТипКонстанта/ТипКонстанта.mdo @@ -0,0 +1,8 @@ + + + ТипКонстанта + + ru + Тип константа + + diff --git a/SSL/src/CommonPictures/ТипМакрос/Picture.zip b/SSL/src/CommonPictures/ТипМакрос/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..25b9d021b69d5f650ca227dfa78f900dfb6a34ed GIT binary patch literal 10015 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 PAO>I7;HO-MlivRU4&gGL literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипМакрос/ТипМакрос.mdo b/SSL/src/CommonPictures/ТипМакрос/ТипМакрос.mdo new file mode 100644 index 000000000..04a7b6587 --- /dev/null +++ b/SSL/src/CommonPictures/ТипМакрос/ТипМакрос.mdo @@ -0,0 +1,8 @@ + + + ТипМакрос + + ru + Тип макрос + + diff --git a/SSL/src/CommonPictures/ТипОшибка/ТипОшибка.mdo b/SSL/src/CommonPictures/ТипОшибка/ТипОшибка.mdo new file mode 100644 index 000000000..bd7531cf5 --- /dev/null +++ b/SSL/src/CommonPictures/ТипОшибка/ТипОшибка.mdo @@ -0,0 +1,8 @@ + + + ТипОшибка + + ru + Тип ошибка + + diff --git a/SSL/src/CommonPictures/ТипСоставной/Picture.zip b/SSL/src/CommonPictures/ТипСоставной/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..e13b358b01c41bc0fde63d8fcd249c1f1ff7521a GIT binary patch literal 7539 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 AVgLXD literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo b/SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo new file mode 100644 index 000000000..efe377a5c --- /dev/null +++ b/SSL/src/CommonPictures/ТипСоставной/ТипСоставной.mdo @@ -0,0 +1,8 @@ + + + ТипСоставной + + ru + Тип составной + + diff --git a/SSL/src/CommonPictures/ТипСписок/Picture.zip b/SSL/src/CommonPictures/ТипСписок/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..197724a61179adb8a42968f1ab5ecbb40b413d40 GIT binary patch literal 7753 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 C@@(D! literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/ТипСписок/ТипСписок.mdo b/SSL/src/CommonPictures/ТипСписок/ТипСписок.mdo new file mode 100644 index 000000000..f31b02dec --- /dev/null +++ b/SSL/src/CommonPictures/ТипСписок/ТипСписок.mdo @@ -0,0 +1,8 @@ + + + ТипСписок + + ru + Тип список + + diff --git a/SSL/src/CommonPictures/ТипСсылка/Picture.zip b/SSL/src/CommonPictures/ТипСсылка/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..e2d0802acaac53e4fdf4aab4af25aa5182e8c9ed GIT binary patch literal 9317 zcmcgy2{@E%|9)po&B$)XPWD|IYedeFeczW(4B10O%Sf^fWep)DAtIHvgm5I0eLJF@ z>}z(iW$FKpuZYuJ0V_%YDz#}E9(^4fH^Aa zC;~v?ZL%$!L*U=g8p?{sI7o}3qAngoodV(HIqTq8uw%`RQ5uCLPm-($Pyw-Q6x1^5 z3K-reTx_pwKER9Vh@LOV&ReTdE#wITeP2zbq zitew)`Bs;>S?YAn(W#Uz%e$YNe=Ht7zd45{pU#_Rtr(B%Y%UTxlQ0$@M?=emshIcS z*Xg=%!{{#XAaLWXkcq#C!mx}&Z5ml9QzIF=e|YpaXmG_N=Tv1;d7B00o)s3HuksFc z2PN7`o+e&tp zfe?nA9Hx~P$hIWXrD;&!~?>(jhxM?m^cHW|}GUkhoVf6z9gGo_x{ zDE2LX>U0q1`tVu{IG2Eiimq~=l69cI798=d;zVj17%)O)^@+y32z&(%zyV;fI*Ou7z>dO=6qbb-qBmcBnUnvsN`ngw!^ggR*b9^)-&6ep*m zKA(C$IY)w$QOzxC2F=#CZY{yawyhd<2Zd(ffm+3l5?eL!%E+_BW8ORYWN35Ah>LS!(bNsQ;ww@;4i> zu}4`lBmj^hAwY5pBiQ*v%F^voHnycD5JMee0p-DyVc}TPGXZA;>2m1aF;V7mdJJ(~ zNuzUuJHdNHj}8Ky>$)|`CdD!Lbc>Q^+9Z}+o6moI8M)#;y15f3R@YZ@D#5-?z3Yq6 z+!qD(AFK=1iWj0r>{2JnDxru{=VT4mdT*49*UWK*=Q^Xm*WBlF1rBqC6FL&XEa8>u zfrUA(&eSl8bvCUGKNf*!`Q2a8L6Ii!lZYhSkL z`|ZxQT4{{Q8<--F`F1^(`4JkpIhNA&T@7o!Y&&z5@VNKUYD?=NlgnFH!H=9T^c7&O zVeKJXk~%NDuN`l{{E7Sg3ogb%+GH-Xfg+JR=+NGoCk#2cpUamXFI;lsVFena{Wc1;aPd$d=FCgtN!KwSxO;4+3IxI=oD?3wi$uaBJWE36 zeXHxV((^jK0$KPpijrC!I$J0vp(SZ{!_?;d(d1^f0pl}h-5zF-m&MyagH_(kN{X#q zFdhe(9wwA{xCdkdff2;HLU6b5nNEZ@e~;<^iv?>8y7lA+x$aWk$m#OSA6u|0bdTy% z2Q9b(r1?7{R9A(TZ4=ow5Db=Sm+Hd8bCzIZkLuJZpf#sJ_*za%f}KC4dfy(^J|e9N*mD zfedISX^*=Unv0xvYjs=F7RWY?2xJojs9G3~X!%^xEeAJJ#NAx~pNYSK& z{lZv%b?ZjmOR%jToW53b$m1nSuGt>KIFb^#|m5kJmDvb?;RwJ>(xgvcT^u9N=EQI2Xb=TDI zfI36M=EII0>*VqF`G`iPcR^)&)77T$&dJ_W=eZWIsj@8R<$>=$Zvw9cYOO@*gK_e6 z5%nXIc_lYjP<_->iZqP{y4fS`E6}gYqN+j5@4;c7hgB;hFU%e5iHaNjhv`p-*h_)}hV` zZ!#VxnZebNl%=XOjoEGe=9p(IoDKv0;M~xMaD-3VDKIj~H6!}mmCI0#YvR*gFUeh#w z@&MsPl#Z`AHT%jhD-_LXu@OP}j|gl&pir8t-G)&hi3vphd4&>T`#+~pgTb$jJGwV^ z6?#wj;(t*n&z?fXzdM6egX$!lL%vri544Y%LOH;B3IQwo)@BF z$g==;{z##avOR^G>geLpC{gsx1Of-W+*TtSFhb#=n^w%V#d8iycI6s$grW{fP9{1? zI*Q2aU6}9*Q9Z2nYf@e0by8<%t>5woe6o1$>ill1qPP%&eI;(Eb3}(Ubh`csu}Qr1 z8}*=ff8`_Rp)^@Ijc_XBz5pK_o|81Xnt5%bslyd8&GCT7O|=%$mw%dDXO4ejK7&BZe`RjTi26 zH*Y%6V&vW<+4>@{VT5K0r-Q76obfT-dydcXtD#D~v%p7Du6jCClNCO#DD*9u2iLpt zO1Hi<3HDQrvV3P5jtY9>+XHr#qqXOS8iJvW$V&BSce{o%Xr1Y6ZZ*t3sjU#W4zKK? zDCGS>RJn*ORD4TGxu4X!M2i$yq6lZDQRz7P)jceuG;I^Fkplah-dgc)dxY4Uj&X3 z7Y~th5-}qFJ@Nc6=OnHI&kZ+?UG21)V#=W)61RwK z9?{^mp?9@o2Hm&`Huki`DFXnUG7yynF>A2%N7{jI?P({mGU_7+6%0o>(L^@I&9E#0 z{{9RI`*L2BGbI>xeGx&xAXxr&$cc9ekB4vZS>l4CMW>``CAY@^uw?PBlyGn;fIE-r z6}i^+th2U#vlrpx;~P)m>1CR{bTU$z>tb-zktiS5;_VxLrx?i{v}r~TbL`L$vsCz? zJAy)~v;$BQ>d`ppnoyQus7`j*yf&@v;jQ7t7Zc!~iLDi@ArmH=bG92#Ln6NjE=ng^ zDg7{$M|z?IfFd*gQ+z4o*I>q0&$>}M}1FQ&6Nz3ih)NuG13TNG`@kKd;{lF{2vVOMN% zZR1T(7tMU2W2KaJ=rGq5Nlx(fllN~Fn~U&`EUt58_DoycYZ(u#P1n&=ZsQjH%_{#f z`{;cxmPHe*r-fOt(5uR2E$Oc%Ueg?p;I$GX@u&?SP7PIa^Hq94{r2GosH1DJ2eFsLvLZX^1psPY$l(q6U3(22c)U$i*o&VtR)^`J}oWTdeKi zL&dDao$7S63=>)%`guLL9-8p#QqXgxnm;qWoM=p|H~BPX3vrJ+OChm8*HH7iIpV6_ znCAw4cF!eW?TX_3?MR(+ip8FtLuU)kuVbHd?|dv_D;Kn3$1H#Fx$(ZEVJ?xYDt+nb zxaga_q%?!c1ukvlyV^9ZGVWuZWl*vt4w9QO5S@{b)m&}bj$Fg%`KN+8NcxZ6S7C8u zLY6<#w8Ye-N-s?+;k{-c_(eb@#x!XNaRi=D3SyAV^sRM))kZ}L8ip*hsfcTn3n&Z{roS7 z*VBW`k-yc;?)s0dOZDX+@2;6)fBKIk5&wBj#DAD!W1B?$2LsLgvVg#kNk%uf6srCU+J z$T_G-dcRv;T_rug@gl8vxUo@ldueG&LZVuZgm%%bVL0Y7sTET-&A^*tzlaK!6tyII zZe+z2iOjGZ?)`{lKvh8NnrGvR{v4fAZ8$xLa4JS;&0xg%VvDxLvjqKeh|sW+YqEYW z=|xU%b8-^&qzPvS-n%a-l9oT4ANzqM*k0D>tY^ zhf|pSLv>C~6cw(ck_GHVTf)z!Fr($DvP_M*olOB*Rayoi+yT`s(Q5~ zB_+{xKCJM3_3G6$6&00E$|@BlWt9C6i!a%!d6zpq?Oca5Wab~e;ekmpWjix=$jZw{ zn4IHtN)KM~F4X=wCm6o2uF@Si4Mbbi?)&aIM?T z&Fxuktq1;6SV9$Un5N4i)_j&kJSc_pf}J8)2)}}9gaNIdxeG*=yTZxVmYcRVPAIkD z9HwJ|o~<_#X;hA@=>__GcP1yDjHyS0aWy$q?Mc1sJgM!{)$zCp`su4zuMT(?MZ86x zx$Q5!Na~Gb79J)YqaQTiI*z`&UbCa^_AHb?j$GjM^&@=hPZ;~7RBU}rGAY_o1FFrT znh`FUe5V^!?dABxg<-=z#cH;t9t$%Wr@Y!PPE1Q0?FU5N^c8wehd=k>e8TecX$8w(*?8A zID4|Bi`BpTm^&nCB&3{BmOOEy$C@%m%sN-v+d0)ZJjVn+jgH zA|QUVrR^=#$qUE%rB5OTpwC~1q;4H*nki~$-db7`AJbYRtqSGOlvd+hYW^L@{ubH! z>J1;?x=^bA$D=)BuN@chOKT7zzID;mb}O11L}9(S&qdP8&CN~7mB4$4Hu`VzN4$s0 z@}Y*}aW#|3q>TD>V7?YvH-LyCjZ__B(q#y5=)Hv+d$_l0|k4j$JAFJ8r?!OxPZpX)BI`x;|i;45E<^?4YXa7QI&AR2XO&;mJ-UiNBBFeae!TngLol{FO7f()JXByHn^+#5%Vs2P$kIF@2{ zb?4T$8^Y5KW`aMyOOUBmgpogX71oft*|$>B;?E?ULz~Mxip~faF146ou=r>-f->`} zB0F}-LNy~vv{-U7C-u@}nkl?pCY!9hakmEIlW0_i%H-t+&-8_wOJxO%WkCO3k#){Z&r$%-h4aZN6783rH*uGgE1w1%zwpi{{#@0JO*$A_EjeS<6Qh>K|G~3 z*qe9rPU3FetOj+P@n1oNKv5+Bs`c)#2oh?&e_fdYgl9xbe?%(3`dSCa++U|7)Dr)? zG6TLqfc^7CWOyPo^!@Pri$#Q@%3oJzKoJ-uVpSm`rN8e7-Cx5YWZ(a~G6Nz&<@yLrUC$BCwL;Mr0+rRKW`rd{ha0iXkz341nB+8frFquX#s%PzMse${(I2- zH|YmKOVA$xO>F$10KI=fJ_vdV9G}?AOJw8!J?Q<* + + ТипСсылка + + ru + Тип ссылка + + diff --git a/SSL/src/CommonPictures/ТипСтрока/Picture.zip b/SSL/src/CommonPictures/ТипСтрока/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..4a8573620804ab515f1b50bb360d58030edffa59 GIT binary patch literal 6445 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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..20929ee3b --- /dev/null +++ b/SSL/src/CommonPictures/ТипСтрока/ТипСтрока.mdo @@ -0,0 +1,8 @@ + + + ТипСтрока + + ru + Тип строка + + diff --git a/SSL/src/CommonPictures/ТипФильтр/Picture.zip b/SSL/src/CommonPictures/ТипФильтр/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..65b38e81933b7cca2ed87e601f24ea8e0d457292 GIT binary patch literal 8125 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 + + ТипФильтр + + ru + Тип фильтр + + diff --git a/SSL/src/CommonPictures/ТипФункция/Picture.zip b/SSL/src/CommonPictures/ТипФункция/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..dd49924e6c9551602c593ea4a3affbcd7d141572 GIT binary patch literal 9895 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 + + ТипФункция + + ru + Тип функция + + diff --git a/SSL/src/CommonPictures/ТипЧисло/Picture.zip b/SSL/src/CommonPictures/ТипЧисло/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..5c68889911c012b1a8213ca5708682ef1b057051 GIT binary patch literal 8626 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 Ou{3}+_?t8 + + ТипЧисло + + ru + Тип число + + diff --git a/SSL/src/CommonPictures/ШиринаКолонки/Picture.zip b/SSL/src/CommonPictures/ШиринаКолонки/Picture.zip new file mode 100644 index 0000000000000000000000000000000000000000..606a7a2c850379a01778e0420bc58fdece81f0ac GIT binary patch literal 5918 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 eg`g95kw3`zWpy+Nf7E<{6nt}oP)&du0PuhD + + ШиринаКолонки + + ru + Ширина колонки + + diff --git a/SSL/src/CommonTemplates/КомпонентаПечатиШтрихкодов/Template.addin b/SSL/src/CommonTemplates/КомпонентаПечатиШтрихкодов/Template.addin new file mode 100644 index 0000000000000000000000000000000000000000..4509dd00728452b7a2a8e93debe30a77d3ba8519 GIT binary patch literal 7578587 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%0DkA~TL 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 z z>Szpuw{M7vugJS$o!jJP*5FA#NiMVn4-2E~Qi%7d=sn{SR4m6R+J3n&vuB&W&cx-S zo8X&-^Q(g=h2eFh$rT7ZC49nJAAS#`NaH#m--(}eE%=!nyIZWv(19SmF@tO<#J#?1 z27R4D*09%E^mP_l#$M;q*LlRlUUTSc4w=JV7t+^-WEy)dpsxjFEWXxM-PZOqn+;QL zBW6s2b+GesO}>ze%0Up)*qR>L8si4$VsaXetFikK4BiMbM%m*mjc&G8YeCAm!cXq* zf<)JR8vG!&My1k(RlE_zIX^jnAr8qz9o}ZuB3`oeE9$8XokS;-Ejw^k;&~tR7kBmgZIw@DTk<($y)mJt8 z{OpcaosA{s2&txcKok=4%MTdQbrZ4gqDd$oIeiR}Y^LZzh_a*K<*8KuQq$0-lUQU@ zrNnTOkLBm*H4TYRF5M*{YyIH%^o@cVwnZRk9?^rRjOJSSg^cIdSE|b zgrC>+=ts32J6`-VI`T&Ddg*u35%QGFZz0EvcH<3fEIvR0sj` zE&1f@xQz^Y6m2mTPdVteHrF3;s4WMVON^0P7?@;CjE zkHjF`27@f`hb)Uhw#Gw>9dYS?r%4aAZ@?bumZxr;ieMM zl~+4I)_Y6Hy%?*!-t+P!dOUAM0&7+)>r|<*Ga(Zb1hS*MC!oqL7$>=DN4Hvzo`^GB z;8{FlG#+e-7{vOoj14>BRB{p34C-ImvD8Zrd<;NMSV^&7H~u|HdH!RZz8%KaQD4Kf z33hFDSD1pQHryx|lA1;&MQ#w^)lG%TP`xFgKy2yF5r)YPJGv_`02fSAYEZoi-a6qe z8wvng01szkK-`A^Qz;|PZrHXNO}-LoNh%R6(6_3TpT48K`X7BNkZA-mjjb;~I>lid z^|c7%zmV|q?eHS|(_yw{7n>>*bFx!wDlQgC`8Ew#W@-&C8^2XuXHv6>1Cg3b#d;HV zovz%LqQmO^c9N)7XW3ES34;sOJ=%uV1$2RVqrUc)kWbLN=v@w-lyADHeqLrPoG2!( zUcp?+TFNc|12!<_bC}ulZ^JW=Fe8viCjVBAUZJzZ;baNQ+zI#=U9yQd0cU=W;%Fi% zeUvTMa)NB-WQZLtA>-ZOXsA%yyAt`+faBqCfxqg;RDXE%w^E@JNG~ZNDpiM_5iSZC zmj?{DI!^_LFIX-1+*4@{n3e~It#+OaB;>8YZ%XX5PC&QRTO7~>8+^ma3?jS%gV$T) z2XyEF@}CsnaygBM9+T%+3VDH6xW+oQ(SLVPGq4^al*LXs`%RV z=GHG=Z&g`bZ&qSN(@*a4Smqf$IJb<6cXtw6m+MVoxNG)i9EzRw;e)Q(wfOi%eRy99 z{zqQxz?jHc<cP+1=U;id}{p9#t+O9DznhFB_Z3`jMPu6UNGqRU7pjc44n`H~uX7@WN zgM=m^XY`XB0jM;`tIo!JGMlP+Sy5UBxmw3MhW{6lD~vQ6Q~+N5|~o z0!DuzM;6-D>&WFP`1J)39>G0$W7KS{zHugqH14C={rP^f<0sIMcefzNgx=U@o|nm6 z=4Dlko0q+Hbbk0N=P6WrJ1SS=Wc$s-$b71Ayk5wIlB=;Kbdg-xPJ1$(0ABmq&2F^YVzlEKWtY2${mXKb3W(s7SFW1i7H4Y`$j z#@+SEu8i(1vC^U!?9zN>g}ae$NfVGYXk2eMaxc`5kSLcVo-WE+goSszdl7-0i~ukJ z=*2pk@{K@dK0q znF`=R=gB2oiozw7;C?;8fdsdp9^kL3s$stpUZ6!CgtdziJr_*G zE4XUh1b0^8$BZsuZ+q6k6KdTSFD0c8g+GyG*6|fQLl>;gHYt`q79Pf z6cZ=Lv2VpPr}(P^h7!_@GJ%tjm1F`~(^R#o#1ykDI|HX=T0PUvox*-+mBzmsW8 z6#5s0D&R1v(%|qGlVk5`Wx3k9khzV5)R{x~s8NHJgJ+q8Q2Y#;UWuO})wCIS{eF12 zgYM7V_6E73QJhLc`J#;eG|suI|EcP0cyp0WzqjyL!^wEdgW3f2m17#&^(hrW@Oglg z{^0-EH=7shv`G~g<}t7gCG(ASc(q$vDqdQ)9;Ld`ifJW&oc4Q32m~-WQW{hR6NYzG z7U-d?EFcr{le7^KOmcJhZ1fB1nKP_?)I7$oeM7ZA$V_*-0NSHGi1V{7JBuIfEq`>a zjoRc@)G4hDb*FswIut+rz36WMvH{7ondQu&v6;@J>S zwcNhMGN=~K@lfd_@T1Z)SA#H9@fgao?fldL=VdWX12zyEC&p$~3(_b(2no9IA!((x z{2?I3M=nob))8FoPF!SG54UfuRM;yQS_3m~h4VSA!W>SliB|MJzs2hdW_ zG-Pfl7cZ^me~PKBBf=BK9)qw{jMz35mciUiD06)vEP#9)qsvQ%MX3_52+UYs=4$0? ze++|LhPUfis@Tq6G&XWuL-?CFmi%8qSn1EUEu{JVH`Ea5ZN5a*_kMaYta^(D< zLHUrlH0JfQ<-USJu_GP@MC16&D7>R;?jA+t=pVS(`D zvTTn*m@e-@3d-x&qM9O%&mU_wwPY@Mm4OE9F-T^)Dg3yPJa!268Pf5}XTAuOZJ6Ox z_aH&!^YPI^eH_n~>K-JSyc0{kA5!J{sEe!wv#N0 zpenzLec<(bc{6$CYCW13t)>zmUbFZa)ayuw*RN60%#<*2RMBQY33`!jleR`YUubX8 zDJA6Mc*;+aGSqhsp$;Ld&PPta&5k{__$?)1P=eUgUJNMh@R6*yHSWX@lW7KXZj4_m zCHl_otB2lt75gaP?<+_0G~yl@9~%Nxtn&LPCF}ZAU#6+RPWIrK5nq4KQ;O57J zJ(0gkreol0-Y_A@>+@@!ePtA$A4z9xc!L~t(8*FJS!6oFU@S)jOzIwNsGsco3GFR; zCz8iz0k!-jPv0L^OrI_{hIU@Y3G~E4?8A~6b^FI@Jt!oEaOk4UYwG{l5<%@<`F!?D zTh$c5QfX7Rn$$TO3tBo>8$@Ba$0gV*&eE@}Y=wRLA)aef%gd2tA8pmnwZLr?HjW`L zJQ%yT`^SgWjt9q$ghD9pNkSX>3GDx3(K_4YmAwIdIj$X&fnoqXmYznl9lWpuK3-F! z#xA+ljcfhnD!d<|I|0Gv$0+ra+nB)tezR-GS@mxnO5s)=KcO5I2~dl_)6V8NKdd`AG_;E z;Nv6sSb)(tbNSs*K;4wqG06RXBv+n>qa0M4dOvPY%-#-O6X+awGZMdnhw86TPx^Uuj1q6fN`1{|uX-R2d;xZNrVf`gG!{r3*+m%k56_-)N9a2s@_WL!YB$^v8oiR?9?kBa?D=~6;|vJ zDJkR~DG0C3b0vP0CMQ z#f)@H$iHc+K@mPSIKpa{JPU9#Y)jImC8^=RQyYTfV$%BoTPQUhN58W_prHV6#?q^^ zD2w4I;rA*Zhzz%|2^pFWzs7obVRLE-J-#~Yn}cX>fRhg<>&|&}bKq((=_#*Y%mr7` zrz*n&E?B}IO{=+J0m{0Y>9+hQ=yWMKw~ujQb^$22WF9-wBPk1!vDKy`KXjFrWm~vf z3uTy?{vRCU{@Q`9Imw-)qbuABZ+E-~I9(Bbgi4{rMr+L_9H*+c^>geEt(n|5qB7*|&YBpc zv~${JJb1WLz2uouQNvkzp({1~X0&@I9e~Q#=@qMhpOuQqV?mr74ozaP?SO9il zyTVKzT}%gc)1)KdS5ZwdtXed=7Nt=!RXZsv}=P{Tmqzmy)1iA z7Y+a?Z>N}FdJJ)f$7!u5U*L5E%_@~@X`Xn|zy$?51F?rNo+|AySYJp-fkRTV=tG7^ z<}nyq{M|m6(djZUgj_8eD9Fm({>+_NQlyA1vR+bpbQ-ec zO58L%P$>EjfMio+S7BPVVB;P*t3xAP(?q~lJ#V6pNz)#TTrJqve;PW3V=dTFFVj~N zNWu?nQQuKPG#igyhzLvNLYv$ezIqWH@U~fM5A#=HfD~?TgO`-fqGC22p-TD0oa(tc zG@I?ks93uR0W+;Fx=`tTAmeid@N&hV8!R2uyj zZ9+2nMXYGpsH{_~K}@41k&X&19bNzs#du@lCz*Zp zNP&S^M#5kwP-Nr~z{y$R>vJG!hO2SoWUWK8r}EAPIjy3Hw1>z$-Vd!mVv_ zejkeyX^`{-)Fk6gw$YGtpn^8_HKN6V-Y{@15puBd8}gFSE$LBG?dIbO+aMH75K zIlo-1$hFeSCu!XhPNYuw>Q}^Ej5x$Q+hB&EaYn#gdj7B3ZrD>u`!8dQ^UQI!IDd<) zzmo2`ARUZ_X_rP`?Fai00}KCrKTajd-R|n#WR!&V5}a@Dwq|!n9$lAqsgmG@U1ghB zU1otc&}fTuf~PiLp%%7p#xF-rFj6C-j5nYoNmRnZcA8+N+MM-G3+Jf1Y0fGq5j;x&(nyTKm*`)#xFDSl_;b@1e18th(i)JtzB&x%dX65ANv6TzfU?|*v;0By~k%U2}Uq&?- zyaj;e?bs01fA_%Kwvo^#pm{$e%FPmemuU|+L`IUXEB;!4OB^OxoKe3%=>Yoi#_Qal#Psh#`Eo`r_5XkI|ouDLUfyY`ml+6yDU` z8bA1cR5#kznOIm&H|h+Y(SMDEV3 zXJ}IRT!mUX!HEi2jk*V?BuSYHCprab0ZzG1pIaBiWQnHK!opf(#uLML%e|XHPmrPB zL^g9GYq*F1i>J8SVmtvyO1OvdDw?klNiJ`LndB=#k30oj(4GK&e$dfO=OqeJY>CKp zM3g-!n~FzrUPcvoZE`4wF0)yK-qe~Y9A5f|kn?mmX2JL{6$my~+Kg0m(M-V_pCMBd zua}WUix*YiAipWkiA~V%MjK+QEis`<5}a~oKMn$OGwoA)bZ>&Kn{%FARF-Yy%`j>p z3Z2hvIuQxY!)tp21M-4_dg@t6J)T_!)nJ=5Fn3@jd=|Gazn7`{YZAFaxrmoMH8pxs zIH{SgTdX=fYFmD9on}gQT1#Zz6+-owxMc(B|*6-Mfg%!B<60gAU7 zsg0sS89*gsnEmJ^G(F#V3rv{MJ*YerS;swmmX0d*!5X=fd#IGA-^KmvW}NwvyZJR@ zfF;A*460X6HsC_ zNap^Ahkl8jcO-`)Vd$wlvqoG{f)##kNa3&WILC?27FLC`3n~fy14Wn-)fev)d~D*- zuDr?BP-T%dCNO_DBvs8(_OFCIKRLY-mN1=>jDgdeL)fHV#Yq?*#;{-!#)7fiEmE-V za+LMR`Mpx`q06x~sP4ge4ogJc)5_it(M&Ai^QyC_O^F)ksmJ9@aEz<@3^^!2S$q}Y zb%I?(vZU4-Ey{R*Ph~}3V<;cHwE8;_pG|$|D%J0I}6^Z zhE^elW|Omv^$HH{h_1#QK9PGpzc-wMb3bgsgkjKOJLDGmVmLuw(ku62TDq%mtG&YH zI<{eC_xq#zx<6vXGumOiAAvzN$bD=nqqiF8$-Ho?c(!|g|7>#|uQJHT<%Z$SLZY+> z=~9IA^1+*!iD$5WYa-_H^JUt$9ZS9bVlv}-Ai5z-+F4779|ualDE4GmB^nhftI)D_ zDMd16N#Pe{T9x7k9^hdz08j@c@YlhtNvOUdi=SDf()6aptng&UQgD^YO=0sQJX0m) zP+zD`thD$l&Uzh-#)LgF8}Ok>oy7WiW_VmzqdxkU8Mbyc8u$_H&B1z~vZ+^b)69I8 z3MDi(Gt$*)6($bg1q|jy?j&x2{((m8MoE8wDoCysrv_;Ss%qE%-v=GoL2uKvv z*`pC!2fEojEge=A1KUX3m_U-kG5OSqe}%`u=CIHOz)7 z-i zFm2A)HONDM$o3i`4}$$Y+vh-gq_2`@G2fEp$q3U0(5aK%wCHNIVk^0Nh<(QKveot_ zYtL`T+X8}(hkl79si|HM+#dKjRvG8BEQH>fG@Y;bN%zGK?E07aM54?1`y^ZPvq`ok z@b3}$_YVBi;NMNZOR{bIJ&W3X)@3>M@!5CJ^?3(gUjF^$v!@*VB#5V$$RK5%zYXsO zVcAJa(5GTB$l|^T{u7e#ol`HFLE6vt4ZK_+^O$3fwgJ}!n>^Fp12Z=et3;*82v6n{ zYY;9`M5&frUid^e7;5KSs#WC)KoRRf)Wfx@VSI<`_zb0`XEU`4Z~ z!w2Gl5r76i5t=^K!M14nWCR9{YCHj*Tf?KYl;WC%3sH#&+5#$mpDRKU!FPqTRgu*0 zTD4^4tSb^b5DrrsLwGmLJLDu_fXVq)9UP>~$+-FDGgVY|kdg^6Ms{PZkJLJk$QVdG z^deFQ-zE;atUA<1M*kMUCum1UPy9cV36KPB>NA#TFo0(S0GPDIXN*#U&kU$xDyj6D z%;;!9&Xkra7sATRLOHodQ18tWaDIe`e@Ev>9HsXd4 z@XrR{tbt{jkis2sHM;4Gpiv+jj18FSPFxFE(mfjkp2*kXlJr@?r(Cq3-H>GiUf7Uj zIlIgTpPq99B9gcmlGabr4`4a z_`ZOD(rz3J{r)vk=r!Y@ma_>@AT;{-RNvWY$_FDXWF06^9y$f8XcL=ph1KhTp~@y1 zivY)2t1)a7%9pD?;0{!eYGsXeU^!9gky$-nsl6M(qp@u>y z708J(@1pBfUkR?2z<4_&CP#MLdggyVW+( zE?`(hi&AX0476Kf&%!{vE%t00XwQ^z2`ae)sumN2o46Rv=3-z4F}MzsTg=)ltcy|U z8^JX>qjpvF^^4RFEsRMrhY^dJVaZ&=Y!A#nn|(X4O^>GkQ0W%5)aZ+*bX!y-!7Cop zgYPCdEKTqBf!%O}g;gsPLm*2F5W&XGcZth>3Xj>Gs<5%I8!=l|hO%+vy9hO(s&H$! zAl`yZrSCjevLF-koW(q6<9SLj4=LCfOM+O=n$K3aX(CR4K&miSlvkhZ#;6x1mVp9` zO)@LeSu9;sETtC9^P46hb+t^A zI9CU$Ok;DvM9qfpgZK_4*FK&#g&2d>r1T|W?#abcQn5UJ))Z|DNu1N3h6L4;`J)-L zBXO#wq*Dd%Q!})Lvjy(6Giuhym|Te%rO8U$2>jhU+D(DBw6y6$kjV9X-UNT%4;)Y&XwgXwhv`jZ$Jqcz=yapa5)du0&!(V<#N6X z(`R!%ygpW(Kl`w8p!nj$j&4}fq7>XN(bqRbs>&nE%QhsQr z4c$9FdLBm_jKyNyxgH0@d}#&fj!bm5FF^MO@ekz|?HdGYW@yRwqV&B4S`$IE=Xvh>U3#`*`1E_?OZ)d=3gcU1j+N>IB;_&h>E!7!SXI z7t}S7=C4r*Dw5<=AD^P{TsnIa-atA}Y4{;t1*p`Ray<0LE}eNVi_I>aa(Xt9Be>I( zmnWquL2FU z^mJ{?LuDu@1FQ*NHMuG8(HH<-SF}w{c|VQ;aO+SjYsw460DBOyv?=e0F#w{}ZfMH; zQ4D}F=e5kHy#1yq02f^}u_^D*2uK0|Is@oiH~B33iAr_XCM{WiK*09mYxPEG=z1Pj zlacly2A|3ULoSV7;_*Ya@Xg~d`8L({Axp0Nv#$G6>36Eo8RWEDHSEjxW!8Ada(p8rf2Qb2rh4s%3wOs{*Aw@~n)k;g_ zx3d~s3$n6yw-jUnd~QmLTAABYxkw4-1M(-?f^cWR^{`u?{4yx3TBYHzL2PDWpIvRZ zo{@!*7Cdv`CaA8HW?Cqq{8@fvenR1DEJI@Pl)LM1myNtur)xv&;t2M$%P^)7SiQo z;PQ4sEr(%4weCkGMn*j%u$LGSv%XBkuM$st4ciTe5wt*GLn@!-ayi5h}~BZt5%)n!rp-@C{UGDS;v#_pOz-&!IOqqKlvF0&bM7 zg60>yIWgdI2^6VLn2WAu=rL_!81uDMC1RG7*^A{%wAkT|(L$TfQ$qsvnkNna$&ME# z65*g)VJixu-o%qzxQOCtqsBj?7ji0HxB>mTJl@0D78b$i=D)+MCMbA&rSpZ9=Q)n8Qzbn(W^B@nl2s4amNSFkA?gi!- zUnc;^y@ZJzr@dt@S1;I&3qWl~;>NQcWn~^(g>;dp9@=EGn(6^Y5XMd|15^-+u~&T zx9~lwvq(2+#?{JQc0(h^b3X!AXibc!Fc)f{F(^70^0)&Q^%lnWc+y5UI8H2e^k}BS zg2r1nNSCpi4j63YnM#8lEUrMIu`zeHERe94=4f-A$aC4D0jkS>Jfx-G4y6m7NgIlw zo;~uV)nso| zeLEFX;UfmO&@RNBqN@MIT`iQ0>B?RGU|mG`B-`VCY4r#Be>n`pj_&M|()^uL@?h^% ze}+$5ZNSwJTA>+*&J}UE`q4{~9gM#LA2!co59k1)Pret$rzDIAbW1KeV2<4FJSHc- zum*5zHvdtWR|L~078wk|K3i(Hn#P=^kE>}|PTWhO6eL_iJQ3h%U6MUyur@DAvT;W> zITHOFE`tVT54w+!6neaFH$PLzqTxz6yXmTpdh~*@>#^;+JX|)K3MiXgMxRe%qal>G z9ZT!blB17~w&?CKsG@tTX4+oDAD9M=#wB$Q)?cc@;0%W){4V{I@8$70@-V@pKC_Nt z`b-B}Z#ZalGIC@&DBAu?wh62FC zTuD&FlyX%=@fb~gdDOj0w&lXCI2Lyv^h~;Vz%>kJ;kdx<@o2xbP}mD->EdAsJo2&l z1$OAd8Qd~KJkb5*s;QYasBp2CfhGEkd>W!p241t_urkLrEFNeB>r*_?Gbb3uib#Dq zc)mj1^AKWFBDZWwf^^xzs*V?Jth9DfL2u3%HzxA8J@^(_k%A?&r0tM29Q#-h|5$(i z#oFX3GCJf9~}e#CSr0=V3_J3j6tWxQ`g@egC*dqRl6HuWlGS^V3)wadoka}b1#Xd zJdM!4sT_K34EhT0C$#4vY?2bp(Gp&m&U;qegHdCdmjiQ0Xc4~Rj_}+NcSkrmG~OK{ zG8A)12oEuLgCXvYaFMQT*l!#AeFJ{!w?WC!zf|D+FX27!aV$Z;o<36% zU(5ZkKj?by<9`J>9!NL{f01`l`+m+m39t^JwOhHrs0(-{J4R z3qyDu2IdX_Hw8D@9)Z^i13o?niTnwb2A-Y0DPK=Bo%S?W?JE zc5M^I17Gnoz|zM08Q?o%q+xyr_{#hYQd5|p!TG;)KLex?^D`Jrp59TiMahW-3-zL( z!GU&P=DO_muk|#*>WcpVj(Hkj*3gqNPXqQANd7uc1K;%(wa(tSvq3ms3EVbbmmGIC z81357@?`W1z{eD*Qq(JeeaTAZd+OM-5PCgCvB&%k=n(fez{>KnM0J??8!%dg!pz@* zj>pW99kHcJZWEhFlGw}7*~=vi#1WCjX38G6i_Pcw=SSG*6H#9U zn0vbzD_)%48WTC1XBeneq$9qHrGD84Nufb4WPD91_H4g8BfR5-j>ou&3o3KCnW+}kFx&wYBt(!iS7~RC%F{z6w z0z|1L)vD~fqlb4vLFgZ&{t976f9YG?U*VfkXN9TaO9tkz5UUsI4*e?}uj=+T(df@VaHdCM4eTG$?7v*7oH24o_Q`XL|^e-z=q{9dc>R;V(GrddEuI|&I?Qct;~6W4t>da z;lZf$!jEFk3#ySjFJM7HX>?w|As(FsZ`oZYt=wE0D(u3uwKG3i+M1Va}Nei zn}6=VV2$}NfPtAr)(pc)8sR<+5$40t&3qUlqdpASgt!kwglmnM55pAY{2))!bOrfu zSHg?K52Pgd5K2$iT;;QAY-BCwFAHQ;j(?Fm7O0Ma+?bSvf2(b7Wx5@f=}= z1_FpX`)DE8BT-)lm%oSmGAv$Q;LE9KNz@jO^^J;)=uy1K&(XG~HqR&}DM1tT>}ULV z5+YL$p*7=Fnbf=Nnw5>QWw*iDz>0K$D3W}*+n^zoRWZEpH0stojEz-9qjtU3(J z1{O8;2hXy0s{4`B#i}2v`&E^Qx)W6O_l-;$s{Ws_ZrXMCxYG3fn2eU7><2Eex?9bG zpRm@lPGdmm-Jfe7boof~WwYU(?ODFZM*MZP>b~(53%$loVQxR7|HD^_;h|2}#B{E@ z{B7Hj7Sfk#kqNZ;z`$rhm^J}rBD(2Hut}Kj1A;j7#0(A_M>uM!`geV<>y3y0iiAYR zhl4|L#|M7YsPEzk_kGx261SJPJ{8X+HvhdJ3yI|mb;9eje@n7G@M@CnY4~>q{;hm1 z$yNdXo`!$De`78YVB(`Iu#~85$BUWpEI++_1mgzAXM+|zp<&VSh9#SBh`ZJM2Xymn?(YztW-Ko zJ`139(1bhZ+GEO4omB3-x59Z+x=I<^CS5<$&O4Dsap9?9!sxqq zeQlmyY`y@sh|!VPFp98?qi0xKpT_zcZam%0 zZob5Mnv|?WmPx`$mu7A}7ESBRgmI!GwbyrFg}N{E3-r%Lt$M_>ghhmaGa=RGBM zdFayq==N@Y-YsI`9; zfEy1X84P3)jL$SE>2WN$HLxU38{XL?LFkDV2IhPg`Uj?F)eNCKmv2)AiKvILo}pby zF+>jCw{Tsp^L5!un35~1RVQi|Up8>xt8zBkkEn||H40UJdXm9t+7(m~Co5Hk2BepP zqZAPRElBSGrq{LIOn%#jM%ZkjfiN%$-mbC-0Qq>?I#VFE;^B^3RoKCAR{?c~%DD*s zViGsMW5w;IWh@Rf3*PaC5yNZnD)P#0zC5;aT#bm$GGkiQw4@Ptrb&K|cp!%yg#w-3 zyjG(BWBf2$H?bKn)#ccAc7B#l;>ZcB5HF!tU9|mQ)c2`~u19ZCM|}X4ypz%9 zH&;ebt3}Ci-&opwo0k)%jhgYV%5g^Gbb0^FHLr|}>$65)qH+jP1AYF2dgw0X2GBn) zm=<=3{{LhA5;=Z~09IzLn*OgU^M}D`Wuy(9Kcd}4j}3w>`4)~=2G}jSB^||W{a3ix z#&FB`5;o9+ISpToU=Qraftd<0npP@@F2sPCoqlo&fKhXzQ}oYG#S(E?#bc{8;VqYq zy`p~-JmWB(3V(gsoEVQVW%?!VmG9JwIrz+xB9 zQ@!;1LY)WF7Mp(nnFDLUP$}g!^?KYicSfwEuTmmY#OBMm8XB1`Hiz-l8Iw7;c-W7s z-lOkFHC_yp`vqer;vRZOcm#2TGKb=NM4p)6<;N#9GC7%>^<7Dw%!V)$|0qjwZB|Se z?y~4fcc$OzUonh3(|ch3aJnXk$5!=eAUJf7}{*udXq@>N6o zlH?S4>}1skhQkKI%zbX1Arp+<&+x8}u*#r}c}j=bf^4))St3Up%oq1gV{-*x6{w%7 zvJEIl-fk&O1GO~Fa#3}UQhBCITrkf8G7S6tvTZ=-nN=yS$s z+T%PWONSde+C*}koEn!MYR{`8`q>RgZMAtxVskZ4SQ)y|iZ5cU7_EPDCo__#*D$(C%y_GKQJI} z?sYLWg}vmANHb#9Nr~3aG}7U_e_iM*91RYQ7PO{xoXJ#x!RafZRwPb#o1Gy$;45>q`4YIsatB%r1dzOn)V?OXvk5 zCg*0BUS-drC8!!ZO`)5Z${ww7@pz4Qgw1<-erH&0J`)+E?t`D>5QJ(T)D~EzpQGN- z4WML8mRi*kdIBIVme6CL;}u1yv5jA5Rx4*#(eD6F6J-cnj6;(CWDLz1`Fc{G{DgB} z=ws}O0MZ|%-Z^KAYBRVjbURh<5zor4ioc&oDN}oE#Uo z1H|711y8UK<~asN68uj0eiD;B&H$r5$%kX{K+u;{nH}Va9y5c^!eo<9~B;*-Sjv2JG*~LsMCAHGjt# zYvSNZpMf`~Vp8|uDPEz_(m1PYzm2w!eb5e}P)#z%gbLK-Di9^9C`Qe{$EZ0!92X;w zh#hq|M1@J77!x79@&$xNTXD}oisp);`9TcLcf#E6`F`*NA-W>Kdc#9gKOQCh#jhc~ z(%B2tH-}>k6r*ts=b&ZdNcGc?zMjMx`gjuayer4k`HvqVoxxIKNuo5COoQ(zpA-(B zo1xEP7LwTfyU)kS3;8rIFI;Cy8CV-A-1_KHc!L!Qj(ez zy8Tlex^qIP8Ec*0@`S)LQ?1j23-4@b=0f8cCpEvmh_MEuYZ51;_AG~Q>kNh$eCWNQ5-bkrrn zE6w*sZh1sp9+rTv;h8ZjmcxN79)QsqYPERlO&pL10H3+88S(|JuKrz_HWFNj zUyetz!=6&=>R}7(h~+uN@^Gw%hp~npdZjB~3QkwN?3;(4kAdZeI$NgEQ1^4J7`^ln z18ZJiKX-0LpL6MUbo*WII89z{71p#gr&(}kJ}+a9lw8ns8E+7-|FA6J7XaE)H3ah& z{O+btO#z09y?OM>I|1E#T!+V_UzLC7yukxJCOnLsVXHHon`xukUR+BfpQ-W%pOIet zrp_)ZK#$};=Mv#RGi_qvd1wjqizUKA&@t-<@~w)zVldyzHaQCdMPDcp+qSC$MK(8e z`{~F(imUvceqeXAE4V{fOPCp}Bpz^tL><&&!gk)`R{Y>6S9) zwHwQ=+tTq5Id!*meo_O7Sw8sdW~A0p{%y)U%I>F z`n}P+JB+jpThPI;axN_`bDWq}KI~}Y%koRydoi|rL^BpP-kK?0X-!=GZE4}+dTI9J zZPHZw<3;gx=0{suaLjDr#J?DU2Q*+?Y6Q6@&owOiF@RJwnkIUT z{1Ih|xzB|DkAdyRiT)|DH zY11+G4t?XJxRkZ9 zeKMufTmh+a6Q!ZXTbGD_bY@|1zJxl;MD4#vMxuVIsY+)86mAd<+A^P|F3dhZGWN3t zKbs6%mM^Jpn01xLg636|V+#)6|dR3gaUj zVO;5Y!lG^H69Pk)YEg^f{|r)MRkvH!;#jQy*GB)th|qVi5b)_3zrK8}yR@{f@lyN_ zbFO+{R+nd4HmP`Z7T#)}Ln4$jE4;o>I+I0Y0VX#0z51NCRPI5qb z7E)|+bkomzNAz-1XV*7d_02YYb2{7X0=iYPG|&vybP!|#uWw%kfa~-JGV}-R`UCUn zZn!BFn;mXUur+8n1HCmaI~T|dsY#>hX&B@zVrMAMyp?Sb#Q{sG(3^7;&G>*jr$ zWGkirxi-lVy)*RQEX&$bUCK(Q>{boLZ!z$5TzHO{p3jNP>${);n1>$9p$NXCuC9W^tU;&P+TF@jxe`w`5F9m-h{^{L*rrKh!6pFlGHc>ul|rO_j>UV1m{85p(6+uCHh?;COIdU##P zJ6Ol6GqK*m!@lHoEgR}gs?HGkq?bsajaLB zcVhtHIo;&txdxcrI=kyrNU-uJ#GndU9ShmOWza$(G#jyd9^3V0p($F(*iTv*@0rt4 zq510=p?U6K2~8RuS-{A|jtQ|4Y)+SLMq56J@&*2d+7`xmN|QZw@<0A<$$D!+obo?k z@NY=g#*bLX-MfG_?Xl6^Kik74>#c^EWX;FTZ5GDWH&W@))e;KE6>tVj>Zj6dM374> z;s`=(l9(q-OAh>XCUDwh;g(T1IT^g1z*$x;>Bp;f(gWD6*5%WMXTX3SNkju0>9Tby zJ(0~2>)A1agf1mAqBp+|f1iPw$gA)-ufZxO)Bl1*vvRc)fGEq<)*ESYO#&07SejBS zr;^UW-e-)`Y2||vyv)rN);2{!-N!#xMuaV9pHS_g521>2h0&s)L0eg&c;gFQ$sW;* zD}=!V@DQ+%9Z0<%hr^P7lpiZ=g}QtiP%5n6F>L|BqfLV+5Yz!^U@;GU+Iq+IgvKi= z65cPry~XCx18!px5m@5YjSZ6wYWaoE<@SUWX{#p9je^@ET&Dc}#{HUrHq;Z&_uZhxPCJ8+H?M^;b#{5NlLJOcNTVJMmzy zzG#|0xrLoq!;^ZepfrkzJqsFqcz%Oit%r4|1x!3Kl~+ zbP(6iTo(gYgIaP?%Z1$0oPm;yK0_&@VmKa&US4|`*RM)0V%)hu!K3r2_|UTmD(^R6 zCX4p*R$e23sik@WHP%gR{+@|l)@~&w;l{iaS+EM4DQl<&(m@r#K6mv6ths8*1!quH zCg2n_2D9vJLWJ^Y%$k>>hBB%LMDwHl$OJWGU zt6Cs)%v@@Wa$RZck!)9{oEOf?ZwL8YAy7sNfwK}fWfz>K<2$Ig8G3NT|i zG9yncy$LB>CKPJN0UCYmj3I|!ekNbGSWQrdpe3{>0b-=lNOlC73M^tH8+X{XXsgkr z-JV#;Lbiy{w>eHMZ9Hh3g@?ATCRJhOim>}C=V$d3RxcHwPmF$%LNGkQt9ZB(-|<)s zy?H*$5ynjoeeea|XWlLg=1;W^$PA<0S1jF($LFB!09USoK5RJ2`qh5=bv{ zUfELaOY3skrbAn6!~@1!Q1X(a*4ZVc)~bn0r%4H#w5tP4N1WYTroc1w82Te7_|hue zH9Up$NPVX!j><{nD!X8cc9HVoNN5u-D)mTL0k8W~*45@sgkJs{jz7sbz7ILRhI4$h zS|q}D8eBFWqaA%l5};)5TH@+c+D3r&=QF%s6C$3#*dK%Shj3H4R-J&2=rXZrqf89o z#qBfUfvB$$gb6W05dA1VC=6orlLjWw;{;+Y6NuV8S46gOI%tjx{t%aoh%be4N9_GF z;|h+Y5>*?MkUnwG43v<2QGO;e0*^s@hRMwcGRj?pW8?-CNiP8c-a_pFm!0U_Z@*rA zl50s)w2r)gLS4X8yve?VYG)^mkP3l&BAUy z#IySYMb4fwf0z@uRDNyXRvfm7TX9<+{1?-n z#dG+yXPt*`@B2FAEY(BrFyM-7M4LdD#>@KOjj`9yGh^)BY*s^SJQq#b!HuyM5;w+} z)1sHY_#Rt~)Fn4N?XT!YIeCD2r5NQ@MK{SA1NqC1(iESG{_s6CT1c4g#XObHPAS7n zzmLy&`h46_MZ%iNG2o?dzKiugh9tP0fK=f2P3Q7F0mvnR;d%RPom~$$CNcur_5+1h zMaqOC?R4i52XWQl5_MJ*JnStmV#o%D?@U+$zcvlt1IXaE15pZ<7O ze13ZDoqyYkesorx^lNAR8&>r6_gKfx>1B>u?-vT6OiA~(wl!z6?SH}r;A5yu?pZ-2S`ZDVf zqQ&hm49wYTbF}elfX$BQ%_zDZu;)u`99Zj;>UUtR;TQCv&)8C3wuxFC~aCB@MDGD^w>{gx){czsL5sRJaW;I6=?=!KnosqGW zlfaGn#5#`*M|}8p?6gBjKWQaL7+_z3lhBCn?{xL2 z{V(V-Rgwax(cD(`;rC+$j`N!`a7 zi}ktEZsO$NED+DUvXp-J9lmGwKJ#vnWf<2Usn!(o8gcBL_|9^h zxaYTDpx-J|=W%RYVXKMkW1MYe>ZoOT%A%-d>RN8fWy{)ljykH8BcT*yT%NeuOZ=F9 zV7Ue5NoEeDjO)=+Hv1NH{%F_In zz)U2=75)DJFuR~)rwP4OVq&j6jf`msJkID7^reA4zYjsxU?pz> ze#!&x0b{+^c?h$}HiePJRI56a4im6at?Gndcy78fg5>Dt%^s`CvQL6QF|xSJ{#T+z zrHC~b3H0d~F#<)$gvaq&d>Bus^KK$R&H~x(Xw>id22d;XI(`Kf2*g;R)%bNS_7}6V zFj4jq-e%{kTb$y7o1wYPCkj8+I`^}7U*$`KIZ7@NgJ)qa&%u_rLCc>3#abV93HEFwGjSa$nym>~q+p6E0THO|6@56ZgCfWDRZm0_zp66&e!zF`2%|GRoCUm=gmgaOk0;FYqR%tES=Fhc=W&cO9R@afoeY+T1kl>Y}-sEt=PR>3_We3SE_l@nZB?kC?$!obRQ@Z*hzHCw!U9 z60?}061dPtv!>#_j+Vyj!4~+(+l`&tEL=I4FL>#DZ!x=Zc04)F{2n(LH`Ya$U6~jVAjWB!fbyS67AJf6Ks@ zEn}fC6Pe9xi`_3`!;3k@=3fA`%;RNC@L@XdFfdkwh2i$=(gb!^3}cwsoJY4_MQcY3 z+H^0TK*pda2ho}{$YN=kmp`?l!`|0vrBh;tzrf^6|%wKO6C9b3ko`7Oa$e{U@ZG z$=g9qkVMTKxZQyH1Gn2&$^*)KqLcxj{$Y|*YQ7(A_X z*s@<=OI}yr9v-9|_oqs1JvbE>#1}5wx7I`G5hHwW(k80V4>+E(}sGF2Fs| zoC-)py1QHv9jq0#WY}>!Q1S+S{4dCe>3)3&F21pAbCC;SHk3^JCb7GaY=NTGmTR2d z+tTS#gv_o{bLrne3xzJ=&|hvLCbCYz0F@mAW`${4Typew@yX^fbQP*BIQ~V(H8`8(=tCW5PY)CR}%JOzn^uLJZSIs_f%Y z4xR?2WQ8!}v~s?$>0JyXt#n-LXiE*MRblyBOk8MEI?ZIMKvL#{O<+jv#_1yZc-VlB z7@1m2>MS(ffQgP4swMpxny%Amz~#j^q9<7lt%epOpkN487u}Yu++q;-wj-b1m2P;! zU=U%JI*cK=^<8B^%C*8ASNfdeFa$Ndhk3-8dg$6ypki_=Yt2FNK${ZD+iEg*@R;6g zc{yGDT{m<kE|#}9dOQe($0Ep{z=B-mon%p)-O(RbO{!D$bz(U=>Ad62mJ z8*}k+dl;$yKZ~G}F_Ld?Nn{nFdrq<~tGA(_-bGfKb27UmGUMcSakt>?u21ePG-l(n zU>ZCugonXXlTHqv?o7-fBhHgM3tpr^c}RJreyV$ISt-2(l%bHLmQx@Gu-u@W3aMu7 zPEamys!wbgdk z3%`0*m&Z6(@@$}t%RuL6(woqdsIq{PPsCwmTQc2aW73sD%54rX$NeXEn=tZ9a-Pcy zlD5efle9Z)LDJ44H#cM$q)bv`ceMFWh`(xcJKB`Ig+N<#hnv2K(J0Dom6gP0$GF|O z3+2R4^TNOuqyNON$*qOP=sv_KQzkmva$Omiz1i zSF^z*3?$sKH`8XUmeL#Za%9m5D#7S3rT*s_=ZqVbfXIx-Ui^=4zAF~(ZNd21P9+!E zUEO#OoNr3CrxY|=DPAd;L;w2??puQa%j_bvAEw{MhHQ!5-zBF|qsT6b(=I4Iy7Lm= z-A0Zo4R0Vtv%7)Dr-8=V-2vAdZoCq{)X~E~2BV+M$IQXlG6I^#37tty8D~Han4013 z(H<}T{0pRDM*Psb_IqwovetmW;$44b9#qZwLNP|~wLT9C*mYf;QPOGU1gz(J)lMrm z0V_Oazr-?+o9(ph20{QpQ zZ-2;62-S?cvagzS#AA+sP0#UOTVFP&*DjwJ?X~Zuv30*q7=N-uyO&?P2JjUezKX-k zc;}^!>pb8I>^9;$38DdH0eC4Arprxd9v|0V=@@>5^%r*5-OLlnUd_$__4L-?jp?kM z|E&SN(FWwk8!(AJX=N3C>N{9b=4lsg!z8+we`?{M*ov#`4Mz`{qrD5kj0PqHfed8i zfxRY>PMD%$0dl&#jMnsytA82fE6#%)zYHpo;hot|S9-&|<{l}f)x4~^O}^Z+Y=m)S zug{240HBQuV@SI;Z4BJbKixjWcs1Vq+n$X#pKr^9Rbhw*eFxnJdJX-0=(;~aGOz*~ z!mTM#^kni-jDv3JmXektQ2xBtw6wWRTBIc}zDr77>_WH+DtO65K3&mxOOA9Un#Je&v`w-mRT?$WG<;`8wOVA}}H zt}EqB?Bgq?Y`4%fFqjQ>=!WPR@X#9>)1w+U zRd?{aO0V7sD%Il{(4V)lqkb*8K)Dy6l}TD87ygNK$Hv4@m43p#5VG!N-i zs3?6)p^4I*V(BV6J2^gw%B+Do)Sm$dR`N;w(Wb*2*855P(X8->b$=3n@S=jMJ~wZu z>N>+5)0tCJo1Ek`(*s^y@{ue)13hKJZoX^Spp00g6lj)|po|Eh%!@Xvt~ZpsH{u8R zHd3@nb@g@?ZDRX;09i=Vw%-R++~aEbYftWkCv(u*+mLn75i2R$plq^O3`^k)Po%vA z9Lf3z;}{!bvtD}?Ri?gelSeNjhIjgzWA0+i#md)kc41MK7Y`b`9_p%!h#?1{wH zs}^l?w9#did~!_6tt4$T6pS2}S1(9u_XMpG&ZmFJex^iKx#eHq)<14&^Yt8P`s6PaB3EOFU6o9){HVuVg-oI^G zz&ayPU~vYw<^_Z*bc15|Kx~^tXX6TUKiB}TbtS&`8s7fqrk$W**g0S6Kv&|~v(WpU z7R^Kk0q|b|VFpHIK7Ec^QfN=0{_`1eUKqVzR|0KmccT{LAx=reL)BzlDC!E_6-JYm zT}ZU@=`lkdWU-)z-ws9#7_k9Y_)9ZhH$B6K%#88I+xzj}h00Ch@szE6RyhrC$W5f^ z7|t*0ZC;O78Bp3wMzSxXONT0mf!j?mZIR3?Mo((6GUR(p*W=Kn81xQ+j@D;}ug`I!VsOCevThOSun_Y`bF^ut;(y}|ST+`d zu{YAUZL-H_(QnGc_0P$fNV9He!S%|LjmT?Kx`!V2vJ(w*FL5D>|Em3&KO}OLB*;0) zae}midA)TaDY4Y%O_Y-Jm7odAum2RIH2(y#iT>BuFz4rsPd0*)>~L9lPCT%K>NyXl4VBRW6);fYxw^yUZ(CXTNI zQW3pfM@9DnHY6V@@6+qTCvia=sqpsg=m;6X8T<2XgD2JUVV?mb4dYEu5twgX9%4iI zC@Duv`E+o!lvxz2F}@T;@1dtyerqhEQj~kF^vNOQ87swmOTj#)cbAOvLMr30r5GF` zcApPov(ks7nO@{mh31E=&yt3%K$2F_8SM&ZLl7)?3@19Zd4)iuk4 zwiKOd#p>tdH~ACR)-L2cL+DMmmP)^YXMZ}%5bw)xAzsEEttXpL%L(+40I6>6Sl^-K z8RS&QiKV3dAtMxGa-3*w@1WDa$D%hS5fE4XJDH(puECH`m*~=V(xH2AQz?QG3wy_U8$EU7lz)fRHTg4zxjL8qcn{g5fR&OD2N>^fLq0PoH z;8*BYNbm+QaaUr-c;rTgYW{dsU%(V;z-2K?NgisQkYuQgW}xOI5cqCl)4yX64JL90 z>?N0Ao;HGoJp1gk^ba%e9Aiy1hcEr$Zxd}cn)EJI?vg5BbU?wU_iVL(uKEf1`&Q+E}syH=^Y-0H47)Lj+ot_^C#u)1rbx@!|XlwdUY zjGeAwBYj{F?kXRp1<5dcF6jndHv5G2J1y#Aw9K^I%jyg{82bQ<@#>R*hc3E%ALf?d z^|+57?sA2<&jIxpDCwhr0(-kI|4mR1c)NGsW`xrY7=k+uMlZe74s|PZJ9Dwa?h&vP738urEGl@`u8dUKlp&*>0wy{! zsG9{%Qf1p|81DymB%VpIe;+3cc&E@=R|KJLF(`n}$Puu~Z*mM^-t_0lQX5&3mEH0L za&rmd7?T#V7oO}nyUybLtiBfw$Phg1GpV^%~x?1sw)JiY=bU! zSxLBt4z-lL%6qw4k(ulu?|xulogGNkK#M0WMMX*rmmPhxgw0%D4Wk7I%@?5v2I zDuI#`%ol4RWFGht0%xLm171R_!al+B2dW3xR z2Zn;wn-C#QgjT@px)+~A&w#|t#YclO_ci=e$qh6+i-LFxuSvN`@@;u5?c(0o&|35Q zhSz2H1~v<7Id$lHw~Bk8GO$p|B^FY+z;QykD{NS54yxr5=*he?%T}2zyMqXi021_* z+kUTMYdI;Q=A-6f8!62(ms^xu5@62i>Q{0Fd6%-?j{6g`ukrgi26>ax5H`rwWNEr? zX#D;ShAtB>l*lRGQn0D$juD)xhf(d|oo}v4KIsJ>axSyflOiR!2&&|~RortI`kRzo zEKoWDa?uGb*|Q8ld|4eh1dw&p6~myAUtk51f*e5CB^a?R?HL$GE|UXzI*4YO4F;GJ z)~AqT)DF*q&BmJO$mb=84`Py+WT`+;Qg8F|JU;(eu+*?E1qqkdRpt0fT z@%k36BZclP!Xy$F~S-HTYp1;Sh;2iak(>F<2)BR#=r;2HcD{A1mI`kDPMP zGGUQgmgDvr)>0D|2eOGCXb%d8ttG%n(82vg9wrawn6LO2k*%5LOHV)jG+CBY(Aiz-X%2(NI0?peXaiIo2DNV`fsPmg2suR>U>0gACC5mT?zT7v>UvRc%ER=d zpW$HY3gg%g!YX2_GA}UCUo>cbm<=^07JA_vItWk#$WZ@S4t@`D{|a7T*okMhp&~0j z*YziV!xn$ks$pnBdfg+)J%pEV5lhhKx#-y49#tFE>CyoXgU+B4XDEc zbbk-S4E-~bNRGBt4eK@!&4Bz*VL6rR)mS!EtN$%-1%Pnl(n4V60$QX)vsZ4yz{})z zyT&e$ldiv~+_LB%mvxZ}24I1WEVt#D;VIv4jyP9t8k16f7jcvupm^M>!gHB36d>Q!Mx=wANYEk-=ZMd*fWPkD?`_^Vfl(#8SdY6cofC!9*!F2rSgX<}PU3t2u#U0VwY8GASt&htl$jb)4@g4!MbMebtp;fxj-6~`^euNOSyOB->G#q#Q&G zcA?Q|dR(hTD&P%t{p#}6bjVx)*&s7oAs2BTN!BbkL&p^|za>VF0vKm5szykwwA+0?-^sS|&rWo5?h22axOtV4*!BlPtJ9nA| z(m>^Oyxg*(p9n_3;6%U#NM5LPSe@I_>)+BQlA7iBbXtjgku0}c)a5s%F9rSS^xErx zHM&O(W)&N;wr%ncXxU`7B~U(03b)6uty&wvfq9r1;h}%6?iO&1qHw!&8;bN+6zKuz z!tVI3Qp&~opefX2vt>JEVIe#A{PtWZk%FjU&OvdB47-`(n(s#aNG$oUico8l0N+bOt6 zyeqKAs5YdlB@t}S(Jkd<-3D?z_@RjiKPJ|hBwuhA2wSbBom^2}=>XTv#Ff6(`DXn) z$lOrR@?nf5M^ZTi`P(iD12jgUWWn0K?m5C>biX7Z;#O zCt!787|mOF8W^B3+15GGEONvHEwW*&+;kw3wJG}~;VER}YN$w&Gg9B_KP~??Y5=Ai zzC=MQQqZAyx@;Q=wq6G*$q}ECEvvfe1GobYCRG7&s34p5q6PXIVI@>o!)IW~ zA}Ac%{7_>9)T7EG`Z3fp_QjE}^o8}`>kDhNFRcGYUs(U`zOb^sSOoN0G`>HkdE8~> z2>r9=YkI+oz3>|JLVL6qEYb0u4ej)gsGE<`LsQXfsUHSb7`sa@=B=@ads#%oqB}_X z&v7c+h~nT}nzeNsDXM__7T|Pcg^m0VQ!<^|OS6p71^72_seMZVskdw9?D{OVem-ep zLE}_R2;|FN0VZlV`)Kx3yEC}O0`i)@!mhzz{E~eX%2HP>;Kc#5>>${#*`4aroMp}$ zi@4_=T!rm%oS3yHQ^nCSoVUil^}FcT8X-l+%3ai8?qoD6Brt0_O^P$kuaXCFu)M0v z$XsK=cFecnz@?=-AIOlcT}Jfl)blg+qD=U>RO!fax`p~zP+!Rr81%tf2m^Z5{=X!0 zzxk4KcNSQwz^`(0-nL9}FB;{_?ktn2L=5c7C?^3;|6_uI(bI7PIEGR5c$A`x9sz|M zrD$Q+mKiYNR~NMupq2);w>moMH=hF9EOmM<^`J&07$pcdnSd2Hl){|m7+v@Y&_WJ_ z^&F-;bffB`U>5;P^*TGj27EKS9flw0n_I5JBe6%bk2t#l+MOK)QPJg#x=c&gBAR(H z99$(K{uuqv zY=dERd@Lp9R_4WX&!_Xj{xv^PjB93@Fk^)wJ=Y`)&8MYgB{xyN5gxvw=i8J_13V?@ zt200{SL1E%_p~o6^MZuCY2ACM@NKx;1crwdCY@Q@AEO*?;~brXE1xBO_mtQcmBAbs zN>*KOs3pDdZ0`1WkzY#}IN#oqgmJI>wFL4hm=vTSlMH3IXODoC;I%Ec&nKT{4`v_9 zmitl8F99dRs2c`T(9t%_bs_uGEEgr~a?Di}hEl~Ti2m2H&mWv`5FhG+r`BaK9JMaX zX>sXN2I%-SAU-b26a&?@**MT**RIi~!nYJ$Pq`h6(UMX3Jp>z+`ETIRb7q4Gntd*Kn7;e0fI&d68lCIYhZ#V z9&B@ACIJZygiI1JgtnN*(e{VQoCJjcVF<~|cDz)p*0x@%wHNzV6f0;ICxqrAltiFN zgwUv{J5JO=^TJ@$oNujl&Pjr8-{{}Z zMVB1gQZX|e*P5FQ90SWu5A>*PRiaXHP-*BzR<+_JF4&S+@S@2+^rIDa0c(0^Z>Cam zIQzDnlUT!$t%;&fHgI;gpvb2s|II?pB%ltf7YItpY4j5~2DyNV1i}iec-_1^yHb(s z$|+=v&3I_QmK|3c!{PuZxd!qSq&XPH2X{mykOhn+M$bX_PNm|kZP#wXmxqBwN*T7m z6NJ6WfTd%ZyP4O{cIXJK&W8kIwK*wmwK+v8dBeYktxJX9=}N_6=~%4=JsuXDlNHy# zv;(L&3Q6wt8VmELGuInwu6>d_1Ae(Pm>jY6T1pOsYy>?rrFCecEKoE{BoF!ry@kb$ zdvS!h&gMw2M05~wS#3MeBOHbe=pIKiVCmT2Fw^AUBDqe>mrErl>!z}X<1okQd@`hz zoCGA!T*q@@vL)9mwjDo3AaKRrRjRz34`AF0mw0VP z+9)D~zv8^Qtl5d0^RQHrXbYeXlw}}Rc#+=17c2uptdxioX|Zh=F8e!+9GSR}3+=$- zq~)ggHv*nhN_L~`)|ymcXtK-GYvWisd=8P7C$mFoMZ2Y?_yv}xr?pFYIQw~kAG$1U z7MJK>Fkv_%q~b`|ae=w)FamNw*l1tHTWJhd90M^r`LMoWFiqbf#gZMT7$&?poeBGy z^-)E5RI%lg(jE3-rQu@KUZ2^>nh8y#xG5NhHu|{E_V}GgGc6@U*=v&I?}A_pxL3*(U?h2% zyt9a>!ZvY5v`?6XW^ zFR?>g@(baoTh=8Tia1TDzj7r-4q5=L*oZL=9tU%$Lr0i(2Rf*fjNEwY)nT|TGoF2Td$b)pRvV?oriz2D+B&0cj%RyFlbl`Tuo0_Fg`2M0z5`*ytcjb z@#5{$DygIP3bsV3Vhy5g?}0l*)~f6+qTrvJR|PEgXXMiZR7iVeX$wbi8g)zHmUy1t zH;Tc=8qxH%Jdi z%{evzv<{}?R%8&eS6bz3o6P=eoJX@)3Uybody)g4qV3gq$rbg_$P09)NGpY!FMy@M zD%^p#)bL@t5#1l7Ok*A4P5dfqEXF^VUrs5Df2KAGW_bez!1G&x%W{UoMLZu>uwBkj zj#4xXy*Nr;h(hagfq341Y3sxO%iP%d-PC#%l_BB387JF4rZ$Qx%W}` z%RQVO7*!9GMJ^fsYiGHIEGMO%075%_(3Nb7l>-e%(-mfFcZPIuBF`8Dryy9fOr_-} zdwnTCTX$h}T@Hv`wIBqhSaOrmjAK{_F;k(}muh56#7wD{+(ILh@u~gLIZ|m}@~LP1 zUH{afu}?iM)};NM_^B_4((Qx4pKUS?hVZoV^O}dqV#9YMht`3nx2#6Z)s_UZn4u3u zIF^6<^{DzRYVr(k)Fiac0R{{a4>82*>>x_nb`8^B4RoXzBRU9d9ftjjcMLgCWv@G_ zQS7-D!+3lp!nO*QXyCiRl|BH_)`IyMYLwhl^AObmBZ+~v0G%jBJaEx0&x3CmbRRGF z@W;-=#@LntoFTA@BmQFCwo}!@#PE`|!X#%Xt02SnNJ#3cyNMM6&EHg^H5_SIA={u=y!Hc=UTMG;$;=P9hEo9bO3?Ei%aK;NhH_vvp~c8G1mlxn z#5*vGd*#}76QtE7)ERhjqZ}$_dk{JCxA0&@FFS(F!f4u`QO2}9jN0(D!o;+~6xNw` zKL|QRm3*dCK6;{jJfowtc1@1{T)o*Cch3S{qP;|W^ zqBVB-03*QWfzt&2!DNgWYQ9&wm2NZw0CA#0d~9^HbbXy;$?!TJ6GkuMZs;Zr!Te zQ9Dih(3NAOfO|`EC+qGfF00}eT3z-QbP3g{8Xi`|qIM|iJf#;tXcT7ctSC`&r%?Gs zWb5|AiiTQ%qqAcgD|IMwP2F-L>tYy!QViy*dGosDC}4eb{In>`1=s=3ZePk8)~T!$ z|AWDyWTV#icqPj)H@JlqWqC518#cbGd0HLIUMJM8#&Z(?fR3RJ{I_O*Hgj8x!$O=Of)=qFbVgE<7R=QVb zZ!Pm@P>u<&?}FEgyX>2;Dkc91y}K0mZEKlZY#WI2l%mH+{hw&ySkb(3cp0z!6EmlWfc*$q{x67&GM{ZeX^I&L=^uW6O*Imi0%YnUn7(Ru zAr%cf)$CXr(aHeeYI&}guRVifnTlh{|Ch12Mj)G6wtIQz8Lh{zk#fJeAP^#xh-*Zm z+G<_~L?HcL>)9oJy@mQZh5C96_H{cRj9$m9U;@IW9c1P)b;e>YG%dq76Ezoy@D)4_ zn$$iUiu&jA2fmpnI*&qcC+@yyvHs53gL*BD+#f(zva59hKk`YO$;-RoZ+Us(8hm3Y ziC80EgqPMx_*fx*d|Q1CYtuFD+Z(K=V%=HCFY@aL(DBO7NHGtx-Vq>pSrvBwV*W7< zhU^^tHB5EEH_WQA`Y{|{crH7_9|6Q?*@dl01xWzBvim|`HX6f6u0&@|S2TPT-#C_s zYC=QFQy)-eu923C1XRDFLKHdc9xuPkL2A=-i^){1$|DGRUC^O0XXO`Bbe_M}T$|^O_TQoG<}8;wR$54Xh-^nF{7MEi`jchMKpV5q9z`&1Hgdbym&{H8QI=Q-S}{pQin6I!ATJZ4BQL`we=BfrqDf8$zS7cF%5s7BSv@OPA&&qwEPgr)Bd}TR0hgGW z8*o{HeA%VtCu?436@UU@SLO#o#1~Yce~VO}SQF4f0vqFSAUZ%Ss>nn9kGS2oZfH{B zt8YVVnTn$IfC=v*$O=~G_)Nw8r`mZ$b_7puM)?YPF>hUh2d4a2Jp@ALpkPyY5~EiLp!#4_ zToc&rF!@uRAv7-*MO*UcGWTjFsfEzh)(wDtVF1a2w+@=H&XZDYO8qgYciI5nEK`dd zd-yLjyr!#R&8{6YAY$Bllo+$iMcb~|P3S?ya#yoOkF$EaZYZpaFZJ>V{|7M1HixM$ zSKCUk)YA$a*##+e8L(HXF#-qhYj10tA#H_2YO9+DFIM1-Udy8h4O`Mm9ZG4+SOrkJ zHU%V@NGvs;`DbsPN@B2_+xt?oNs!3i7 zyd2;nk3G9Gu`W4qAc>)y$W$qh*G|&1sX3|nz@tf(i8UV@9f5*VzS)uALq~Gq`788P zAx86hbbrq`D-|QC2JQt3csW~f8*3N=?!E297$!W#tO+b9Rmx4Rjc4z%uMt?p(dP6a zt3Z0tFv1!l{zNPVYuNEKCNwI-&#+&x@f|Igus)9RzQ@jT9B7O?ifniZ&t92o+l9eE zScD0WDz4LahJcHV68n0V6(nL{*gP{L$04a8vG#kc;w<|bl@h}JnU(|SUYLV=mASBz zq&%T^2FoWki(E<%A^sc4|4o0V|sUFfpX5XBDLP&pvnuLzGa*J(w# zAC2|BI8h~>36D#jRNIa!5Od$1@3VjACp9BIV=j?e%8d=a9_Bh`K(Zs z4%v3SU?BxKEU!(g*;lN>?i0!^Q5gIZbi9fu_qid~f-4wM66@k6sM{$TvbgN*AzZX+ z58)ytSCG0HZhj-YhIfS3$rwI@8nF?du*UMWS~M*GL8+jlXEJaTwq0q^dNy#h%~xB< zkELUR|I8b=kJ8?Yo^m?0}9&L2k|ObHA_Q`cHrX=m=Bo!M4*c`z>r<8TUCo$EN%6}I%d zju%Lq#hO={JWNg#`S6`ifnafT+?n-ozw2;+$>B5SoZbB;2a(b<;elMJ}(&+DFs0RR$pmwuuTFCT0(6t zv|hIq7-yJ}@hO1i&|h)7-*x&F`i_i4?XAZEep)`=$4|b0x-j|lk8nWHsWWf)LAR1= zXt>21q4ztFVwXxrY)v=8QtCh1e-b5V+ILTkb+H*k-xNYGfh~j&>)`jjr>fa5M_n; z40}r5d~kHUn?r`ZXsnyVIFtICb-fL{llHE;m66n|LlvS>S04IRIwXvSiu4za0m}sCEhB_W6Gh6hvBO% zB#%NgQt^3jBm3Ty)^(xp%5F3j&7FcTm4#R!yMCEJJ-8yBFMoGbg=c3$D%zm=Lnq;5 zqUDQYz*|Tz;|~p?PzFRz=*6g4KRXTVGHd5AzNo1aR~FMD3$?&`DtoI~2ZHEoWclzO z9K3b|#`|p(F)}fG%mva`vF41=wDZ(jzr7fB3P&&l#(!id|CJjoK{k-I@1=pSN9D{0rh-n$r4^|W_%8sBTd$Rohayq9*e>8Nez{j`lmwiR~r zFcKA46j!X6ots!E!#BRu+L&qS(Jd7v_{y4{E7aXO7m&d{8I}fn;Jbo+ePCOvss6u6 zfh7w~r~I=zb{E=I8;%4VZL>#|9aGDyX={;Hmy=FI{ZMZ7#nm1Afl9;Si=^C zbfRE2?KX$Mf>EoJNYmy`WbPz9FW^mLZvFUx6j>+Rq?|;GC1wFCrsN70nsezMG;iWz zBi4sJVz4$HO~XUH2Jcxa5-C>dJr0hMU(gnQ0x$*feznsBn?yZ1u+LN zZmJOdmqGQ;Be-=UP1M4WnK2Tn*mn4felK>lKn$)}U(8=Wf)@QD*5fl5^9L~=DLQ{! zP=OerA^|EQ7Q;AR!dtVqi81~udWZi8!wql1%UE)hg4FEFWpb8MunZ_!f%Q`5#OLcq zRi&Ve-b?_$yN9^o(k0j7eKfGg377F`A}WXsmN zE6}s0G_8YBh6C4J(TF7?$<~^WjpGrz>M%J_#8qMoSzjqI3){C=oBWeOqAlf!zBzN- z7aV2F9k88IB#gF{U<|VC+Qd3&k^tIgs%fGcm#VYN1h5U79&AsSsc0Nd1 zNoJCW?sUAC$u2PXuJVwjB$5UK?%hb=Ey@}(SZ|g#Cf2TlHGZe?Ql`Zf$u7e;Wg;s~ zvJ@t=9MRIomL^%2CR&z?QWsLMqG)a0osO3>!?Wb8U}J3G1fzE_;U%a;a&dXmoxPbB z^lupgMmn+Px2)kTh$Vr0MN{4Ff!ha6fqMm09f*npu=esYEbZvHu?UfU5t;*Q(>hHS zoctUIh2&N95~%?jbMb6w!zIE>%&9i1E_*nx6GLv93Igq!(!D|rbl_~@`=Uu2h1|gN zSYIQ4_;tnlGR#5&R1Om(ZA!H5_>?$1``9Kf(QZXK2lFULS#P#Gu`Z{$lttO{LQ4-C z)^bH9Hwlr-Y>>wzD0#LA+EW6_roj3nlN*f~VI~7s$_sR+O5Vhp4o%mLXtr@E#XRv) zYOslqVxU|6>wq_~NPnw`D#W;NtO>BT>h;B~3-DO~cMAQYvJjPB;SH=Qf(NKM%tfL6 zX=f}M0gzxX)zTJi$zm+Rmwu?7Rvj;LGhM=A)pFwE3LhsOS{RmN&a6(e(g~}C~g5yBUtwUc083UOg#QH-0vE8Ly6OOi2dcFbfKopd9**) zjttM2=pd!~D}!#cB2!4VUa7Oz)%G!nEwh>R;r<-)WZUU-5d&ew-ivN?U!vRG$A;V7 zyTBdDQ3+)MApngl!XDHqTLUP_kUQ3enrEFygDX__B})3cVV3%MSm^8Sd%N%L@MTP3 zz*%{;`Zw1v>FYlE4h7xteUqP}>0_P6S3&)%F35Xb-bq!Az35_D0shPT)X3hzVcc*G;`x0+mvg zeTT;SF!*Dg=?wqAzc2hN7#g6p)XS>bo+82a$SvXm9-aqBbV28@^{uw|Qm4Il-qu?vlLv8vG0 z0W>7LOsLz&j-j@tWQZMNWyzNJSiU3h1BXe;Ph_PVps`rC3RNpdAvqr{{CRd}jkAEP zmJ4JundK(JzBA`Lq|yx&vdSkB5dz*WD9mLgLza$!E1DTNkV5WzLsFqo^DqdlfL=<5 za|0czASz>D<+JGTy#luXT9ot-p;IDu9wX60AE7emQA@j0ayHu|=r*vDVRB|hL!)0z zM0a6D9$@tw$R;wu=h|P3Dyxa^ze~`@j(*N&i)%QrDaBNGlO&6B0y`p=CDqOInZt8g z(STH#EGHmflF!VJgr`ChScSsmy2mJUX?kGMd_kVX7S9K!5Ravi9Wg4! z)O-kdA_v!!YeXtYtT~AGNNA^#zIvn15v{PRD@0&!%yO(!nYstQD!%~TK)=K>egq0K zv+7A6`xGD~ESLgZS=MvN3F=&6gx_^&j0@y19E2SP=ufs$6ebZ^v+D*`43nTSJU_v) zcJgD-5}Q{-p;>^SwdQ321HX{D5}_hgp{j)rbxA57$MeUjg^B8tbXMdDWXGYE&>olz z?~~N!$?B4%@H{j$$yms&<~me&YHJ?4#mA|+iK;stFCffGT8F+ihKO@7v`sVxn8k08 z2{%b0-SVx!nap`qx8F>#dtdqN=vY7*yyS|$A}aAfdM{WU%u|(0yHc61RAzJ*WZ~5m zodt_%xmD&Um4!_Q{PWm>ccKZs>_A&IMtca_L)0Gjgx)-*G!;0<13qER1O>^@SHr}u zNM(_>_hVrB@b)K0@$~2Z?-?hE5(0&ys$?i-WKmQKGLZYsy0j86RI^!a+ z{DHqva)izt5$A}GD*tPl_oL%wGB*GFGQifD(cKKW7^`Lrfmxu`<4dI1H&ZpA>` zoz1V9w12?|@Dy6$Hz*upt~g%&7m&9BnQikr&j%ks&jl~v4`qT6Bx)7K^D7}s@PSP2 zr>N}BFyk^qU^A{9B_sI2ZTQR)l#OC%b0MUmLTGiFo>KOD@crJ^^tTND?l;@9p~*n$ zy}<{nwW=rauXjP`9`Iu^nCRwBn7?^D{YAAzXEUC=p~c#KA3-0~N={aqA3+A4){WBq zIK6wC{ys;4e@lON)8Bpc_YL|RqQ3{}Zx{XTrN77N?^*a8Z02UByjsc z0?(%?Zz1yHGk$}|DB)*;$R}euo*k-E3hex!&(ozP@WRT^J&&qezM)@L+XiB!j=IUb zOiPE6dL81u&tvn4p&4Fv3hnVqL1Hm)eivl3VxL-C{hdcdyGLn0N&P!by_uf$zn$P7 z;G5nYJM%f<;SWDKs`9^|#!zY&3cI`|$7e3BPR4rq!>?2PVx@V&OfeXI|KU*hHRDzG zhF>W5cuK2pfC_?CuGqtuzDuEUpoY|cTSJI{_{LZbp+Qm_ck;DQ65jPz|1)ory_&-x zcFwonCkF8p{R^G&y>|%~Z9`6o;;`?I2|+6AYMZ5^pwr!fl#3;)^MaVB@URG+%#3)RVL1^%3G zR4wK^0L;#mmjiFntJY`o`+cM%TigDxEuNS>vBj>*MvMC=8!ax>TAaZw%(@#RMKC-v zG(>)=jvI^Y_3 zEXD_rBKssjNniXzM@bqg>V(aP>pUqQ`o9-9E>O%P4`Toekw1ww1^3>jLHFs<7J`nW zlg(|2P7u>@yc8Ia6rwARN;kE>jF(gP6@|P+#g~hC5j``wi=G07v}k!2ut7X_l&Ady zgIP=(oc|g{JDCv5;)x#`p)BlP?r0egWpTb*4`t!tebA~ANTt0iZekb<1Vc@oao7yL zfA-S%7>DJ=gyK8D@tPL!gthyV=JA*xM)6|jp_Eo0scr6d|$ zBL*Z@sTkg}h+W}4n(a;9dVN4bt1j?U!p%x^4K?wZ5Y73G@Kk;qC!#Y5gwp5XmRHTkk6(^#wy z_6`~lWgGI(F-nfe;E#aeO$20za|QUFi*dPu5*FgiLcu6#)*_T> zYg2-*5!k51_fQy)(|qj)z<{pPs7nvJPLp;$+~7P#?(){h(XM7z?Q8`GCt%jbz-!1O zpb>aQ3jE~qXD0G-Uy+Ofs)iAicpL+_1y?vo-wz!@gTX6f@(|I_=VeLl345aa^#8x$cm3F%A(56RXlCX=BeMTgyC zKIxLC-g^|9@|L~@z1tpq2$`P!kPNX-*eMGnSlPCngDEBx1)(zCN6j=R;r$8>(y!uz z4o_yw1r(YR@xX-q<+^r5Wyg;kCx&3l4VOeu`^5dem2u!Yd^s{H;HZ zs^RGbg{&GJ1l@f{w3w*cD4=RQG4V8Wr?BnV<#}yVn}51mXNTUs2(&yo1YM;Gu8fg$C%6lx!mSuU^97Z9P2WTlf=L)#ESW{Y3I<arGT1b$tBib2~8yoWBeFv;9Ka23`o&} zs>zVt!zxDB!Rxgzp|f##D(-}VuVBAy6jXaTo;jC?Cb$yVVZQs2Iy%pz9YP+?u1(+i zLzbV+gxzFw@vlVnQ#8A9)7AneM*^WNjCS+G<*!GYK4J+8SS_`ZiBpd!XDOx9n z1td=_iq5|7Eb;B$os!{Au5<1if4Pw)iq45u16FsJR) zSX2qJd;vG0uulEPQR{{fRY6Hj%js~nX&uUj!V+ddxV z53!pIgBVa07XjYreZV7t|NI5YXn1WW>|kawQ%JGcKu8>mXuLAmh|*NxZQLUErE)B< zHEUG>W`77pA4KjkIk@_*>PskVXgU|-x|uA7twHw)yV1khTd+=HbwtKFBY0~ME(wKLc+%pmtLTdRB7&JbYpihSFrrw~X}> zWO9<-n=_#8WL!71F`h`EO#mVVnH^p}Wj}ELUzInVk_XsTC}bFd>M_<8%pF0)_q;Cu zEOs{(fe&`!%$4WoMW`%00-xj)L!71T!+Q2acDEI?507QHQ*N&AC6d?!Br%5X1cVZN zid@dFhP@g;i)O7()Yb_la1dU8$D6Q1kTdOL@o3jn?V41CM)OmAKQd)VF6RNclxJsE zE|X`m3oz$D`7#QauDQ|ZF02u=Ur0UQTT3bc`{aLeT^SIL?M+5U}A{a?AIvLLL^((eX!iF3EY!p z+ByfS!14#77+LE?_}^;c4{OCmDtlHU6^jWA5U|@cg{(H?}T18sAIwIdA8mdblWlJ z)N`NUmj;sIp9#PAeL^vnGLk0VvhKjak2i@zjj`f$+ z;n&K|#5(TQ(g_6;m4IpvQ#H&*(RC!~<9+MM6rc^do!^80YdIn^7xyE7`eKmyQ;ct= zR7Cj3Lz-vY5f5)eWqlEP2%vwvzKGGlSW)QDEA-DVl-JT)t~S=PRa?uGK>otO6z?#% zfS00v8hh-+Nl6ceuh&aJe7VWwY@I{+C)nmhMlRnsH)+3Nc;$iO9wx9pT85a0bf$TH<@lM$M$+dqjH&!ov%4)mtj!+-oRMh<_5Ll!*{*dz)r zcK%^p%0Q87E~4*E*Rxm&UyCd;)rY7DqtUhitI!5{pFyB<6*kN(p-1h8P$1t&jukpK zn;yc0fRQl_CZ|;IMs92UtrHpjSvr${_5z}!@MMj>{?6AXj6`O>PjlR`?>mn5Z@o{` zYz(2(y}uBnoR#ei`E9Vto{vFvVQcC)kuQ5seldUKN~{sE@YVe7j!`vDQxukPsiPJn zjN=)k4wq;OTb!rzgQS;ahftCwkN#==Q7EG;7av3AqM=qC8&*^smLiMt97K|;CkLdI z9xniR$vM==BDIDZXXV3)JSQLlNs(~duvP5k-V$)>SmbI9HV_h%9r;J3a!ss`^T zjW8ZCp&5$rbdv!KUVHa|z^ZdEhL;C=LC(mNN~~KiV+A>-Ue78Xz@R=y0gFy4#Zc+& z&?>(1YcjCu$dlrNo>O-tt>HIe-OE$ffh5Y>(zL4*=Cv8err2YsHf9AWt61iP6h2c^ zB(o094H*RSV4nGB7w$=CxhYI|FtCrrUH_--zyunA6=|KE#tJrJA151qv{Dy)R`KXX zRn_P}%XJV*!cP*+MP&f&j|WZUYGqKCU}JQ`7w-+`4PSWg%A@mo9V*AwU25z zW^D3T>KwE*+wUt4Zl2@pZu=tEC#+$e6I4y}Z^q`PI*+1V1#jPqg%)S9lYkK^e$~Ty z(mOR@Vpt#7NZQ4q(9-rvOevaOGPY|v&tbGOxkl)8mY~d@s1P!I)Y%;AD}R}nS8Lj* zj!TtYFJ@y8dO@ft5lLt(5HS#!(3&e9s`)bQtDx{i+s83pZ1at6=s+d%?bN1-Z5D_+ z)6W`F!X&>_UeX2< zzTMfqCb-eeI+Xg<3m?E}$4=*2-X1%gw=avZZ5Ksr^e2*vwfeK~i*|3YOi(g>_F^vX z#@(0hBzH@npj0MJbUUlhLbtONH2kGc0Iw%-GDhl6NA;mstxw^Btr%{^_?^sa@ppXS zU@~II6r~yQzgU*R&L|aUm5P(xfx~ePpw|3awjxQbPq!T5cvCU{kOz z4BVIE>TUZxR;lP>tIdKl1jsiB2=lRlNy5ua=D@qgLG6m`IBB(D-fDCmIdc0Lo$W}_ zH3XaVH1Gu5k$9e@9~$N7f837yb{|a5F?L9!_wHjKv!dQfnGXViXN%2NRuq9B`OFNn z0E~JUkVCBn;IN*69>DxmhY)i*7t`nK)#GK_(ajL3<%W~UVMM|LdQMii5Gflm^Vsp+ z7RY_MDo0>eRQWK9&dqP4e>2_kgi+nJY-k$w=QH_uAY^AS9Uz?^#tBp^4$@FVtS9I? z2%`&m_=#;WE_jy@JqD^Fzsnll!0!PQhSB8!Q4A^82a%yE>cs@kB6N5kS?Tdh@f%j6 z()PTqsR%Y$F`5eSg4$xV9b{^W)%^GWphO108X#>S#*)&SwNKc|A1#DhU>_IU2K(5? z3U2EZa0X1ck8Bh0R@ws`UT14fD9#Of1 zSf*0GwGYkU!e+a@!<}Ic7Xmn3q!bOH`%lpjlwRap#6Qf{ON;szfeJv*7y$ORlrQQ- zU0oK`vRJDn2K{dE^Mw=82nlRV!C7Qk4)Ix^5JS3thi3X?=gzw`1bJ?0(CrBHpnf82 zg*=tbP*){^2<+wmL?an$0-TyR6$WTN3bg-g<_vVqfvpJLNNhTaVt|P1mL&pn?3?F! z4FmddyvDC`o$aTgwT2$O#Ljjg8par;$^J>GZ7vbZ!|SDRQM2T^c_@-RO615fHK4e(n>vsWg{cHr-& zTsz7{Rw>uvw>XdHX~Gb?-@uFqT~WMrVE0$R|G6_@eMC9Nds5|*){{JAIYx!mg{?7* z07_=8w??zSL@W!b6EUHlk51)g{n)0Q|P^&!m1_tNGq!E?dK{^xYZIG<|EXrX1K{N}}@n40964if5wuqrVxY%a)_r^&n%?R|I^Mv>T93 z@K(GZdLY(kTkoA|IC4B0`zQi@otCQ(a16A36t{$^go6!kD4A{Bsg(%(0-y*q^ul+gXnvRgP6Uh9|rF3WPCS7$N*pGP3yfw2J z1Pt7fe+J-oHj};04ul2P%eoRkrh3UH9gx4QTzlaF?1VWo3bf&mQAfCL@EQ=QNvp(t zLo}5$T0P5l9+hoCuquCy)*V?`a4Kwbo(k^5rt&oz&4*@^YX&u9uXZ)Pb!*!j+i<%%Lz>hCeHq38MPCqi zSBjTr&u8x{uxz2yY0$4o<+!oeN<1hX7cC8L6#&`Buz&E!U~p2WKZ~c|DU^2RjK0&hi<(_MmW5Lm{OpB=(^++ z+IZ|lHn;2BS}+2EI(I%7u=12(uEW_)R@z*Qd~F;Ew*vAa&G*;AUE9qhs%8~PU&|T6 zUFfS5$TDr6$B%tVpCx7cre!91Hhh)tyXdQ24j*7~9C8%RcEs$4oo)6LKn;h^>c+4B z&7^>z&;uKMbf6s+8Q0 zhMA-|;tM~8t?3p#r5YX$Ph}M9M_02uv~{G-k*?gwS#m(dsN>ew-Z>x#_apOCicF|A zxC<2)fo{w#qFYLEm#&_`7Bm@mtYguM9qVOoN83QG)C)pAB6;grx29;_ilc7XD|OEs zvOXbpDIQaOcs13>m;UP}=rF846B?ijV5b%Ti;_e>Vc4PIn{S;)nhy0PO>4dnFV`BE zjh8A}`MKo2)5sXtrK;;eL6N6&HDB1FKwl4M9*SF5Auu9%VTjCdl z2LEP4twR=bXO>FuY?+q!4%^Z)vdNmqwh2q+uc4kr53+bX8jr5ELF?ndIN;VsCt25s zw}?$8POGK_2q zY%02cTn3NHbQ1?GG|I{d2u{sSa*5ao}H7nLQ8>y?(Oqf#^16!>zveg@8q*Pmo z_r_LP@%`kdM-BE-=k?mw!`9lE=;6SItGcC~-*Z}HyY+Jhq)#duK@Sl<>Og}vpqgvZ zLjxT|1~Dj#^E{r?_=yRx+W|J{5VN4H3s{iv0b;@|>`*aCX+B2zy9`$zly7 zXa??dMK#x(A^s+eVP^<9zu)1Nt$Mi?RH)}=GQk{y_P6iD$RZ}dK`pz9x$y4SFAwYD zKm8r4&D_!j+YXHSp+}X#bE4!?LTYfpz0J8}=R_kq4)*XjWI(WlWU7&K2tI}Dq?m8R z367Mr6XkdZySfe5%H>jr|FSXqj*tYP?4LWkgXCjMkS?dg}$Sm+G3dxI|_E%@ILjNq8~ zPd`N06%cM_K-CZ24wSPKk3sN?+mW*k$FT=+I++<-RFjQD>y1JV$hk%<1dIw#g(MUq zEegzWSH<8b@0oNg4{H#EO}Ru}iOEinjWjEX1P*|$nv}HfV039iSrqFKp zQ??5oqMfH$Z`z~e4!sNivRxtk+m&{I7s2rFzf_t1B+4mU?+Q}fyJF~>{jf>%e_Fy; zh|sZ8J1ej%E9}@Shf?6Uq>3J@gnt^L!?!bmnBNqT-s zp16c)X&nEi0ab9KAgoAST8;Nzs!VS9moO|L6PuZA=_>< z)DVt?RI6(=doT7`w!)NowW8aWvjo<5;UwTCi_~WOX$W5BXxaQS$Ut|q9z3@t58-*3 zV<0g35@=trjbhMs*2CYln26vWs z8Id|_C#OZcd==Chj^z)JQrslttP*P^bDMHl>j83gThiJB(G9g$-(=^}@(bqzq1f>4 zx1_`STCt5=0wG)2drKK`p^zh1&#@?+f6M7u08MV=F|p(+x4^sq;3Sk!YNz@vlr1(5 z3WaCg^0W;yCg?y*M>zf+9xEo}jTA4s#4!|^Q_QYHJnRA2Vsx2xc&lr%ii0I%TwjhvB&y0YJ9nW^6`{If z49Kyo%#375AuyxA62bf;)85g&)_SYSP=s|!_v4Ft0h`c@WK&jIU~LrFkls_vXl*5Q z;9oVaLC66~zPG8}pHN)Nb1%}3SiKhxz>8!#)u6X1*S`nUf7foaPW^LP9J!1F&R85? zv>+6|InbkO?^zFKSOOVPa{%vyyRa?NQ(ovKtwchTdJj(K$`dMV+;O%IM^*iO36*Fw=5P&Axuh}sw0a3p@a&xBr0nyiD7+4&XUpWvTdB6|0u z8v%=Pn&)-QH)~I4jACYaBJ#0$0`jSORwdVJ6slrHQ(up4GnuMbTh+V+RWK9R_q)WE zEBljDxP3OxSE1ig=(iU7W8n)|wEJShF+QQJqJ19&(aqi)#Dlhr@3m?#2ZFg!E2bOY7oqpTMw1!y;vTvsr2%g) zlF@zos63Omw~iXu%eM`Ts^rXB(GII0M9mK{hGlN0Z%x`eYi)al$yHKk&6Fysy&lAg zWZPa0lpVpFt^u5Y;5Y(@0&Ou>cm%adiuk*1d%G%adpp*pwXKDLn)H)l7~KMQkj};c zuY&4XJ3lcW7?uh&0LC-A!ukq+^>_!9p@Zm)x^0jlR&zy40~ANcBL3--9@!Qu#O7FVxhm<_M#+})?10!hOb*YesTB#L?XuZ-iNo}J2h6GR>gjK8}xm9 zPt5jDM)!O-EL8pZyO&ofzeI1BzW>I*e;xvMyze9Br+2}RpZCAH9v&S{h-^$hZw-DA zp1tq)UhHjaZA-DeYug`cd|yBf`Foa=fp)t(@BczGecf6+eIMy?0Q@&K{88^ed;ik< z7ihS3U_vi?&-R|3eDGiU!f|u;b@!ia=X(+HpU1=BeV@0}gSVf0^ZQWgssF~m=jr~L z9KWdbA--LEnoq}`g?_g8b^p7}ll08tcs=)-wtrh`^8fqd*tJvF_d=W7-=xXdX1tu- z-9EY7AJaFWe^Okt2L~|P1jgi#Fjo@Zb}?xT++Pt@Fl;agcn-yd)}0{8;6($Tm8260=A-_rLZv3q>2;J?05-^l6r`?~uE`XYV&Ok3YS`}^A2>J*{z0}MYA zczauwvN|QM@2-@%b`b6WDa7qVuDus&0Xwv#SCF$^Pj-|N8(Xto!hcCm#g9Vof{c3=E0=jufat2prUE4Lkl7=D$U2 zt8%R3>##m~u2FF!RUG*GDt|m@R6GCCcq9F>=`aB>b1-8ti|?PlDhYl=*(dj*v8lH6 z^pr&a2*1@IoAQl}4kIHTg{yn=^ps4@_^AH9QKNel>0sd^3!t=Ihiz{;ppisN8=$Hy zQD)m{l}2kOu|m;uM7mfrIWG`Om5!lt3`y0c-xuohjaIM!XpX)5X@9(Z!!tPH9+(Vh zfMRjXcSW6l@qiq@;aPm8+|EI!!xRePcD{v>rvOavYUmd-cy^EWW|fMJ3C2CYndPLk z@i`ZI0|RC#3{#}CqR0ki3RY9DvpE=O&gATF%mQ>AvOUtq+S(blh1t>U{>=ho{fBm6 zD_R2tDqHjm=>JR;;|w)sdtAsxzn);mmn#!(kA#dncAp&vS+2rR0HE_BMmNBSz_G`t zB?GJE;d>UKve<2xVo&OjXEcaIiao7E9?&3(QtW^ZY0w}^QtVkBa;FAKmSVXMDc2w= zQtXfpDbOHUQmpAR4YE*!ERtdc9WqaY;L*^O89MDZS!qDVGF^^H6;o9)J@ja^iVM)r3>M+dKf<>*86bo;JR zveJumEDM-$fuF-SQII>!n^bv{m;V?W3!e%6mnraPQVZF3-V;MPJ0T|sxaH(s z%iWN#l;=?Hov!l*Lr-jr~rrtKNv4?oyWJ@052N{r+IuO26*8(INjs(8sOQNRDZq4S8BWw z#tVGg<6C8bKRY)DzQN-wHozyw!C5%Tz8LELTjwTLzsLiVj0Ivm{MX|Ja*TNf@crZ9 z#l}1XxPBa5XiO!5*I!coGGjL3jho&$5<2|X!jdfJ-$N%4{_PvcmCM7gp+wZflWw5X zM}y7i`cpE@E(_aQV-{s>u`kNrW=+p%iOJi3vq>HbU%g0@huN2{ZgWdqu+F^wJ0|(7 z@L7;VX)XI4?(78SQ>q%#zEhLO%x+?g0^RsV!LoQrTkPIm{szW}~AemC^hz>b+ z{lDOW5a0p4w=<7&(~#d@0}VSv9;ifLc0Hd@T#%U_s7HVE zr_YTAc@6gZ$MDqxMNzdJe>|3st&gna_ovgcEH4k&Vk9kNG5!b^;~nFR5d-7NBE{;< zQOvYl;#u*Q|81?n0$Bic>uct}(l1#no3~uDP++A$_RW>v3=KYmA54jR2GSNgRiA$CNHLE62Fz6Sv;Sfi@21A^PZ#DEU*IuI3^=%eaZ2xAEw8_*~B;^xVKXJ*)WuJ@4Wt>A8{j($mko=(&l9 z=(&aOyH4xEtGFlm?-BYceTSzgi5_J95lY^NNrjRRVsa}bAHifTB_GFRH6_uRn^#cs zX-ux7;O|rNBqmQ#@-!w7QE~v2AxfUb)Q__LSd6Z1VWFjTeQ-)8WWHKgW zD4BxE3#ph)#pDnrQ9H=rrzBb4PEZnUbNmn`voIN=Bpzwxf1)ILcKx1`i1+wYsd|?S z@z+E20$u6(E=r=Fjc=wTDzf-SN}~RX-%d$%+vIB~xgL`%sJwR@tD}^?_(B&54AY8iB~9&<*nuWI2-Kwx9*##F+h}-{Y#>TAb~{)g zczpAVgRUr$0K~1WgBW5Jknu|20t6$hZV>Tpu)yl^ISttN2Wk2cZ1?yw4e+gcR$$*2 z8nBym81Qa48nAf)EA`z}3~&u_*`SWRg9X5^U1#L`2iM91vzBJSKG9*osihmRV>%4j ztLqKeTYRiaAQRsAh~@K8$(aEzYSy58ekZoq!7!!~$)D-2k(4y*R~vJ6=5c$If~eAx#0Ha+V`kMCv! zR;a`L9-m~uGIiJ{k8hCyOCGOsi^q410iL8~ZQgD|iQzj2_{)zq@J<4M*8rc=!7T*N zDfXFz$XOoz*r>btK6;aD6!^Vf;6VcC8Q_O?@FN7yH^5tT@Z$tdHNdxzSN{uobFJ~_ zR=vQ}1fDZCejWTAfs+mJRXP}{g{RtLhyAI)v5dDsqEq!G<0bI>AAh73+efw0?j`<5 z2fsn!1qOJZ4h|96X@H;kXsm^U^d{4I)2tWhBJe^3yio@qCh(00xLgOnLg1SWaNc`~$5(CV{_WfZx@@Sp@#B0S@WlMFh?BXF_-j?ux$W=ud0@P@yywa_ua zs91s?^xmeU@|31-c}jMXRi5h%g}>d@?VrV5R^TlzgLgv9wD2I4@qGWx4zr0T-#x1O zW~@^(_?*sB^l7YUFUDhkQ4ClV%oV@VRnlp9|Iz;@LQJ3 z5vVh!hRCWLUda&*>3W(g~FC(JGu1z zpcJ}tW%fc50RCcrV-FeAmufjcR?Z>I)XgZRneYe+i-!MeCI24}B&E)}SuAe*qO4ow zX{9ROPv6`_8gLk^Ezlw0O;GYNy3ewm#pPH!!~f&6R&W1kj-4-TLk8%q32%-;A?c?f zwBYm0HjdeY>>Vi8h8Ml1ZZnyHL)&o#IW(yguQ~Fc@Wpep54wO%l$Yb>G3BU0JFDwA z=_DiT;Fq^yxGVWAWM6bAdJqw7HXak1X)zx`YDO1)yc|Kr2)|K&-)rzOP6iIzn@-7i zViif!))l@1=h3nYUj?EuHTgm7mBCz5YOBi*3KgigzQrV%O!b%Z$v#zO!!UDQopFZ& zPlqq}@IPKl947$x082o$zjVg+_roN0h zscrAgw!Kr+dgSS8U!nnSYT!T&!K^dVdiMXPY3f4Xh&0?*|) zTuV@G|A(Q8Sgh27D8SaV8Lb3Ri4A(-JnHjQDXViw%fe4;?Y?{$P5v%TX%CZU+bdQ< zf3KT3dzaz7z2i?DpSB20nwC>OJuc%k4(&Eg3^0!0GT7vS4){tujmt$6N`Lbzicx{6 zdFyrBJ0Nt=kE%Hy{a0|82ldw_z!YkWQi~-)(Zqj{pe<-;$be;De!_@ zL>|Cz!vyrlA9vm@#>+yWN;It-(;Pw#eZQX20JJz>_tj%{uY6sr`@kzyH`F9dtclhw z%p{psYfUfV_OW6t(9K>`YSqiktfZ~7jp)G2;(i)vU}88fxq#0 zRedWaf({ILm>;=es8@T>^6hj~x-%9dk$SxRM@D6upR7@hlh^%St3bZ4@m3L?K)w9= z=kRlTg8}11w~go@+V38m54|{_FUH7HV6)ZapRLwf$1D5RUvz3B#|3T`W5RnNr&*rn zj*Z7f5Gy_*U)&1KF+qCJ7^~C#!OUihu>Fr&+G9twwbl5cyZ6zR0Mt?;;EDH z+VNKRoY9A{2!?=*!Kr3%w)>aiFEbjx{*2Abv%UQAv)>rmC;u>(@H*&I8;>CqT_r5% zbN`4IBf5TWrP8Q*JV1{xj;(w9R z_a3an7eKAxAOGimZ9g;)4PUwu5r^{`hhSxF3ht(ru^i^ZI=(VuXl2lJl=7!vHl`zP zu3O9r=W1C!u&962ug}HRrTomVaI~f48}{PY#%SjTV7KGNn)--gz?Haxe-&>G*x15L z_m6L3K(D1lJ62XZ9>TykgBP{d{5jQ01URV!0%Thz;^VDM-Ky49&v_(PoZD}go!`*G_D)~`bvs< zdsJUFwx;_C$COs%IxOb1b{kXtV?aDl;lvbc!c8@zFb|KuXk;kzRYLwwO=Txf1-X+a z=)e4lC}mJFUp#!Iu`;uKlYMqw)bsK`5NfgG){k-Ory9oS%&-6a@As7!?0~{>+EhhP8HIIZ%TbE<#$CeWo_ z*hh7G4xSN$J#*e9$asyq&inEAf$RQ%czYZ8D5|Srd^S7DPLhRPAYg<5QKF^=Yh;5a zZjgkqn;<0F5VK2!5Ni?R;?p9`5YT*f63B47NY%E|r>$14^=WI1r7FHE-6b}gfDeRV zH8IdeMZ9rQ!-vU&N#=jfo!L!L`@H?X@9+2elg-SX`+e{Eyyu>yZB~H(v%mTpf$fDP zRH}}Xz$E!To@1nToEGljkQN%M_x_bpLan)B6C<&c;4f0x*ddb%n!W*@g0aTwz3p1( znO=X>uO<@O9jJfN>No2duGQPv9l%jN|F1{I=$=v-$gr+9TmKfMqkjDQ~r$TeF=uC3e&>@2~%}pQE$*dqB zHYis?USgU+XVH9x(OHeIL6Y;4RH6?4|K;6u%oGEKL^N4%zuu$(fyR7W3ev z_zS&1nI5kpbglfbm6NjASQd`gV2;!<#{=-35EB(Vp+cBoxq-(pP~QkNiG~S4^Dh>? zr!BhZ|J^pe=;&e#7Tx*{i~fz{)}Z|E@otyDqjx(2hdg0`3)uh{jOUym$(f7;{FWgy zKn)-8Y&pI*viy;7&yi_Ysb+pg2>G(ADOCQ5`ExmGs`(arnq z2)WJ+TuH7OrJj(JQR=^Il=|odN{uk>-(YV|gC@mEAf3qJq|Ki*d)tV^MnGmshu9r4 z62|&R$Wd3*`zkDAHB4n{Qzwe+rB^hxz%Gr5X>uK7MA?B3eI4kg_6W?_$-O!=b^=<8 z-qgW!9$U9(sZDJe+E!fF(k&MH_*?hRKZFsKh2vjtJYrUg%xb0qq)at~-ubqQ&WkEQ zteQ$Nx|><{^TrMgI3a`*w#WLms3D{8VS|0F{x55o`vuG6{)kyY@9&`;lNYKa0eVFMUg88lZn8;e(kB-yg+2eJWwRmh5 z(xzXVp{g>dit#FcW3nFZ<|0;ns;zUp0(6BIn#&$f<6{!bG6gf3S?UyI3q#X_4mJXH zdJZh17UvopvoycQX-?IAI}j6Sw_x4$w$X7G2bJ~_7UvJ#IE(WX_f-}LV*q*$7$bRl zmbQ5th=XbzkGEW7{W0t{o%tN{dS`J|eWDvbF}*B)QbA}Wi*cjDS71*V!-G}63-x3G zv%|PR7h`i!$@6ZMT_HFCkXS}vpUAF6p?&GdXoTOy%bJ(Qq)GJHT2!IMLxrKNmdOB4lWaTxgTJL{ybWUKJjPNyXo|>F=iragzf6{ z?HNU{0ZL03PN&1n)Mj-_O3UCVGb`*--Z%|UO3NSEbSuB4?9I=9PqN>)*zZ2}dw~7E z4!`sj5L=c*P`g9L6MnFgNf) zoH2`x>8fELrc>dEG=81?1aqYb6_;}082!->Z@Z@2 z{7Op?cBez}^|Q`)u;1t5xAiBVv){kKF9yMzgXP&o%Y-@+F14XkXVKi=~4>seWlPJ#+cB5V=^l-HV*!@#fq9x9TLgdO$MgLIQx}08^D7u?~F3 z{-!b?xLWyLT+S_03VDOo)nLd3I0ynIf^sl31L&qT$2Q^n!pQdz)duJhver54EzQ3J zsV(PzOY_tC_Xn2dpW|Q2()=j?-DYXtg@0FDnty20CI+_yyT-#7)YpRG=(4QY}q2vT3d?MXYKJn>;)00-?d`ff4vfTU zJ14x}^2mQ15LcEW%M~uOJn|`Q1hH18d7>3|k{kXBg@u-uWRPDP52Xg#zJwB-1}=oH zi0`F~*p(x>uOj!SZw}v^quQ=n2x&o<4_f605DN{rWx)DaT7Jbv)=J-zJ}&YRXxfAi zkRCWOIWIZn5dmv|R-wtt?}Z<-ma>M6^H1};^12Z38$52tUhooVI+T)me(B=@2 z*b#TwP+O`PyFoF9VieQ(zy}_}$vcv(Riag&z!nz)N;1P=EB0_VWF{6lC}>UChM#{$q7*lt#9jPI6gq#E*Sa0Aa z3?*o_Fd0W1i3wY5X&jB99#Sx(v^0-KVNiVu_c?%w`qD}5{Y~}}OSoO?qV#Lg5o95{ zdhQ}$%5SDLeT*1XyheTl^K(+NUXfc}lsO@9MMdKq*vtE*looYjri?2y-F~B`1r4EK zC189`9XjyzM;i*Rl-CqWk?9so^FK$}er^6Kt}QiMS~jA-TvJ0vEhGeo!9yf>%9jSHHM67pxn~EJ=WH}G?XNN zIDBAyx7oYuV@MYXBnG88mL%S)cV}WdP)>bGE6|MK&T55j5mp%#{%I&( z?o>6FEHv+%2IQu9u#Q3*Oa@kX9*jr)`qT__tVdcl!f*jB>U0;4;h0^uh8`lHkzVey zeueXEF=Ln%Mw_ANOyJVQ>C{;oJhzlY%8>+nrGI~`hT1~|j`#^O!t9sIV*BxYBU z&?=}gmX`w|47;<+a?tOh8{gKB;P8H~!zv3ZUJkOVTvU2(8LFS-0VW=K`C=BtM3eO7 zC8`M2rQzeMr~)9FIV6r#9LYlk(7IJ_5I8A;6frLahETD5Jy%95K?JJLC5|Kz>4g;@ z%gdaLE=MNSk%UnN9Dgx9{TCu=C|fO#bl8 zordg5nL9vidEBobabru^pO!vpDjpj%J%NadKM>{{B5#7~Zc>pA*gA#&xg>J#`Xb0= zq1A{`iw0@V@F+&;whd+PLq(!=&j#qut13Khum`r<(bXl?pXhOy(Ufm#@^p0xuI{&S zbt~bKWL$Ze-oCDisg$8;9L5fAHEP}I)gniSj{AztiexTzd(c|0D5=zqu{yNV{SM$g ztl5%T`ngu-H;NGYwdQ$C4nHI{Pwb8_UF%M7F&^yVzlFbHkU#0^ps>0U6`b&fL z3)K>S+f-uNwQSMFRs%6vUKVnJS3z-k(M6AorW|K?2bc`n?zBsTwMSvQ2%))h0Y3&0 z+Y*RngJO_PF(I?%6+e`i{U8c&+`QF@Zg0F=0~@drH(=c$Dw84G=I=Dt8#pnYG>D;_BPDDqiv#Nz zEbw5dO?oLjh@q=i!gf5S1ICpQ5v&@>9N(3ZEg9ApA$nv+>IAm!w7s~E?Zw1d_N1j5BU9LhoL}o>QnY1D^J>pDKc#WnjmXOIq|M2(O&(vS7shLQI{E9nC{ht@q{-fxiq^`Dt#w~0 zMT4Ph%Dl1YXOZEOJ(s_NOGM_DSuh5&O*?g5^l1*bcPsAk7*^r$q zra&gew1KooG0eBAhG8}+$)vyxcqvBi|6J}cCi69jkv2H|1roe(@!#sHjr(ukI*=er3LT3xxbnNP<8@vfOOJKq2Pmia4%1L^+pkKe;nNi= z<)_MXWHJe$0{H#8<9hAJ^#VVJ)?RU(<^oxZG=ZK?B`f{t#~MMDVv!@C z?^dN$)}dt9rxBelt=`M57|0+UxiG4t7yb6gc@Lfj2$B5EaI=e{(q!%H1mdPSLb2)~ zljPP+0MVRu6uy*c1pO>Mcvj;+yR%(_G{dbIM(+<8tiEdi!xu*Urqr1MP-fCkmPO%` z{ygG0R>e>e*KM75Q;(pM2z z+A5mFCS0gQUl!!fG^-NBJU+14Ssmy^`UAnXRtQQy zuWU4zm%3J0R937x#B*v_n^&l&2%eul#_Taj5P*OT%V*{W&cqor85r35veyaH&E5q1 zZVqgDSW$eRURI6nxO`4C@P^q;cu<`}1mckTv%2Ju=LSBG0F>-E8-sxIaxuo5KbOAo z7(!y509Bt^j8@g&>nA)*iA7pr4_jnB)f_6|4bmFMF=RsPV|J)Zcc#x0 zXTUCE!z+N{d90jrN{{#3z^=l8JPhRQ8a%erO_= z4NxohK|AD@Eh-tFpUL_b7>grqf&N${nx4asks9&`P!;UW^`_F#mT7VVAWndadlfS) zBFEx!T)0}VLoko$66APQ{;t5ufm|pQ>LV8dXJVmd(vGWp^a>=`zD(c^Zi;GQ zoZvWZ+P`A{p7f}0{+>t|=ji6|K(5^$p#FE;Sx>gCCSfudP-C^dL(Fer?L*5Z!@Mk( zb0(|et@7fGhE%ITnrrKv9}umm-j}A8dM}2AQtuZbW2tvYo&Gjj-terfY>q?2{TbAe z8$DEvgGUg{0pnIhjbQP(aymV`gngmO(afQxEuGu0*N-jdeEryR2uCi)5?%lXGP=FBCCM?V(rx-EQ5uux$OD{cT`mgCrD<*) zs2d0B9v>(xr(^;uUk3wSJKp&0CDDPdiS%Fsg^~kieH6xkzT-5}=huz%Fm&pelt3$< z17x5 z#^VW!x;bXJmju?VtLoHf*@7z%g^S+SZo2~M1BM1DKJbC`W8frwj<-QvL}OK;@>JuM z>;DLQvj<5kY-Y3OotikC+Ps6iS=EvV6JtZGF1 z55(l8t~)~)!N|NUJT*bGPQTKo2Y9I-?XX&)D_PfiY<;dW_;0*xAHIN2La`?xJe_|U z`q?4BnNA#MpU3`OGKf>;OEHoK`jhayK?*<5db6gn?lkL7f222UT5p~`8STwPuHdzZ z$QxZRdGUf;*m{;9B3l6ctEsWPTy7?Z0v`y8T^lUlfA73yQy*uU(f2B#Hg4WA*j*?3 z=U=jQU$FeZvcd9s_Xdl29R3~IV0riOybdWD{&vpmu)Gm423tBUjxH!52d$y5GWgIt zujlytHvjys;UG38PPe>lu^+Z9gB)UNftDzRpi76K zz73Y!zE?1q>sx6Vv@8uspF#x(24Sv3kFR~}`N48y(h=Z0Ml^C-Lp4Ou31Mg&rQa75dMq&!J;s{0W7 zlAA%_u}9d^zyBE7QKkn$W1g+20UX-nxR%a(-3MZBw!>T#PoK53+YoQH$7PiH))`0} z$i5CPZVmPHj$UyW#IR>fMfmZ!%WbOdQ)CJg{dLm|9LV<#_YA)$_izd%D)0&) zQ{ZD#0enjy|CR#Zk`w(>I`CP^Sb?p3_#Ej$P7(eB<2$?_(mO~y{xu#C6~H&lc_;9n zkmq>lc<=E~j`t+?Nf$9cDVXUxF=zVusofklm_^ce;k*X3$_h&^w}Ponk;7Uuj2x~#tLYUtBBMM6I|zT!LO;vCfmnNk2B1>-Uv zwOW;Wvr-SgNlJaHQlA!d;>B7{sb8SfXDIcVN`016pR3d_Yjv(v>PD1$7o7pDq*A}$ zw;RBn3pz34l^S%Sqee*Hq|}RElTyD;sjsD}kmTEq=J71FSP7nw6sKSuGTP{4&(K{L zi-_j(^2~R7?_|dDtw?53O3`uZ1`E2K5$G*I>?&9sX!H(~4sYmHCKXd5xs3G65A$68 zbtE59X%^t(nQrw~Qp3}+)1#_~o?I5kkul~ggRZMmw+Qqwq*SbF3mTGO7Bt`ek6>5n zi`eT|aB$EcTsdt00Mt?uG-2KpMxn}tjqZmhWF~|bp{ZOtsoBa+niuv&K2l-$9>?>YLUqaRBQR-g?!ib*n)hjc~ zXH%I|U38`GGd~akmpq35Pke@O5QT!%vBtN zEI31A#8;D-U%k}WV|S<5o*V7=~)B^rW-7|;_gh@Z+TUYQ!2fquv^ril^*U*Opak1igAPHWX; z-6cGI7Gxzn;y6apV=kt=zIaTHh8$u}^SeDuea=lRUQC_fTUSk{p_LJDzua&g5cNZv z8+4H;U7?TVdXW=jwe#N~26C%GLzngk$PB$mtyM2FIa1_`$Q8^(x_m?>7kr*-$hDCE z6n*m-VC%^%hWn~!^{w;e8(0ai`M_t0zBVKQ`U+rZ!)-2K0k70iEtuC{V0lm)CbzZ> zg+#eNnUfwM?zf>8dzY9GQ)MMf`9MD(2=gd@%nlWkLO$?5AGpNhAxLiYt36O}BSnMq z_8e7AbgiNbc^2?tuFdZ&PR`wFsJ?mxrmpx|dSr}+!h$FCIcvWa82+t1#| zzFeFF2r7zUV{p~tb+_3}o#^)XUPV+FnnH>NYP|}I+yXfAyvkxIkz+1;BicJ*tj2%9 zM(T}caU(urZj!Z-7FU&^ejpma`7cwE;E>{EdgB(LBhFM<3^#Em%l_4Rz*?J1j^T;6 zuaGLmsV$vSnpdQ|kB@2*o$D~hXgtOfcoo_WuF3|gSvi9K{68i&F7!RkHW0Z0kIP`o<=Sgp zA`4gK=nol{%6^~oS&S1}m_hHJhVopGuaKt?+gYrYOsw)VsIs;4V;HFSTd)Q;KWxRv z{ZJg5jxZioOk31HfLcsl!vuV*+`iV0n5U3ux}?_CMQ&2mLw^kO1$`t^Kea-}U5<|j zs#F$Wq3&%+Bw810vN8T7rtNZ^fz}%9K1Qw{I#h{YNS--Y$uq-WtI8g&m{b@^T8@ua zZN1K^x1c0xP>|1dX`wy-!wB261%t9P87`I-3QB^DrYr{H6bWL;kRpqtV;l0xNVJjS z*WZKzGM)>oND&-Db{=0lRel)YIyO5$r@^ELWpio;?8CLkb?hW>w{lwnHdX^GYR@yH zV+QDHE&NNyGZNB>rVbdhg)C2ojg?3gOu+D3JRn2JmeN+PdFi?&H*Df8yU`M#RGPD^ zsx6N^g~D4yj;;^T!QtbI_r22i+;jC!ObQj!J2xww%m7tq-NaGs&> z+G{dIfT2jPHgP#j)Dv+!T)rQ=4Kpld0qx@c!u(z=!rbAMGy~oMPc}-+FrGbpo-~z3 zb6*6Ht0UzPv2aK@tFRLKYcXlx zY06&MkVWng$kLQ~M@dR+OP_cKjmT0VP5y9<{h2qeS_J=dXTS-B5staJM=dh_hMxVB_sm93ipCXvy z(cm#a)HQtI3?CTdF^5*GkxV2;;rE7klAughOL%f9^kHP# zfo{bCV=`l6;I&DSz-uvt`?un*{WtdT|0?cSEBCdyW8zoij+GNV?pX5I>;ZfEOS8aXj6^Z526m3NUNv=X*1i__zFBliTv zPz#p`pO)gMLD&QI!X(B9Eg%ipzmmx;=ny%Au8hMjx^8LAzl`8*mW)ZdDt!x+@| z2i;%{2e3S~a^ODzi2yS)aT4N*X{Ej* z3W$QfIK&puXzR;I4i9;=7;LnSei|Q%zce9OOXY-MEn^0Di4jvGTbPXFpYt_5`TQ4bBADzM2Urq=twj0q<-ks@tQ^=44Ko4;GW3!%;C|-T zr@C2u`zL@1T1bYA?p+jzm=hNHT)us7?FZ|K3GYm6k{8Ch@8H<1t*HW<$fL5Ek(ggTDWa|#OfQGMyFL$PyG4=Ss@jj-c>Xa@H zUmzXB>(i2c3_n&~LuIZJ;4fs{Dn!&$@K=DpW?c`pMw?P}QUtv5)r>6?6ek*dD$Zom z9*lbe z6l_zNi$aBYB&4%%giHlybTDlqTLm{%MDI-CxC#K&1i(;EUW<-;jJ}0;wMug6P}Z1= zf+fJQXFWM4AF3t`NxM>m(pN%gic(OG(7v9$D+j9eh_s=QAeU@2$oExqbe4qZK(0^a zSiIet7a7YLXw?bSf_be6DsjfP#_2PL>bVh`70+nsw=u|iIFaLqdS?2^{JVOx8`ewHNl7)Z zW0T2))pRx9SUZYx3#oYk2;^kw?p_t$pPpWbn5iaNJ~JXtlgG^BWH;UND*AIdj9)5n z-{RFUoJ0XJ-y3g?s?B}k3}4Y{Iz3HQt5Ye48$9izcgDi@1}uUzI~{O0eGU@ZN-2h? ztcWnQTlrud8|U5|#+VAG0#z&P7G9xRiK=jFbrsI-3%{nqS$rAI$IZ;hO;fe8kX#d@ zvTDrpn{^YI=RQtjo+oR}b39|7HGPv7bSon6AtD!0xS)73a3&^m&6g z5B4HCrUlbQq`3SdQyGj7q1u+!bThTyw~%=01Q2t0y_I;hlqSXNJzkD7b5azQc&4JfJ~AG^HlEySdl-1gaOf5JIaV*J zya>bNj?xNKge>XYn9eJNtIHGOtu7W)U8w$$kGIkcbahfU!fj2V0?3gV z#+kITyX1}$G1ia=12W`2pw$#n1H2G}w4UA%&`!cAOsBHIdGCCV7MX}c?Db~JY-bm? zC7!g0R>IdE=e5n4y=lFegJJ2GvzrJ~M)e-t|K5PEBdA0jf!S+7c@Iq%Ne{v$IacPT z2S*r%PlV>%w3wDKUitw5qvABfuqXePP1Y^Ioswd+CQ!Bbw}FKD$yrtP8bfAZ-Znk_ z7E_lz@*HxaW;eb6Q&rXUCTv$t1HeIzH3`#16RUF-bol2?eI!k>kBO7ep5>^A?t-p| z=9l@_Wf42-a%{31D}Kjotk5*1_Mr4J%jq?ED4OA{Q6)2$vvInr1-JBs-onz1(8bVM zs7FfBHY+Ony!`5&M&=z6Pl-d5G>l-zW!hQ|sPXd%>R`s&9$#J-R75gteO?}!mlFWW z^V=}q7e7BJ3Eud-LME^AE&$XGr0Aj+u^f-Gy6o@3<~kob-dY)!#|&buJQge61O$J- z0S$o;>z#zJO8FrDNeC5VBbX;ql?Lf!qwF1Thr_afFvr#CAyi$1<6@P>DsT(xKACfi6EZ1jn^%i0W(P|-Eq&KlWcnw`+>+}^Q=j{|U z1zyRsG$F(kc<}Tj##FaMvkiz`fRmNFBMjnWuwUs>byO#3nqvc!E6g`AyFc9}0|wKp zPijJo&BlgU=Cni8E|_v9!B?C@Kf7s6)zxIn4*VVm^Gm1`2II`M^|^dSJv1e4O!XDt z$+Rs(_SNDHH$9H}x}!m-fEUu}qE|-MP|SV+o^cVmFIrizg9|Qu2urpcy(kKFoHG5V1!Oc2Z zgUq)>W_oOF6m^&5VZ7Va2b0y(Bu1r=;$Vz8m|i^O?j}KU9*v#Qh#xSI6QDKRGGy8P z1iS|wr;!vYodQ^V+YDdG}gUc!K?aKR|j*FXEB;tio)mu7*y@s0u!0f>!a>DnpN`kOjGXU79K|^Q+ z8$`?u+h%86C=x~&)r=wL?Q-MwV`}!C`ir{U01y#thIwBN^@HpL++kjZl9#FE)yjbs z1+8vJ#01442Y9;u8d$+ekgqL!`FfxjdE1^hpyZv4Eckem7)c^|>q%jzu4#fdApLT` zAu3uX!f%Wo0Z{j*z(n>U!LuvR3P{gXN?k9aFPVeLqxzgy@+(xYMWP!bIONdpe`gHk zMINN<3SH?2?J}0h<4qx#=$_ZKg+@7ubm#^q#mH|AB3FW>0PlS=7cRh{ds7ai<9rm3 zz&^YL0E8l58$b?Dsn5-0+zh2&yVP|vI%h`!`dzAqIaq3<+gEbu!ajNlb@4ic^`|lj zLsoa|{!x_%zZ}(d_yFzOh-D}c15D>}5|9taz+zry4~R*m0|dAbl(2t+T+!C_I8N6r z$!F8Fdmun7y6?xsPBV}Ig~jE@LzZ|cZ9*9B>}k>`XhXX>4UduH#S0AcjD-Gf4@gd1 zXXGG8DwM;#G!@A~k)UH*`l~al+EmOq^6aha#RBLJU`~v5`~XaPHQBm;;2|VdMq4N9 zLK5Y0yz~x3<#-KbGag+OFpf`(_hNX^C79As4QTOWJRHm1DYSHMzvddWXQq)YdXjd` zgPztW3*vcbujHvKnF-wYnSX_PmXH}O?@F`CVRESHeOMfSVv(R95KSgsEkW_4$ce>1 zLuja6J2iEfSAh(x=JM1xidx6$wu1$`ew4|ww^EzH6ya&eC|RCtgON)~#919ml($*A zdO)0jjQ|;)gB4BCNFn_KJ$p3wt+PDtkBGkj>uxVD(c9e-zVuo|0r&8n5`#DRcx481 zRXm=rx%qYf0vja#?HjN`+9eGekST6pth>bwR7%GH0G=nScvPr`=73m_w#bShWK^8I z{1Ef?^dP^A7PsSJcT`bUB={UwjT3jFrS{bZCcf%A1-CaHMzHb#jG$cbrYmvkLKi)9 zZghg3z_@7E{3eQKo5n@6@lW@&Pp#kdshEALogmQNOqJ{6xC!ildUgM` zsn#;3^0YD+ByRfbAe$z;By71KeHa;d=;XE$*$<0Caz_-$Sy_$WI>$qga$0wL=u6Y1 z-R*JF+o8KI4{c{%gAF;;L!Z&JzC{mU*3<#a`c~)!ah!E3{A-~{NgV|^OIEdzy1pVm zt;39~Sw?^8ckuBlj69{i;wVOf;dHYc* z0rn~gRxTkl(|&k!3^}Y63L%TUjaQ|3`}vv}a$ecQN7dhQIAN>No3NVjEy6rK_8lYx zMOD*UzCStM%KS)eU)ULv05Ik7rP^3IY^tr6!xr&-a`>FMZZS6q(xyquBri#QFkO8xjTD+`;%t=(Luzq`^j*0=g)6iCq>b)1u=7-qn{Ow@NzHwL z6)i9OUFz0!jM5}qkTsWXR;O>mJ4C)>f&LOXwBjT;onpa~@bHNRJ+IMUtNMpyGeCS< z2VBGg_?M&dvSs-u34w(Kvy%dhL8mVg^L#4 zLk~@XJ#_N@xzNuuV|2R>sSNuu_%BF8>wrz0+*E;29=B4EN_{K@o;eEIEzB3V zt<&By%P;rG6tY3ESj?y1*J3gAr+O>f{?Ussu@A)u9T@w83-NN1S?zO}PgM$#o0aPQ z47hf;cgbD0p;NB#DXX$cP&S#BO;*{TddGHjJbtPNN+?Zu5db%BQwn=9D=#LYE1MUS z*>5WQO=G|5>~{hCMYlKYO_}g(Xz_24I~kk&5Wqqc`kf(xQ+ox0DZUuUoH9V4puLj; zHP71HspKV}y82|t$vojyg`j6)7OH)SgCbQyk4{yFPdUOTCuL+?t$jE*k#F$fq!h;W zv1%Lvnmr-ayF~9du!CH3tc(m&44%NmeRLcFg#byvflrR`{7T{E0Cc6&e5#!G`u}mB z%^fz^$J&MJ|8cpu^W=5=9>eDPd*AQLyq+oShW)HOJ@O{!!8{= zRXIo}YcD53_RU%|rk<226z`|$AaI>5>erdBh+L0~!&B(raS~*O(tS?7S~_wUl&u>i zN3l+HnF}wGn_wFKCcAN^fT_Jv*^R43j=Gc`m_+Y^P0{RH`tr75^*kR!sVX7l$XN`w@#7o0S5e94*9E7tInQUbx}T) zS}b**>e2QrFn@>S{v~)7C6Mh(5~uclCf{x4ER@*i z7}2*%HW_z;jC{lhd4=unqx9WO)H#u(#$O#kGM$jjlo~*Z|B7QrExv+V*T-ku+qcA! zLHnhx2_!f_U~k`wZ^M#czp&L<95OiV|A3SW_IDuHdHb-qnzYXky6EB&?T)WhNGeB4 z>|>%;OTR9Xp5Y-!m_-s}c29ZK{jA|5)DCp+D90CJq`Oom2sUsZW=-r&1(pqEQ){?aGlvm5KfJcA)MNeZkc2+O4=eop8_xkU1UFk zwLE6ne209=u*D%?Hf+h2>ykL>HnJaQtUzJKfqt=S6;=&>)TXM&9XNrqYP86+5xis^ z#=unUj+EppFgRD)RE1Svs=UVPIHJ6UrL~&KYnb0f1(=spOdVB|sJw>zZs08rb)-k= zb1)ipKikho0EmCaUU8(b!m#v56-N?AynhDGi5y8do#KP`LGeG_Q1*|bnoqGts4FtV zT3z%6Iq$q zjpeb%#H-+OHar?xg?K3Y5Uxi!YCvd>Zra|@VB7Zk@pk*%Q$2;J3@1CZ%?s!PzMQ;Y zh`ws!qo0awe+lq@CK6C|Taa5GIjeEYgMd4IC8@T)py_pFNUC_Hz)UAi8ADqS z0^<2mr7BCQ+NL~-8erwgr`YfF?Dr4scOU!x3;R95e&1xj9UQu#R4PZ50)c*b0VGo3 z>=hPMi@uGoMtp6>*T3OwEWYl+*O&1%4qqR~*Wco+fUi&B>l5%=ILuCl08&7$zncDv zDaenuvd~h}44r?Wqt}nAmV^EZtqhtu7=Vi^sHJ=HNSGP^l0jRyB3YGJUWXT7o@#6# z9s-zVU9cb8GFkZud`bU zHMMk37(MZkwpLu2EZUilhOf#_KZjPkcMX4_R9U0uwtxHu)>4p^{Umm#Jeiqtu4os|4W(4_kmV_KCNXVVvKTCcvUb=x$f0Z-qdd*3ykD zGBUBdc(=BLeitPH#~_qN6L5Rm=EFpyr0y)hTN$!cu*PNsLmcEN)3?vUajl~feLFKk z>Ld&&ke^{b`=PD#34^lvhswy4Z1Im;{&d9FZSU9|2LRd;N|+z;6|2MNd}iYs@(M1y z@f%5}gGQjj~c3BrbD$738K2e(o_=z&$X4H*w9h^EhG zZ{oM!17q$%yw(u1`kz0;&Iu&J z%TS0#z*+8hsRb9|cq=Zn!fJ{@$N*5ErQmv#R9Yk(o^cYuIl_H@OXtgVu^lW?=w`zO7!+>fuvOELe%XpZ+ z0xW~x_n%?BsW#g45reMC6r4o|66d_D>BVOe8FXlRcL0V?(X2aspr8K|FzZtvMR%{Z zl|V=U37xppHx6c!0_(=ZnQ|bREQ`x926VN!bS+_cdcH_=)tFcXGHmGW0T4TdP zPPDE4* zMOk4KfXOj5S3$&8#SoX#Z8hGNLGl+E^V6i8)jLwiu^@WC;ndv-kg!TM=`bfnBOANY zK`JJBg&U8i5oyG@GA31BZbh7bFcIWf-wHF`0b&IvsAfnAnouo5XHSWXc_7^9CO4C_Wi+<{BD@wR-ZAFd%#EC3kX@-%}%Ap(PmKy*6j!A~cE-=m)~ z8a@mlIOW3#kwEJQ)4QRo$!>fk@6PW6e#r8t-OsWQUB=@|`AKLo z1rI*1yzg`4<7_T^&_KQi#zekEuJnZE@qkj<)mj97c~hwiXFJYr7MeRPE$FMkevsii z`5vb4vKkL7MQ>$SB-g}eSEN{WV61s^LaFRm%1>jl1npuH`aHLn@)r3j{JuTISl6%A z`Q;@>OUv&$WF%Bhnpp@1M1eS{-4T||a^2h9K7$yy>qLm()%IsY(1hyhC@TWI{UqWz zjX2mbh_{bmwu=4-ZpPs^MA#OXzj>tcEmb;=8?g-0T6q^K>QVR~FICFBN~DiS(Ob4Y z)d9HTG|op|c&Y5@&m2fcYr-YG^jTxw7$;s!3Kkd((nwv0J-9gms6`#kt_w>b0(EGV zA=K7bH_D0r?5gyd*W|j398@I6+Uuya4^=uE^?OeepdFT_vs_LN+zW}Sokd7UDLO{r9TK5gvly_Znl23p)U!HV{Ohip4^ga2GPZ213$a7#Cq3z=oRDp8xVvB;e1!4Q0i zbw^086|gQTNk;`{L3&H4l!xf{keZvOvd}J#4L5UW&uJz{0nZv-^aT1VEf<>m#56>= zP{lH96yq}C7e2+SI~e*dSP1PnG&No`>PAy+WG&s9#Hn+dXxMGB=Vmd(ZX=o{=J6A;^Y8w_PG>c? z{Jl(dd5X%eLl`T7P^4+(!OmnJn2VhZ5c1Q$wG(%|{Jk`;@!^{_X8joTK~`W++w(Ix z4bwjwt6%@hw=(0kTx5&zitb{2z7;^SFbim8h?nmbI8vAbs48Vw9$tZ%-k!J2;48;K z7Qm8v4XcnNwKCrpu$XN+Hr){iOljw-iDX^lo89!2F}zVEPI7Ap0<rkXO>07)u3R@p~Hwz2(SAX?-ab(2UJNG9GTg(%h?rd#BmgS)( zE_(ipF*V4it;DR)JkA`SU6Ehxa?zuZ=b0yVpbOWE+*hB1hn)t-Gh1HqgDh!kbfMvf z>GGIbeexvsd(cI%)jO;%!b&NDDk@Nl?837rtcz}AN&V&H7bLyLH9?c>ajVr=BamD{ zDd64e^w%-wM!T?L`vs;4ik`9~ra6bU5;p-S8jKULSbYXN^RW4^ab|2#oS7`V=@r(w zXzLw}t9={~bM^b)?al>U#B|w$!29WYy5KHf56qaE-7go^QMO-caK@N+(VRX5+1esy zUX7MP(3}hl9g7Q{4E#^@8Lvxs&d@B5DxhL|4^&FmVm0Lx3}e$C*9>E?Gkw)CRvRUq z_RH~$%iM%a5%&E?))((Gx@hlL+4p$HyT1;QOi%Ylm?c^RnA)2`vg<{enD+?_lO>}#&Hbg`=4s&*1 zvKZ&0fBFU5l1H(O&5snVILU5q$-xN_fOhe<=R!A>`Kkn8N*nHD*a>(;CH8sPK6R6P z&YZ~A72D7nz)TUzHT8?Ducysu@ zS>5xFi^UtYR=6eXgJVkr^tY?3KngSsk7 zXQwsAyKM-j>^1B#@bR#M_QaZ*`b|V+0XQ8!!7YTho^-p-AoVmLXur zO{GZVQkYl4LCIe zzbPZpR;Op_-^8tC5n}Xe|KsQ$^Borrf6g%f+xV^+G3AVwa+am!^O$r(OA2dA0w(#j zB5 z8N4y{3|<}@KoyuOC6P&ZJ&A_kjeS(6<5%VcT^nbp+RLfapM@vw){#~~zkAfgp)186 zU#|u`y-j5gSPH*GriJ|8(M5 z^t=L+q936TgQri7s;_RswF3sBXiz5=i~S7dv%Sgm(ML6!gSXzV8P&M&>JIo^ojWhp z>NQp0-8IcxZM!MnN;;ll+X0Pdg0Wa9hX6DC1Zv9JYNE3XbI1l3qhzK(SyV#vjuLiBmOORAJP)hvj`Ivy=t>H+kc(Y=fr_Be)&piehz zy|$2!66I>8g7+;Kwts;q39MY1y48%4HuoRa?ZI@uh24I91%&JrC~_uN`Ya-(L&ryT=K|;G z@6>UxDnA;F{R(5kZlf;6J9O{QCC=4>&tn50$DH_}CCP+`)EJbdc=d3%@z~%sQ@%=@ zfhyruk42nLrkU4>L+24geUv4=e4d~a$&CnAV<~b(kJBiaJA5#frZwmYcCL1X}DRz;d97w@u z`7$rY%9jNx1#)WH4vc4$1F7(ojb}Rh49XPcL0)m2Lr-9bOV^@JmL%i`&X}_K8B!uy zzSh=lJc{=dqAJtntBIjfy*pW-;?Pvz?qx`DZy7gg2fpBwujWtDR?>rA$^u|06tBYQ zVpCz|)R!AMrn++_?K6Z5y#^3Vo4(7Y_gWc8Y({^&c==Ab6Ym*lCZ{KGV6DIM?bX$7twc>nh*c0d2u&nh5=dKeI8E7s2l~Kk@LeW$OfV zFZo$)?umZiiu8E?&vJvAlX$No6yuF4qxYk)>rBkX(_ zJ+zShtl^SEH~j%TpauCsJV?)nQmnV*PEicx2t~)d6K!dja|!IvQ79t#_yZb~I>$p> zd3MNq414-{?9vk-kQMxJx6k}4!Zos!5$=)X3CxE)P$i{kq`=2NL58swr+rvTDWgM1 z=){pg2t8_^_!u=q%Xy!9?_hlPm9`qpQUfqDxs=aD_<~yPxLKTTzkru-c;IGBTwadE z({t<4lpCR`Z357hxJX+B=*AG}#t`Tt*`h#K;FA3abjkU^X79`xzj22b!@_tm%kIEzv^wkLzuULSTryAy1#)t z5Mh6i&$@p5SNsip=j;9k-n7MAX(r(J&=lxaQvfUd*DeQ2BQ{K7*bcs(2>dSCFyAj@ z8%Aa4t3;3k8I(gHDRH4^ia;7(I|vvW|BA=~#1q^!oa|4+TgG=lCJ$8c1&3PCyE$pv z6%`e-12!P-!Gc;WO!D~o1^|N=e|ZRUd2Bm?(RCMj9%Qh`vxj=pa- zr@rzPaF2m1Sahg{wa5X~tfi9xW6Spe2Y`TNP;1u9fh-TjC`h`{MvjxE(1h=Yew;Y^ zM4=jWID`Vbvzm0xcW+Xhn|wQ8*Wk%YoDYzW`Ng8*6n#7WTB2};ZwHL~Q^C7o%>8o# zM*!L@ART}S`28(GF-5-;6uc&KC1~||U}Nx`bZ+8Ji~n6s(${O69H~jXq9!ed3j$sC zx?1#n6xK^&nfK0(s*o&QV4mB>Y1vgN(#$e;rhklHo5XP;Gi<}MGWz7VV6wyHC_RH^;yOuVSS&_el%gn$?1@u+ZIJ zaF2lwTw+FoZhGsms;&!7ZSE5%tC1{Jfv>xu-&J?F7JRo#p9wNWJ~Y=I_#~EHA29P!dHN%@)gWS+V7*VV$1J*IqHk4hHUO$}}iFw~RALg{zq}PU28`;9s zvd2c%GJ5lcSdRRIxoUh%t;wW|AJZ&qqC+li*M|(_&{=uvRT;XWS#My=$yC6brZr~D zVc`n;<=;kik01YMP7T-pzjSI?STp)Hr-l!_F^WzN?`t0Yf9TZk^rxf$zEeYu#LzPf z5j*<|vRnWPnwk#1dHMDs1CB>0h%+=HCpk2USkRUPar0U-$Xr#-@U0kWXNPG9W%oYZ zcrQN7=FL}-rj5v=zKmdl)avmec7C-7xfo)~-h)h!w1k-CZAo1Htsq)vQ4@C5;x*6{ z<&0}t1Y0o?IKITEf!=h4;()S{Lg z)%rBx@$fD+UT^52iL=>3Zfy4I)uI_Vy}DT75JDf>{1a!YjM-5164P}sB^EhsWOw%$ zlW72O_FW>5A(j-FL-XALGF!IQr~2}yPoLd?`MyeWh>Jk<36vG*?EQB_yN@LW!klVo597$8cN zNJ6CsD>bOZ0Zo9Dgv*2pAsHf0@S5US`y-sgMVXLz63AhD)K-0qmU^kESgE2?K}DQN zd^6!v5-vq7RHH@R@uV6gO$HirzP0w5nFPeP|MPs$_rL%1d^}H>bN1QSwbx#It-aP> z>pRA7Ov=%7t5;QDsTNG}LNkR%GlTMddWz-a3tiQ#)_i>J@x_%JnxMV3sNhmghO*ri z77H+Sll&ICY@G>j0mM$^-^Eq?n?|M%Ts=dMkXwKq-x} z!+Ex3H7~gd-9rE?*xJK2n8lIInSmWRKjiwd?_oFZbKyH_%`66%IqnhXC#ZVGG~g2r z7V*DcGX!H~BNIuYtAJbcyQr55&IAaOpw2TZLrIf{!}FU!_@W1nqt1h4&UH};Ls3m% z!O^!N-Gi4;IQqmRfHXrZDx|NXhY}p!c-*iPNg}+CZi*_KVk|xR*ef@4<@C2m10of& zu8V2F2dTC*G>D=qdS-Kw$?xBWXC(Bx<*3Ez^3p=AP)Sq^xIua#>`q1?4b3+SxcQ2O zUIDrEMCk4|a|QB(gU=h}<~~@bAXfJMrQe7o1^Wh9uG&I$n{GH%E2n!@Mss60RmRJW zN%H5B+OrtDc0~ekW+zC4%#|CMxpKp^Z?cq=`2XVc=JlOO ze+EI=P@EMJyal=NVizQ@W}oI>?9*`eY3s#4^=`mV&zCJ-IN?Dx>>w&x_9I`TrGC>SC|O3?nBvY8&*xrpmkTXm=a!(vxmbV%&f~Rha5Bs zFLV`V$UC>Q@l9mjblfNDe|unbD>GE#q(2p94jAy8nB?mt2TJJ{l&h@x@)mRT=!?K8 z|Ne);?chI1{9e~xio&R;K0eX4u#46<@?f_j%Fy3H1>_NCkA}1C{6^Oe7398uMlBUvVKqpYtC>!GKSmm(k{!JjKg>(lR}Kg| zR-mgJ-hz&>Bh;Lpf(+QRns1D^g9S z4qO)MyopR-=W4ds{|?{X{m4F*sBXPk=!aj(dal6LzhQ%bp}Tccxd-hma-I6 zKx8a>`Ygg+4%!gr-xb49t!VY>ggkR0&j5E{QetQlbD4RtI0;WOR3XyLj7`jhnWcCX zDMJ78HDeNPL>>UvXoP;PL6@@Cl^h*%70$nu94!QLOe@{Zvko!u?(;I}Zze>q`XTvO zVMma*FfIbuYb|rT8%=-hvIwe%k0RkK&Zz9T0}A>xcHV&4vHU&64*Bjb6L3-^#SB#G zb4o!GwA1%G%deJoGQ$;SNKab)$zh?3F~N^CGIu#c>DfrXE=Lk2?kzkDIBs}2=!6{= zLt%?4e)A49z3Wqqvk1}~^hJJ&iTLEewa4jrGc#607h1pNV5uKtswm^|`5fxd+ZBQ4 zGUF_J9qwLJ)*+Ti;|VkMq^(^Hgb1E+dIbAR*NkTeemmh+720to^KIA~WE&<2+Rfq( zEOy#2pt#mRujJTHel>L9DnOGOW&>vuli~e+*w)@M*8vqmck@~bo-@ku)a1%a#bd=3}$&BeddJzrJKmC)#El@z8be7`7SZ%$r3yefDuv)E*M{B;W+| zeolGpzMH3_%qZ@eF>KPLtsuW4CB>uu54Nzr-BPM9<^aKuLYA5j-e74?!W0!AoTryr zwhC=5NQDfo574^D8O}sMmD69{1l2+nk7FzQs2y5a1X6L+wZX;FyQj>k-0Q!jgvi)U zQksq?dG0>d-95iVEt;Tvitx4)&XXMIHrwlPuPeueax>OBCj*$^e@xVI=>U_J4QZ7i z%HM+KHcRT*oR5Zb=#I<&M9AB~h>o?4Lpb#18g^LYvQFb zGD%O-7>OJQA~k??A$%LevKU?$F7>MKFw@h~($J_Q4ZEvRvXJj$_W*F?eE&(125Pa| zCNe7nefv&kUY-)5N_qDtHlahwI<_b6M6pe?qI%;1J$Xrl$w9^(Wf{B)%5&(dypUJZ z1@z`aniOB>APKMP9@yT6Zs<>;4Hgt>^7ECwU&cQdvd>*C-tB0$6kUlOS~Xn0!i3_U z^}y`a-Dum^Wn#=UDRd~p2}L?dKReuy;ZAc7fk?EN%N`5cuu|4nf4o{CQWpr6g|^Ij z=&g(Z+Hk)l^Bf@7WqNsZYsMW^xPEl8Nj@S0s?0pfO(#Mm4~j!2uET3WOc~#q-Gm}3 z5xRkm<~Dlh(bs@h3EimQE9+DWZL>inRSGeVM>q*#rg$;_?`UW$^RU7l#EbFR2C$QR z&9K1&zglP``=D2fvq7B!!j@9VQQu*d4BDw613N99pwna&;p4}dWY$DrEYDalel}o4 z&2FSVCaKt1yfr)jz$WWvc{d|zD@GgXK!)VdRDIiHh&f{bbK)e=Z=%;Tio-m=EINxG zM=D|2MW@ust{thBxV(EuBLQQ(pGOtg?uVB3=us87F__WlZnq*GWkG{GYJ@`ZKA@vh zcXyb*vgR3X;Y7K+>i0-PiHW!)uz$ns1N`wAc;fW+!w7SV)2+{U5SDE$WMYSFC%(c% zrA~VDI3@?T`YpPL*HTE5-@+_ju+!5=GlJq8J$OR|a)Qzm3{4!T7dYi=r&-FQqesUU z7j7>ZFth|n(XJ!~PMF3ki+G`I1t)1B! zz0!W^_NYSz;EoQWUaI+_PKF-SF%)B3oJZuOn{xKZK_`>*wQJci`q)8VQwF{^KZI1) ztR)!_Cgn|}qcLq7Q-dkBtfTo8*E?cF;UFx}2RLFO%Xn+ED-sw%X4^7*(YTp=17*SK zoHnAQgnWpCX@*I@jWf}#zCnJiOG*YXPIMU?9`F%(#LAQ-^pBr23F;Cp$xw)77k^txB)hd^Ygz2`EzfOx)%>*w;6}Z^gSo?0_Q~|NPr=A0EcAI)fjgw+JOHo?xWAc zn|3WJPBT9H&84`7C_c7}D6r<(Mq&q)m-;aOVgL?0OoK}2L0ffr%){J}F;*##`E01^ zCNWQ4hkQJqD&t{EMFn)u@a#_SzeZ%oawhL)^0wp;>uXX zlZK#M@{0|Fz7)+OIYCI#G3l}4=TXdV;K2q_%x4S`_bKj3jAHgNiV18(-}w}iXA~2& zU5;u=q?o_|94Tfu9del=EqIY&CKIcd-52AS_Zc2Lkvcp^FJn3hLugi4_A!gYUfOpV zUN97IQx{J(tQd2OFOa}E;68a6pWJVju7QGKD;vQ9x(+WD6{ZaU>N=b^MlqaGBCQsf z<%oI3DQ!5)tMBXwdTL|z^rXg?8cR8%MJ!=X_!zWB!VMX3SEO&*L+YI4(5wbuwsDNMv069yujD*Wf?}5TbYAFpt z1&f+`WMnxl;s~Q?k-{o8YB0FEGkK^1HiWZ`Sm6bq7!(n+nCMZ+VszVNw1hji!RO8y zv~%Cy4%uE{*$k~Np3fz1U__Oar#A?F=n&Ijh7NVWx9tES`_6t*LYA@ldxXqx5VB(+z<2zGwH2jhUVrlUh#4NJ)Ztc!47GSW z)TkH@0sL;hLN`uES3nZ1&nl$p+gGthQoZ={+%i~S*9;I#Yv};L4K<778Jm8DRp+H& z{uJs9^g&HC{1z|vaUAOCr$j%8@$)~m_6uq6Ky@~3^KbVv_Whl=%!{G7$A|s^&GkEX zEPps`ahy8uHcX+}@D2nAucM<13WP-E z(QWXcJc{>ayvn1y@WtI8^&rpG1s%3PF6J=B?}&!}m2-2eHPu#;OV442{)0 z*!}-hWA*$h)L5-OcD}}ntQyc*J%VF@_SHd_@oMpHausi)_vpsK4%(WbR*{xNt|p*h zwK%Nl>m4yOuKk&V&A8BY`M(YyWEecPqvGQS44(ey7(?JiyB{!y`182`)EI(PBs=Jp z6XM1YSm_TNLqN-Zb8jBnP}=ov5yTlOK@QypB3;NqKk1KN-r;uc#;H5`%DI66dX-#` zt|Tfh@dMS&KmqBkzH9QSSKlV?gZ!cjN79E59E;va`seU~>XCV=z z0@6$?pdI6k@H1@ozCq3A?9nA#IB^pmW*2bia;(^<6gw0cy}M6=EwXrm0uyb@VIeV(!($Nexh+>a{7CD!1^;EjB|VjEl2yf|91> zamqqo6)4m<--Ej2j4>Dxy40hu;M94O*(y7RHrrAsJX`6nB^anbk1c6+-ojGUe%za& z>rBOrZ|bASp+jDdmL@PGIQeCs9oM$P@Z^`7@2PV5o!7)ym>DL$3a|0%~wOFq&ei2i=;Cdd_f? z7^Z)DnSuZNWa5P<2P?Lpd@`okCh%mCiR%n9F)BtTF!I#nkLfz26JHy2Vzr2L!h0l6 zC-xzoxKkXU6KsepUmkperWm!nW6A0?SFuA(0L}^a(1P^reBj-mz%Yrez}kI=7iz{} zJ#_TT#$BAXSku+9n!<@V&!m7I7RD5g(r~g4C#oD45h>#6Lm&XFk1+GsBRs}CTS&j_ z$KT1!r2__9+<_V>`qoQvb6A|<-$5d9$rZ$+B$DYI(~m{nI}JXFVT9)JS)?$i>AcDy zFH!0;)1WSSQR>1yMv5m8)2vK49#zC@iC+ww_<(US$aeTb`&()rr1ALsp$jw~|3>Za zimCl4qS}9KRPAs6*INH0|68^G^S$5K`mgvc)B4|k*Z)ba|2Kd7L9PG3?`i%2Eo5(w zL3R>CHZuy@+6V)}zk+Vt|5oUBmwg|)X`2{yN8I^;61tD=|3T=6F9KbM5yRlIVaT!Z zO#9zL=hdFQQ02vzGg-*V?-`oBOPMl?$rc}97Z-J=!hX6SYJI`01-4!j5(LrdQQbCL zL>NOJJ-L9I44qjPi$Ve5`X$uEv}GW1V7;~1p%}4`KJXJ=A5e-#yYGy}KD3V+%)Gp9 zM`QaRW?o3it-wzp3v+SvZbRb6dkT0#+T>N|I2cV6t?C>b+NK5ZK)moacrSE#;^rr5 z>NaGDFfs@;%=VVjBOr?zPVx=VWRNbrLB=bOa4>9TlKcU3VJ2p@y#&onaMQW1JPI)@ z+8UkfJI^o#7~Na&>fxKu8|pm=M$wU`NF4;m7Mh4^Fp$6V(jbF|#?0CGql*jR%T-{_ zrA|6th25ky4P~5Lbrwl(fGOilBt#tbha@ZdBcE+kco5jFz<`iOBP{PqG^OX>??>Iv zK|Lx8-GJ}WgLfkopiX351cmIZCRq+T$w$l*6Mc}+r6;WDo_xysDQdw)k4o5H_xTxS z0vI#P!CKTgJbh|cKkjPqs6JqmuQZVvoZU_#Tpc+s_EJzHK0xs|+_Lf%F!13uv7MJ$W(%Hy-tgzEO{t5v2&Li3;3 zBj{CwAq~u<$Ka>vT~?+o8(QExz2Wkg7#i#($i?$;HiL3=S4`O%$=K-Ggr#;A+I+VgRde1XVKbI5C&7Xj-=jrFr7j(JUVm74!$*6Xk#38^C$sw-N*P*27aYau!--%>O4rTZ{zMT{edxl0(XnW7% z(KrzN$}`Nwv4E$0F*5f{4lJY!5pQ^1x;aWi=Wrf+qXXHVbPpZfi#%!{{lE`HG%U3$ zkaHS}2Rtydk2-NES!zML2ic@qdd!*>RTTN0%e>Y`@;$Enxocyt_G5>SPLq^CTmNaC zF^UPK*a0iA*hvnOd<0jnz%LukLQP63^8xW6!(E|;9EA5zNT@P?95vbShXxRO#TJd> zvx?JFFyU*Q&Ip;uslo{l_5KCkd~8-aVY#ESA<(D&7&7`z^huUg74~}|JDmtwJ?P#2 z#cOok73hcs zE^HSov}PYE_v8dg@m$wlKpbSBNuw4)lqM^2kNL|^rUpY798NQ!+TzNNly{7f+yV%P zxN79!L=Qdr4@1%`iz$KW1_~W{1d+kGz%z@Z?_~_2+W(+{h1?GWEPQ^%e;Tl`=njyX zPp8EL7IHrzFynX`NYr(>W;_U#>(My4m@lWVbzw{#2Ksq;^>7$@1L+zISjggWeM{!q z2Bp6qPnUn@Fv&l&nc~ihna6j1=}Zq|#3yQOBIwD{0~5eZ#{4FXoIO#W6r+H5^fSVG z3EtW|;B^(uU7Jh~=CdQbB;VXAfiql?hQy17$xt6{L4c&52F47lSo3GpoazOA$abjcDJ)0UGn?5* zk;lt!sozsQf|)^;(^oO7D=Vy}5pm{gGtsXOrUF*5G?r5w-(*cBMj^vs_-sp_2|+T%H^YmU@M9P*FfnhzIUaoh_FqL*aJg|d%H5Xeiuj{ z+q9b@GgR>P&GGE)Kyocm9Tf4eJ8SINc#$ZTG-*lr#r{N)7v6)~prU-mz1`*B97rOe zj=OXu!qt^zA0+Ccx(o5RuPfS57gYDoSgd%qp}lAu`f%z*e)?jUd37} z^0Ol++tX`OnznVn?*ltEgu=p`bMMHF8IWSpLY zN!&n*>A+QKH;{rUQ+zh@8r+$@$Uofh2257L6nGzv{L57-I1*r@4|u5UJLI#bD3yGi z8UgqDJ3Ql>^+fcH3+Dmg`yfc-dN{G|*XV&E(5LKv4ynj)cK0-IKXWsiuB>Bw#%!R5 z{&b}vjgBleuCb3)RslBIlvNI8l{1_dC8{J0WjwVZq^k-e)ASF2N9bZKxf3{l&GgyF zjWgD0uikn*e)859v)NT}ZV%93Ll5cF#|Lhdw+uS6x-od(krh3}Rh!}08NSQGJ`Y{J z_*}f>GMg8`KcHM|lJN?&p^0PvM^6N7cpYO_IxRzS8yzw5^uTLIaBfG86VTsAO&$H~ z0b^#-ujr3Vj9K7gMnXuf2bsIT7Mt$`Ql5|IEGb1wzH`80p+)p*UKG^-#3y&F*Bxs}j z!?Ru4go@g914x*8yxxy$?VB&aFW{%?R1jf-^@<1g8Wuw=^qW(5$b$76Y@rdZ z0a)j7Qu;>pxbaQD9!}bZdBfpCzHMX7yIj< zqp4^^^zOESb^5Da-#dAJanLeee*R}@%hxfpr#~(-Kk+E=P7ZXS@tficJyYTBJqrAn zPUk#ooaM73w?B#$Wl0xedleKSZ52vcw9p}Om|7g^{dmlt%ma977EfsDkin%hu|eDc z=~drrFg5B`M_&S;KYE1GF_c!-{0Q4{q8D^v5OjC~Tg?X2A*@b7Kchq+$5=Po*e>w- ziZQXRLm#;vP~!y}^;t8p42EhPxzKsq-mQbN_X`#9L%$A->LY`Qu;cOB6g}~xzj)ys z@-yBglb&)omdw1-alY3!48JPjMHQ`-2rz>e_hr{di6?pNFTBM}WEoSs$-0@4?lg?@xJt1DSLxrX! z6Y%_Jm9mIt{{Sk>(-QEf2Csq(Y2|)LrQdRkQg$r6S-c+pehhyZ@HaxHd6HDCV^*M{ ziqNfH3Y&|y75F*L;#h3SNmVq>G8cdp5B^tNRR>2*QUv??*@&~(Vq6Uq}u*0$m?&rT@B z$?k5(&IBS*&Vjb&wR_p|P#J}U3`pPsD@_*2(-X=NlkkPtQhGuTn|l(%80ykb0lCa#HdFznYCnUew-zc=+>vsuq691WqHk~o*AhDkg(B!( zBJ^1z;p!&@G8{E`@m#;L1U=NvoIEZ;jc{7W{Ty1VkGzW=mrK+CO<~eiPKRP~T{>xO zCLpD5r|GZYz!5;&%W}jbB?1oTY01dUB0BS!`v!XTJ-WW33=Qt=HG9n@)KI2h*i^#; zp8J6=WYuhFgf){@)F7O**Z&u^Rd>j)ya_1Q6SCOr>P>hL#jgX;a|87}080X7izAtP zm9kFxLx+4umoB0CTh8gVQ)I{~mO`#y)B|3f#zRfBDx6S!Cp?h2|3S7N11!?3zR#MKcxKu#s(e4UZq2?qHB6I5!%PIC%$%% zDGyo8R3OAo5@M;-FiD&_4KY;wF}%UgxM_IDoxNF%Hx8CEym2P!GW5W#jfT=@SXI;T zKPef~EE@V`HkQ4;ZWE%kud}By&tCtSnH|xiaZ4~WGz}?%z3%TOjK2y?TwLS|+3SC9 z#v^Ha-Cbq`VukCJogMke{oIP7a({xo&H`^81@K=98+X?#1d=1Q(O&lj)M5bR_^JV5 zKo=0MR#oUkpssv?0hN7_@l?~@3BxHXiX3V=VSTHAy8Mt#~KcQeodM^pn#?qOC}p78W|OX>Ew#S^>}4dBuH@)( z8E{Gdax7#EeVG{Qa0EX~BF<>eYqPS}rnEH7y*3LnP4S(Ru0X1ve$kaPm*+Ad7m=c5 zrJ0eHKu^dlu8ObXD0%rZN?!a{BrfGhTpA*bxG>5RBOtaHfpq*Jp}2v1?*iVw<0nBDv<0lkq!j@U$OdQ0`Y!KQMT!Ho-Ru7#8 z^+QSH9pt%OV;oROcRSQY7Im#<(C}gGLHmxL?5>(X1o;Sew|x83bIg}pbl^L2dBW(c zas}RAhawVsYQ!PEJ{yK4b;hJgX(S$0z z{-KcFn1-FQLgHETLG3D-1+wl5?E2druZ>aNeI-Dx-F(S>50zdiKB|dvA~KY6-f{H9ondHBIAO7;UBK0_=jnUjJM$zm#7749xqM5KDLb% zk~zG5#v#HUG)hdB&s-)Z%6A9*wc$hv{!B|$#sI1H!PUcZ1AXXTw~yX4 z4>jR|KD=<32p!&NTpPeo#rO%C_fF`};B}W^;A`wI0*DPL{W)oV5iTHPUXpTpI%;r% zxq0SNw#>$8#@grN3o+1hPT$RF#v=CPYF;s%E*|*qgYQ}%33Rhi(dhieGrxp>bvtXB zbZO)Dm7Hh3r-XS{(RbiB&m@-SV~B|vFlMW|w7(|M$CgY4kq;HAF;Wq5rU0T!DHwv# zZ}z8X2{^#0gyErhU(6Rh1t|v^W)%JKS={U@l}WVeA27;hrffo|bEV#uL+DG!*ABu6 zWExP*Lsg2|{$wyOS8%LMrt9$gIPDXVc>Lq!V1FghkG(lTa;E-}BB0LzahU(=g-}FY zZ2{S@_b-_0P9vX^MvN=vMDO<)DO!#suSk%CUd<{8CshI48@A+w_?h5xJC+@R|De0e zMq<=bGaUgKM) zla3!)u(*^uGYqe{<|o}w&?I2L%t~^4ijfVIEsWxYkbeQ8f=S} z@J?GshNCB+%MhJ@OKGW>9=&f6S9~pu0v2SI!fO~`yUK`V?YDTmVZml$8#yxTZl1O3 z^4VZEVsO#`YeI|SSBj!BXmXB&JYBC#Bk7Bq;w$%s@6PERxyb4k+P28{x}U(~7T|t= zgufQ3vn4|*v~^%m50D^Jo8iR(VzQTBQ3nvxM&z#Kq-2srKG|Su5Oh+=D@ppwG<_xS zrL*sa93Hyq7sgp#A%{k5$WFPM?R9tqfw6e#)3>M4_K-BsOVjR+y4d)Mm)eZyesP?a zn(oDz4&G3I0{w>{YHJ@`5o%Aga(_fvR%i)35ttkDxU7e!J|rd8&ax4#{U6Vx#~vk#gtQ+K zyIjci1408DD|T%Z8eGWj4ms#ZF0`RZK7)94d*46kUuij+n`I*lvK-{rEN5>Msu;wQ z?7h8>cqSmG!N#0&qeUtLkjy+bUDnJiCigU2C8}~M#zO4Fh4?YyQd}14kgRbloa#2c zzrSB@cygLF<=$Ek%PS8LaJxI+;n07j8t8iU)mQzN zMIA4}`}5CXTxnpY11FWT6E7Ai!hZi)#dqXIwFm^>r(UegJZfzVolQ{6KCJz0EXZH0 z6K2VK+Vitdp*L))jU13$^~3FcYi0e+C%cS`+$4Osy|)eDH7@toC%dGS>8_(|{?UOF zFA?@X@U#$qAl*mE~&B^&Jt-`DElKfDmcSPC!VxS_1YM2+8S=w?Sfa z?X^F82_SoR*$GtwAhuy$jW0e0B7_xXrWY0T^Vas_;DIVa8@3TveC;IAMp_YG{tQJp zwlF*Fx5D5n$%5Z@p*7p#uT#s~Ghy)V7Jv#Q&QOGQ*C%T}CBlblStQhM$vN(~WV7mo z4=Y?PYf_0tnW=Wco5m@(s$KHe+^p4K5%>Olm{07KF`Y-wn@<1Oh1ntK6{=L*(76el z%wJt>GLzV3YAZ-!KMDKCKE>t|s;vFWsBfO!+Fpp$k=>f37asl!W+iaK3RBYViV&ea zI)^8gTXAC81Wtenyuz5k=r&-_&5~_7~ zL2AvQzV1J-uP`9R-Qv$U{1wg*_7_IOa05EYdI%!=Vfe4*Jlv4>|3}>;*KLK~79?pC8*oKIH%_X zJ9t!0mN^KBh}$-#)SSr>?KNkTMR-aP6Kc*3k*w3TuQsGiZ*adVM^f$U9|X#wXVv#T zo$OHaTc`3X6aChOv$ekxA&ZzuO&!jN=|)~k@Fy(P!uH)EnP#(dw4pM!+Up;&AW6^D z{@}N~gS*5+#r>G}oZqq#daZ3_A!43m^{&`*VU3)h)3(-}$riI~&Ri}2sOHQh@sBlU zX4oIO5$dctBUIaJI_|1DW45pVF(mjCJMjE$wm-E)gkM&teVvC{W}R2By>31vLT&cC zJMnATwvMmOtdr0cNM3Ul5w;TvTFzZNT8><@Jh`T0QeK0-P%{?*Tp$PRMABArT7hgA zRy~VVoo%lZ*~8WLx_jZFL(tKD2OCg?%}_m>LqSE-NFr?AkWz$|ioJ@k6+U4P#z&hU ziOuuT=8L0^e;I3>wPTC5V`UFBsz(B3?2mi{bUzB6b)UoY?2cqMMyw0E05fi1Z_&}* zzvCLb4miDE5w;ogo8(XK7z1h1sT>DW>0ncN2sJ)@$0+G)~Q8Q#7gkFT`f8U162jJC3?sK{P_e?MNEegf)S z*zo|?o3e1W97(a)--n@7ih%T=W-W|G*yP-MAjQ60dR1<2v!1H$_c%?awL=WNMJS!n zhHr4cy1N9DH6HWxQShCfjnnJis0<_S=j!*^>prrgc%Qc7k_|%d)Pyw&{lNyIm$kdHjy)8CobAX{xw^ikumklGQ z)WA;Fy%XMFeDOuy{jPn->J(CTfP`}z6JPTT=az*TN9z5(k_W{0j+1Fo-Zy(&u-d6I8Z-2)Pn6dtllvU6x>_;*U zHAti7K#NHlCI>z=NvUio2RfWAqb`jq=*{P28IyA>IEl->MBMIAAWdr7vBiq;uoBp) z1UA>})eBYWLv?b2nh)e~lYK`bTTq*b8^~UReTT{ZI}{YMU)V)aV>h z%C=S2_f)&;53RZuS-p=!Uymg%)?lb(Y-*zwsR(R3)YZpAP_7PtlY3@B{-vK=HMr&7(aKtQ{XTVlT8bj@4VX_Y1w=G%NMucsl&&D47 z_Tbm4XLP{XvJ=n>R4*Oyo9d541B=ArRWOx$VO44vAbJFPs&Q3BIPxw|Y?Z5V<++Of@i-!hY>WsQYND^jsBV zF^?%iv*O-crAPg^h{RmX63j6Il+>qEzq`e{P(5}tVVdHLs z&F`?f*sNu;?(D{D{1(j-`-GO=JmV zXT2)lZLF||GmnOaHau^$?~ok%nO$Mw2)>1dWBd32^Jb;22GH3Hi$+Xro?*FKL|{J(dDK!K zC9R>3G{AMr=Nwl8Uw**I-?z5`YJ43QwxB9V<%+_>V@PD~ZE@ez=y01%VPPwhnFQP4 zcXe7rp@;*OhsYLv&d5o-{ew{NF$HLyunXxm($&@W-eVsiC56hP$!T~;Qfene%0xHraW=!Zb+;hoXYW~8BPUWxEEP$gJlFw;L3Hjl^OE2Pb^ zuUW%N;JIS^4v;9eRk;9hVV%@5)9G%so(^oc%L}2gci2M8bw39?l3gxf1UB%Pef?D9 zX)DrG+95D98I&>#dj-nKWMI2A0tl=fu*0CGUw2%MndHE8CTUb*jG98WI5mCSpr+lG z3e!C*(l$kU4oKQERccqc0`-1gsb9rD1c?Ow3EFo|0jb^odW1~x1LCUMrnrE%K1V{! zI9C|R>YjYu8XJ`9Xm5yQm9X+qQVv?=4vSG;vEmK_^?MTrNTh9qwT+~2$VvK ztFOJ^ptzW@`flP2l5p>_oI^l!LD&#?_sM0*u!u1amJ!eb7pi&5ULcZ@X|0?PX(qrCkw z%KKfE^7bgc?_!kq?7If#?EzYil-GT>FiLsPGRoUS+!023zXP~N$!=shmi#U?u(^s! zeciAE0HYQ6mw?n&O5khl3PxQwUr1dkl0}T!$Z($oo*-;V)c2s%D)&w;5u=R5(h%qe zcz6S(w#pT@KlChMRz6?=EG?96{z4)-X8@IJzcNT$w-VU(0b?G*0H(}VMX0le0P_vr zA+Wv5)nc#=M5wEB!KN+e#PR&c=i&La4A1xcYdjwoT@05%rem>8EJnMOC>7Wm>jmC8ZEH37-|4)ejoOGB5aXEmgz;f%?n%VgKHm01eT%*3^->u{4L^| z-&o(XY9b=>;qM`_^|-+^__|V00bWWBeSr(xNXj<)O^a{|EUF^zt|+N*SvkD+bB0!D z5v_puGUAT-WUpuLwPWaIuSaPaQS6;KiiM;#te!%KUu#HN*Ptcx6t0ix>evE6C4q(> zq05Y`!`Drk$v#*gxF$5X-_N=i#*!VGrM3h}63VkXn(xG%%7O^%#cKyDo~b| zzZrL2Kd%HfAqEm3T}<|p<`5lgJp>bJJ#Otu{W!G^7nYCClm12mAb{^O78y(-fcA#o zPhpdQPFG(|e7nfrgWmwP`D`ozH1*WMuYtz2&4Z#)0rdAXC<~jSu|y>t5^w|PU)#_u&~w1CK66P1qo!YRcAd-ZL{_e z;ltEZK+9nSL48eR{b8*2J}EQ7Z9NZm&aMi7+G#EuuA($h?MOl ztxz8wtCR(mvUb&Zb7~vZu5#ByuTw(=&_bXgng(F?X$|Il5ORwYOx()iJP8zb;*Oh; z;=}L)n>OU@uv<*MZjGQN*W~6(e6xAdELZFD)9}aTSLuoUW?;{+YN_e4HWXRyyZ1EQ zYQ~$_aqjJ}ml@n!P3|Nq0ZaD4-+n-ce>?L@lR7LYxgIwx)ryZqFFLyUoFJ;`6Lvyb zydU}j>Sxgg&ypJM32|b=5Y*82ge>^P6nQbVfLgr?2@I5q-&O9uRbsZH) zxjqt8U5BL+Lrk|}WThddJotfv86W~eOV-7idn*^!o-tu$$TaqAfdYG_VMA~fz9zXP z&(}00uO@0pB6r$;^KqcB3jHJQ*{5a1;8F{(Nsf1 znq{z+VtlEZ^Kf}u6kZtPkV^N)&|&}|%-u|SXF z0<{?nls6VAfP@?b+<{V}4KhP+DKRyy!4h9wi8XVkC;?yr<&WZhL3ztKUCj2W zZYbVFVfSuge*G~C4I(RO&Z6k$LG}JLG79#WMvVh1+#-M0m+I!b>~9PO2JxHtZTEbh zEqFU-=ob@6zC*M6Een|)t!PnF*o{0^6&h=d#QI?JjB3Ob(zeAaYUl|YJz~f16CJ+g zoUX1;L*r$+y-$Sgz$VRQB|k&FF#M~F&@1f|KTqGj#PD{5fxwYlO7_rS!H_CQ7a9c* zbl;kKAnKX@TUvYzUSG29JcHo53trH(Lz?_$pSVEow~6yqftGvd)FDQwjB@(I5Tq1m z*Cm+bpQWLV9v!vh9A32^jlP^!H!bndp+nI8kp2YQu3%ml1?r*qU@HBj!T@UQx)Z&< zpWSt;KI%;kPSv*l$JDFa6pkG%C^GKL}yU+-sPR`KWa6j`LqAu-22Li;d=5r+3BZsEa zr;qmI_2TiywalF3GvYB@l42oSc+$iowuqJ-BP3LG_)7j%!kl*NOSzII8@DF2%m3@4 zLWXbX(r4aMnj`h=^w)o4y@L0gppv8%av1u#(4!RI)lhhwQn*kloT3yKEw1b+l42e_ z&aeHIXzf3a)^05J5;AKlP2HvIvDMEK9)BMbV)3X_(WAl{0H6_%YO~lsC?3_@X461C zs{JC1N43MtJl6OfJMY6e*oXewJ|=S*z_sRd>f`r62h zbaEhb4tlgxgie6?4QT4Am%)<8Uage6Z*^VDxM9D zv@0j@8t_N!rx5o^>?F;G)@hoTc}rw>@aFnD%JAIYv4sD2tb;z0c9?_M%dTI6bc;VE6VMeCRxJ?|vZjh^U=F)4B;l$Wmb7}gAY;joCRed#&zJ)uD zmWROFNAG!@#aWr`jTSoFZxj+UpdDzzK??ZXA{!9%X+^s3)hsNITnBo!9JG=f5R1M+ zzjUV%b^H#hI1M5&I%iMVwDT#4BVQ@vlp?g8RElg`0^7zsB~aJj5`kv?sLTj)BJt?C z2~sCokPx1#O)yoUF*g0(0^n5r{LUA!rMh@as{7j}bcB`eRuWm^mIDzZ#sI_e4d{v7 zfzhrFM^An`IonX+Ayy?39X%9qN;$8T+sF(D5MhLBx?1kc{={`=`B1`*C{!$RBj>7i zEc*t1BOM|I4)lJlRy(snmRXNl_*&PU%kOKq*FOqVFF)w8+UuF+#|-DRjD*K85l2qD z0)K{18;3u5G3zO_RHc-skq6UrOVjLih1Ah5AeMug3&e8=8#8T#*W#jyFIz2uWCXCGD>i5{|*Ze8M!o=6!goBiRE>}CO zQWYuqSA#3mSETDBi|_^jqRfq?I1T1yg8TsB;B*{@n5r-1N@xurhBmCn#EUkPY&ak; z(LKDrB8{#X3m9J6L_Jdt+==`3T>6yZ*K_jP3vX8gBCy%tyFU`YWIgo4T!426L2`1E z*&KnHpUx?OJ}D$ou_#01?weR7?I4hQz)B2`r(YLg;b6Nl9PC?o;AG4to+ z4HjolqFI_FSErdofvuhbz9*3r$Dp4e$wqgfXM+k43=T23z7&R@&py0x-iM##hY56{ z>l_RJ9~;fQ$LIw5=eErN!W|ZN z;@sgOLLjIFJ`4*jXp0*b_Tv;P?l!=to*ejzF3XXC?`<;iM{olS+Wr z1f1xZ*CJl)UqG!6#FM@;&OuE zfDV4Kls8&xeza7{k{AA%?1+~=hu6Y@dI~2!Fd;W7)f~-XR|2Wx>um7#u_^y(FN=0| zlLr_U02dTYWVtF-_pz{W3{jiXG3WH1k8e+Qz_!F|hiOkP(!BJYw;|jfgOWMN8Q2hF zbZ^@^J(tDrvDdXCXZ;RKK*q*Unb0keKx)`k#3}B1GurKSFJtmA2PMy+fyr0~fOT}} zIrPhP1pW0hlqnIX27 zId{qk?01WiL+-@8Ft9dMcRNrYq)N00WPlH_(@LP-V4>UnCPtz>xClnGo6qZO9b7)vps=_9VH$XO2RRuMoY`bE?x3cG608btpgB>EAn6d>+k?HNWB(`wH!qUfkS!>A%(dxnw4 zyLG9>Ad9HAHau^l3W=E^71_{wU<1~cYqCF5Yr=KXLh@{6DNrgW-CPB{WgppBuCH+F z(uZEU78i!F3wi@fT8`LPB>L?O6=9d^4weA8w$0Z^dY~!w?#EEPb@%1`iCR;QlPy)) z5*D^hzL9MNo9HcRun|l=jvK+Iu&`+&rqf5~!bWiD`uGVJ0M?0D?Ty${z*6gz=$8H% z<1C=Z*(5o`grRVNF!DQJ!kKP^O7I3D3jk!yXeXP>ExO^-9&d4Aq#~HK5#fkV*UXLM zBQOqGX9pN_lI-hPWOy1P(MUE@qQN0d`~B~KpR)3&_Xg8E^o?II&Pe(Kw>$Jj7TxZ; z=~I9{VWAt*i=mV@*2qxvR5U}Wkzq4tXgeBpKGHBJ9+Bw$Hk&5dtk~uP51sadZI1tU zZGJlHB5gY7#3IhYHgssZS|F}>EV%@gDhKF&*JF?$c(C4pSQ~?t8MsvAu3PPD+tu$T zJETNk2e4x%U&pm3=BmUHUABxU+!y8gPj=QU$e z6XYP42+FIVL@|qJ%&QAI;(`eoq&OdK9$Gi+oL;JzauwQ-K$?JQe^c6Y=J@oO2+2|b%n@hty9pC6I{MO^~yx55ofI2tfB0dSj90r~8(4JYC z@g%*?40uuSa~=8H)^Nd6d ziNBCLdHZX(W^rU@7B{|Tt;sa4W~>S1tdFN=RS_<$N^W0UB}dk(cV+QXe#elBCevfF zvQz)xl(l!flWj7+d-hp}qhs~8v8NX%nWFL@axrIejvLo9!%6L^(x1mGi#ggjpDA{f z#WR(~bKfzo&u|#-s6db>VP$O=!w?%fm0=-bqQ4x;FKRNLGsO>%TB6yQukd<-O?6 z$T3?=pu?~_=EjI8v(kaS{Y=;6FPGk-8#@vX{Z#Zm>bL#qmdN(B;g-l_%;W<6iN_)< z|Q@b%f~YT5GUnok4YTus`QA%RX3$i-W7$uDp0M69EgsUxg9Ev&Bs3ar{uWH z*VufVd^|cIO~c~z0aL-I#6u%O%-@!6z|A1tl8onO$RRCvkVI0Mt~*GnLk)D37RZLF!iqQSyi!ahYnFsZQRi71gp$BO7a~zw*hPC_7 zLBm>sfZ<6bx0((51buGc>j`ZkKr8M5D~%L;)Pe=;@dV}1$iKDHE1=IBMiQI_AX&W4 zTzOF->~>rP2&ZR8Jz{}am}k?ME~S5{H4X$WB`r0dS!>RiC5PPJFQ&Q*JW`^3o5N`7 zG8iR#-}PhAzE~v6`06Pb80JTJ3>v0~4KueOI>`6#7&OSq7z}Nejn1y=*DpSRbM}i2 z;M$q-n5qCGFR2FL%w>?O-?MhCgnfM-Ifejlj;X_OUaeRDC6^1fKpAXhRinGgV6AWMmNwCoPVx z!i%k*A-UBHq#?M3{`qrULLTXx_~Ic40ebV5*?BCIQA~nlE-S-A1ie4tSz2FiWtQZ_ zql#v^#mpcIU`VJz$qzqG_mbkga#jUAsAUlrx7R_c9e~r7c}k^&jx({4YpJl;x6)ug z3zT($9*0dHDiGuTybsO?(N?}Ak40AEng+2hKpsobdwMdu`x^($z-aWn!^yWhOdhhA z-iJ~Zn?bq`D%DOK6FK?m=tNE)dJ$i)_e?*3IReP*kBj#jzGHcIJ~osTI!Z}Vx{8jary7eZ8ZcUWpT~nZ(QINFXx%b$z8xUtyy^t7ef`AQ#2~U}N5x zFvw5z1?cw3kc;%PDL?LUmRLwpA8E|a=j7Gs=P$d2&$h&z1R#IAM@Ro0irYr=9OS51 zDeEJjpee#CNC4KO3kU}C>>nZhn))nh$_}}N$cmp3I}y@cE#fFS2pE^od+3O#adLqz z98Svm0PGd$YPwhP*^u@?ZU^KZ5zqa_Q_!X*|e@ znWP{Mr3!B2hCFAM8H6qwQRs3_@H+)$%f&$EHo&y-LRXp+7fY$>oyo&f7 zgnJV&67a5lVwO51I*!X=92n>YiP6vkSMRcq_Qac6*%PtifyQZ_kKJ1}xMMego~GP~mL#EHUa z^knig#zb|k_$e7`Ow<7A{n2)%kvM+Iid-gakWvJ#QG_lmfO9oEULZGGz+TT{Clna- zg+c4teA(;KbI^t|JK2}*?smDm?CbG_ukMg25+MRZ&m%&&GzJ=UY$$*!=s9+2u%~TY z8}yk-kvGi1WdgoMXQ_b{IX8riOrZ`-Pg~Eyacwo9nISV&m|3?+92@Jv0@eYToP=DV zQ_3U#iqMI@5D;TdE>AHl+=1=<^>cJ`H0Ck3-6bC#m^vyCD4N!8% z;4Iu4J1Iw@n%FF)fVVo$B+=RkVu(L&$%OC5I%qM*`3>+alw^?BzlL$jP@(6gfj;yH zdJHf>zb`vr%l;=Ra*$b^E;)NbW@#v}N*+p>fN#?-MW)eH+7kjUgWitkLJ72&eM5ho zm*GT|(z|sG#;Hz*`HJZx0KEyk$pPTwJD1!AluLCVqZ5*WBs82xl5osJcTB@$gHB?~ z*;6|O2uaZXM2Li%$lVl0h9!B?LhtiXXeJCv+Y=+94kP5k@tmFl1(xzWjzuqC^EA5o zbSjI}8WyK3D>IbES!}=DId@!!1GcnD1*OW$3A95xrz?dvwQ!<`6gron!q>axmX>5k zs67P+vuI&I^T}2SBA0X-l0L(sDl~$7LfjkTNG&xU_=P{;rRQOgj+bouF6tDqEqZPm zb&8oO!Y-Vcz8bktwm+6*TqavM5xXDt>9m5U*GbGpDp$!EZexRHku+lGsk`qPU^Vso zZQ=YZ)H@q~J)21W1a=-|ycuBg==bwVej2?6Bi&UD;!rWbLB{t3$v%BI29nK)1(MAP zmaF$?)jSrPkkNG-@%?}$dojPW`SzlqkA_v;lo!MMg- z;F$wu#f-70^I4R(e6(OtfQb*qoX4v7JM`2 zn(iBhCWY{ zr&`P_q9+D%abv&>H1I=(#F^;&XvGLJ>sHdp{6Ocr+9ZxNYK%}sQK}~~O&mgJB(g{& z96-B?Bo<-J*CJ`W->g|M;x&(so1gy;I%~%Bg&{Q!s4_Df{*i#FL?`wX6G&pEM+}s1 z#du=J>Y;o!zt|{s-tqp??2)S`Q&y)h9ysw! z!w?G0X}|bW*j43_gXDABW>{@W^qKqcP&OwB9lf3L7tbM=1Rd)FsbQO0E0!O$-M!2K z|F2y>6$(@T2wBv~wpA10< zS53_6v8JL&R=xT%l^gn0ukI?diNi4-QCYBacFr|_ixF?sc8)M~oeZP}9<|az zc5gGGBVvj7c!HJ5InVDoE6UXSYUOQY_x6F(cm(*p(ucR4 zAN|IL0LCo@zKWUj*i+2E{6t{SfWwJA-lrDTT>B_VMWVK}bZd$rZ7tyX>O?QM(gZ3WcAZsN@*;Dr#lHZgoe#e;Hc?9=Bbcz@{G-gZ3WQ z;Nf4;EVu>|u0d~f4QQpzeG$$f&OUQdU&Fc4KmQG^bF=7dLJm5i-tmDg$CV)RC>z@? zIJQO6#n5E4TkW4hE0{5%0xKKizStPwjrNB{5JOBc1u(_61lb{{c{SjkVnKCCh*Wq) z9NX!{FXvU~TOh1b?zV(9zKDrGeZ_#GlVl-t5J&zGytyIj`uL^4=prs% zPm-)dfDi`(z6+O!0A7ax3!=zYgIC1UaoMc?k=Z)r54Wax=a5!%@UTiba;N@%FOyp5 z54T#pSEHrc!G@3Ed#jUqI>#(&W3hR~FvQU{k2PlTUP)Smsxew`wA?Ay^mo3h>3r7o zOziFqy0I~p`|`4_vCxgaYBQ(IB#%7F(fCOu&q?5ySNHrFN)?$EN2=mZLpvw8#Vdsz z>0(bZ{A6UjpDcx^!26q>^!?Ez$xc?SglO?{-P9LQ{|P2Kn1SK`@B9FSuB} z_TPY3z7ZKYIY*mcH|ou%((!BklsbeG5w^n%fch^wMuGWCJ!u-!Am`IMfF~MRkAZsC zaAj5EQ-N{K*rNC=(`FYXN?wDdf+GY=P>L8nvq}L7o4^yj({SN|zc^Ae)&6gCH zMSTh~Xtfp)h-)R)!-97F5Hk4oEJE7lT^+vFw}g{t1N0{hB3U>9s{~lILtmlr4C>NX z^lx8?<~GTbsguMh7+UH{hJ6F!8I%L$F%$+;6jFB#`eq=eww!-4G}MJTGKu7_QtZdX z<}GNi^t~ajVe^`()nLdT!3mJ3tDWDaO{OfdOL79Rxu|yEVGp<2KQZ{mjN%hE+$%*# z(Q#?fF{P*vPpsymfmJPyboJX2I-yq}LeK}n(?N*M>mgS|-6x!PHXRJ0Yt4#^yN4s} z`%0|YZt?XQ6nm$4KJNSjhz`7e8Pw!YG`U-o`#kDfJR%0M8JSL~Ck6c+gV0V}vm912 zcNBV8nUb*dqGFELJ?@?z?Vp)EP zoUhymBiH0(zVCH&Fi)KNqu-2aioFk|!~ccVgz0l&FuS+eKD~!*D`8+~Mc@OQTHa4Bqc$H*k{sTT2#u9Yx3>Mwsl zo2g{p8_U%zPmgL0Prq*1ZV%IY?EeUsJKOB1IW^;p7%b;gSRVV~L|AUW5C_X-_#4A= z%@>!2<)ta(u>8)e6JUAC-{WEVbPSeHM`5{7Y`*X7V41JF94w!1vv)ICzM8^vA1Up` zyAeey!g4|s3N6e4;zkB77sJZR5)V0`F4keI4e4i*N=i>rki0HdCLSPJ5hOrZ*l;D97`bY(494p zLW~SMM1|?K1^`lF?7(fEQun_?-Cg6Dfp;uDMeIlWr)U^#al8F=*aWjgLH2(b$l5>% z)dBV=f@(m|?Ev%ufB_sBDz%(uyhEgkBk#}d8lzyTrhFe^@^lO)m4PTsB34Jvh6Dlr zQZY)*m71LHiTbq^)H%a3ApALUoc2@~V_lrhnw+FQ@OP>XxB=m#o7kZSbGQZ=U~Qd% z0Sd1@$ATAWavHP^H6x#@)=@MgKLqcPirNL2>SI#Mbi`Igqm*4NW^;Cf-?4@q1eVt1 zccA5g8T#N<%U*_A!!wb8MaqZ%d|T2u^eadnf03?dYR!oY!{uYrM8FX=Gw#QzT%z{3Hm zmAScB{nPkZPh$neu&qn6kqFG&YX)zTQa4IM(2WI7%7m#KjYxDxA>)qjre3l6k5I~^ zMqV6a5kKW_s`_9sb3F`@<$97W&1)&%9K7=d@}u|G!>VGBFzi&q>TWi~*DbI1s4u?A z9ODDMh%|S|hp`Te*B-4S8_=R+w@j$SF`bFt9H!*#cBRfj7b!zuq%K;{5-oSVNA>&)7YGovd@OE(wi|JQ;wD0U?$2Xd_;X6F zS&2fa(w$98BGAiduK0!Z1|iU@gv!QyC+A`d<5mj_4A zgLM6Kgh``X&*G)0@S)4h z!jDhK&BAx}S-1`O`y)^2^RNWEOC{P%CjqABqItMR{TX59E}n@WzM#*9I`iYH7i7XdhuN=>XZ%QNDl#Sb^p|Z{)aP?)aZ%^1AZkw$M~NUu^`{e?>^Ea6nW z#I*4eFR&7m|I-joW?#jpTX(dUqbf|N%V?TS&eUk(RGZ!Gol1k+AVAOOD5{)O!|9@z zTK*ZeZ127~pv%P2@xL==16wiD<1aFokVB+klM@!`)1Lug-(Zs^Zz?j72a$p79it{q zw{nyVoLj?T9P&d>_2TW?R;a8*4?#HHNqy@40Oi&=b%;cv_2h%4!5{#zGbWDII?3k)}LLZO%vUUKpWBeFz>& z)V=Rot^qOV9WX7cX+)&a)y;t|Q@09@V_4hzq}}*~7wG_8hCJ%nyl5N??~G?rqcTdn zvT6R-c8vTOZc#tU`%?2QNsuS0Q}d&tV0;I(YG^h*2#Art|;3r(&9N7Bc z7QT77c5T$xJB;5FAI2jW*21Ii0Qg=Fr4~Uc7Av~&S>P60$N|9d^V>1L%eCs$dC|62 zcOF{jvSSt{aehU__XX7T_c636qXAuj9lv2hJ3V;OH_+dsn;1>xPt>fcF56OOkM(McwR$hD~cufOh2fMIi*{vDI zfVj64P{!d4EbPnbrMM8@ZdXb~bc0Y=-*q8FYkT1VcW)7AJP7XXIr5$sL$!Z4oS z5WC>P^HViHH#Yp-pTiQjYhka8q`Cny-&?cPrKZAUlR?19t1&?Ba@z?Y=1ci4Ae07{ zI1Ds?)TnJ~1|-PSJnBa%jztjM6q*TW%Y#{UX79CGOEKtxcdokmSCrW+R`=&b8-_L+ zXV!`$_+wB-4X-}8>`U!stOAdhkE59?t$~v*@Ub303i`(Yd?b2n-v1OOkLtz&L8n`raf}6h5`9GxO)a|vXZ!{Z)dU@%jY2&b z#vsL|z6~$Xht3FZH*O0v%cnsjy=z>Be#5KXu{Lah9$fqz(F2oHfOp?9btI zQIRm>^7wNNHM~>(DQ?gRIf)0{vQU$(Ug5{1%0v`#GDn>1gDJ3Wl6)b4HQ{fEPJV`A zTw5_<06mDDjFU!>F|foUyjDRuu+R&dKJ3XPaR;B2z0{lDgtE3CX`+Xf%sdkugGHfH z?prhI3P3{mG-FYKg>kXq5~u!mG%mP=AAwGzO2QR)%S6sZ}60%Co;-lHP0ro4Ul2SCJltxJDkiYH}IY)xj zX$5L&WQiOkbrI9>q(Ssyp^=tJ=h0WhK~tA$7=1+yD$|Mmlu4U(Ua93xEy}~N;EG*B zKM^+jDdzap1XDGav{^g+>kPKR^$ET)-6Lu(+V%4VP>7VO)_~tU6FOo$xSqG|hYW!n z&6$ImNx4B1=kLM6sXpn~hlGe(J#@ z>bGT3nFO_FK!>`ZLy&j8PhEM~r!H?&0hWhW?dC#A(d+`eQ1Mu7eh&bh&Zo62%O%J+ z5*JS(*l=(zp{lZ4$xor{Ta%*RQjx&DjJCbjzyxRg@9O^V z1>dQ`<7pY^#Ckr1Ml9-Rtrn*(%iya;OQ2d@Fgg7>NrK;7IQBbZ5&OL|hyMOoz(jpj zz4-);Hna0vPiAx6q)xon&NYa>1t6DHi>uqK#j=A?=6tnyFZ`}P4A0j%Y5CPX@cgYc z^!eVFYOy|oH@)u&e!vGKiKG(}p*stHx{hV;gJ-C0HFT_O;4J)}70dQli!-{a#UJ0& z_Y2I^JBH7L^!X?}*N)r>1^x>%LP7W6ATt&UHn!BGfzxF!cdCq%%_#W!bqhWn&USd@gDhzNuodz>nN!=$pb(ZMVI5?=q-Xx+Tw605$B(6aCfj;Cdd`F=>j^i1*7NC! z4mA@nSC4ukINbbQNHutQcsVoNk|P^?zD)VdYwYRkzxwqtO~qh!lLB7L&7b)qMz3-B zf1t7t!aMs@;bZ?F;J@SD$GdyK6@Xr_28^vepFy5e&mI5k8hCwEF8(n#H?iSTiI}>G>QDGZR^_qIIw)@xy2Ep}(gu{J+P$ z`|EaMhiK=@F7ARs7Nb3#P!-=_u=CPkn6Ps@qiL-@fu0X~zjXp0PxM?ovZvwW=y+>8 zp2p;!j_wa)X+0nG3}O|d-968p?E9rWyC-mL@>!@1(@xMd@8sR6r*GZOA&5kFqs}6H z#_b#Mk|FqC0QhJBKX-hCpnjT&p_DAgtA*oLA)&Y~}Y&v>rq zulHid^axj8i@NLgV_JiM34AoEs7o&IXzl4Z{`5n%-^WWI2_L_tbhPjsb$YC@q2X2h z`BHVUI#>|ks#%9?S(%gh%AFO$@!-cgOkHngaJv&LA(|53iw zti$1ZNZpWiIBTOI-wySxRHyQ2a|c{vE(n&x%a+XIy=i$njKJS65_fe3KM=$>0+ZUa zip=t4|9UMvN8A<6vYWlhc^DN4#Mus(AREcquZ&SPumD3u0}C~pmEZ+A*DGnaWcx7^ zGrj)Z9!}UZSZ%-)u{WuoCR>a61cn^}3cw|@j}+6CZ7kAqNZK3>sx9Ju1{;}z=h zMCb8}LG3U#+wF%I)t}!S4W-rJW1yvX$4WzubPs%0CH=oK#5aot!`tBD9eC(>qZY8V zJNk++3(o<3w#7ct*An&#dmVn%r_T0P7kWK~7{K}4KGnj`BVm-@8Ps9+64uK!EP0kS zoPp0DUpn^VbNk;LPwjt)K6fLo?MJQ@M3f%&c&c79HVW9K{d?haLMoc#M<$Eg(AkHU z(M--JOM0Kf&+Fp~|66q6JK$jgfL&tq;+}x3Xk`S-1Cme%vmx`f|mlAHlkI(~1(HqKC_&b~RjzsG|Z($Yqe1P1K(N zx@ghWtGf@Ac3NDXK0X?>?wJid&P=_whb)*P;O78*hRTnphLcHADz%tJ5=j zydnZqOeO{-gU>GokpAq&|It_rm8(t<^^8Isynh35l4x~3P*qvM;(^hNuX56Egr164 zH(BIV+svrv2xKQ9K|w3x*0}mh-0BY9Ynp3-C)DprtLp4Nvj~OyNXd zz!)~;4Hw z!*~FrVSFFk9E#3H8K%21y%^K~9!CQKiWrq9LnS(uI;9hoqNKfAP}wJV{M zL(%E;3fbviK08@nXglj&;BUqcPCs>}3_m!_0APjN5J)8l0z>l`U!pAm3k2J>pPFs7 zs@IQ=YBBf%Vve*K;m=GrN(tR4A-g4MW&)?!%@zGW`vu2+gZx}He|3C*c9U#v=dUr) zv_xzkHR*X&z#{(yJFLp@$f+#H@UN+Em-+xeE$PNjy}()(S*nzq@FOXJDzr}6FwE^! z{QhtQ5%CurqVVo$3drYS&u5+?uzRPWx^-*4uselA!}3;-zf@T1EK!ecL1i@hE1=ln z7QEc+Q6C2u>zw%Ggk#WG_;ya*%HLl7(g3_wE6Z+2wnte4Sc?sx8p>Zr|MIo{N&Jfb zESuP$MXWz#rZ2UZjmVAW*xh?=PfI^C-1o zJ27Q9UihF1jhmzt&dAlL?B=6ME{|2qs+Ts@kwU>=X;F$sG2SLI;r&I9*+;Rl^;7mO!pRI(F`|d@y|s0`Oa0DfJk%e> z?J$Vp4XCT^QrsKp->XtkW)2&TFx~3p8n$itW=&p%{3K+WGHl?zi3(jawk{^cVJ3O0 z(Cy{03VMF;QnrZmi33k=(i%5qJm8goEKeuJi(v`OBxgwp$+56i%NN`(1}@RQq7Rc? zN%1yXv|K5cs_%buCfb{G+}+yNYxdyJ?jHqbK9G5^v5n)_8b&_I+<&;=v_IIN`hy@Q zmL@#E|z-)8OCSE#i`5@FXN_!bKYi#d3{F%54= z062DI_bWyr{{pfi1IMjxT;R_&I7@1HO^&FmH|dq8l6Gaqg63ZDWVbr>eTsLi!@xfm zWGIUpwSo*Z$O?Fk%A!ir%Fayb0*wzYx_$yZXt)N1LG5A!#>S6}V~>RFk@B8i&Z$p@ z8t@@R!0r)zYC|w0=t2&~mv7;WqoGLi@aBY(6TSmlv$i>L=uceI0UWJ<#DSg{ssGyhS7>4ODu2n_uVM{ zN5_mV;^wU#9+I~PZ(8TAf~C2GXtp-*WZ059i1N=N(ZvZ7S8^rWh1w}( zzkeg2d1!gC-)h(; z?=oHyk9Sj%H_J7n26V%{Ku1exla;6?jfdhW|KpwGR9}xPZicc7KuS((h1Tb5kKw8D z_A}h-*0=&Q(B2u^+i*Wn?F_nIE@^B+`FU>jj=1vEVujP_a$TE0q!i9_Ae?z!{ zrNOfnwk@r`|Go#j%a`8&z33m+}6mN*|CNJ9Ctiy~-W#Qc(QyYl& zFHHq_LAU~lnLpf${ykT$BFmSB6G_1;QkWy|M9iA1m|u6;WNCc}IMNm*PB`(j2m1QO zOl7@j&&~K{J_^x)HaH!ZNCQmkbOT1QkD>nvo6)o zjn{uWt$#^e{R=17e`Q?#$X8gq;;Yx0*m&@Z+kfe#_+FTwSq#aPpywp4)#i}qbj%M% z_g*Q{UFBUvQXuzLZt{~1YoK|!ei~W60P*EiuaM&l^0u}uLzQ$ym%@9I;DVxgbgz1C z^y2X?)G5WcflsxqmTIpX&J_gjJkpp3M1}?YguzV(2~?9UD_wNB7LfLC4wPSvP)eiL zQXa~zE+OuFp^=-iiY4ztl4mYiIdNR=fD`5E=)wSYgk<74N^;C-R%fQX9||a!#jjTp z=NfAVpa!}Qlh>**NzzKj0k@MN&erAkGj3L-zRdc`g7>N(p@_@eX5wsaX-jf>bZd_| z1R5sddko)r$fgB8ZOnUjGsd+lj={j>wdpY!fQ~a%rM-!Ub)x-mO34DiT16Jzs7WYj zmbg|@Zb+imUm#c}vese`7tbfX31_8zXBE=W7!D994xrNi8fC6h$GrP!{3Ln&*^k;rYVQEPt(7DL@21Q1--Lg|Y4)}8wvqM0 zDnNTULy1&9VZ8)kp?&>O6OVG)E>1%IfrWw4`2MVkg2Q*I>0^XN6K-;^)kEsw4-+WdWL=tXY|NVn0Cgi-5jTK^;{zBZPtXAj>jQXCDM|B6 z6dR^cBEcg*W)x;3i7nNQkG*L`d5V%EyweAqg^=Zxyvfvyw|r(?<)-tG(jMFl^zw_? zbe!%_Kzd>mUR@c^69lmduPIdf-Yhd<@F2mTYt%(=*^D9RfaE;-D&+7#$~9=3?UA(x zRFTt*jgLG4&y8)E?l*7nFWxThO00%~Jm9MrIJuhKdB2O?vlhhQl{K8Rh69SM6iMnU zRANh290D4W${Da#TxykrY6E~kTA&iAwn1>I59jFOy>~Xe;^ZHbytOc}`xU!{B6$s0f@5>32iEEXljy*%M_)B~ly8p??Fw-h zx-8g$%1QNwJEEhT%fzA-Cy1a-^I#2x(47G+3(QhE&MFSjVXRgPjPT3DFAu+vTmaZW zQVImDSt&q{{41pUID9V-=KxJg7I!t^m@mce-bKR>$Z$j49-O;&Sv+wTk)zGw-4od1 zSp6=ty@|o+^2SYt>wfg(`{Wz|RNIpX__enXyA=E|!E~6UDA4UY`KZd6+$rF18oASq zzv<`1ALmKu#I00|Ob7H8{CbogA^DYsDDIEz{rt75@x8|@yF|ZK;Eu{3l&!72?0hX+ zYyLGlmwOJKKD1*UxCiyRr>|WXUpG%;6B;cqHa$ZjtnfB*mvd&dX}??Cw{A(bQaBUR zmQ))GEu?Ujp>UB$+;;&m4e%cfKa;{`)rRbnJllI)h5*6~mnem+#C^`0q%gIr(r-Sj z6lRP23TK)M(-h$F_Bo-NbicVoDO}dDN#eY-S>6RS=iTgOA$@U@!bQOk5=@1QmBO+K z`V!b1;=Vg)lDt$u->&3A{dqG@d1*=>)PJXiL zwxmk(u4GxE^WSj-?l%RXQY;|E3g`+oJ;HQ$Kr4$c#t^tBK&vvr@O46Dc z3VxCh>`O3RaF%$~&(u*(XE93wOD=}IQd_)=WN^K6w;OB#iW1+aOcqVaB*meMHJ7$_3X^I12yV!y; zX#lnz%SfmJaJ+Y(xX(S46fda49aDTad!yT@*hx=`LKDu0#`ljkpyVx4@>c!7*heIf z&SlTKY37TeLJHU1%iH39dWW5K2AA;)4& zM6$FHA3_eE{Rr#_Z<29}!=gAA0oHa{ssL>}mf&LsJ{3Z}01ubyJ81M8CD)?lV!2!k zWX{E6xmYZ>kmN2_a$^{(G^&3`MI`cTqkenDsW#uiHpRu_;JXx~Uk0DY>^*?m)00a^ zTA*12wAz5TM$d`$xl*|d2FrgXDd9sobRrcL9|a|kS91A^R>eSnV)SQ)hn_Ha9d4@2y9vd9)PGhY z(`!Z>)D3K%%(^}pk6~aj&jBiV9}h9uVXWR(RNNn@Z!-ukw+PdLF13^C5rjN6;p}!o z|L3v(&n8n9C(r6`?vj(B(~1FlZ^Zv&^@I4@%Jrw zUJ8;w1kpW`el=@<4iT`c9o__JISfoWl3$!~ca zx8g0F!8@CqLdVlaQViO)1kiE3~rGu!`AsbVnNT?u{ zfr0juGEI(vAj{TR*_i5k$3p5Nu#`|$_#R?MuOepr2u+Zj!tqwb<~o#-wieO@b;8E`=p+W=d@T~P{_g(m~sp%mnV3YK9C ztQoAIyb#81@Lo$cl-1;*e6ewf`ehOZ|5OT=U>K2&+3IIWOgbsZ*4KFh9=H4vM@=Ic zecz+*Sk2Ukc;D#?fN6g*fG~__;mYWM!i%Fr$sBg18oZNXKyIg+JDc^^k!ti#gZ3a5 zdf`-8&!N!oFUWyRX-jD)GzO4IK~^E#@a$eGTL3$%5`Y-}CKoQn74fcEic*8OFbYlb z6zH?WaeF8r*n`8Zymvax(!bAVRSuT3gXkJGqPw3?otd=hiO^bk)R4J~p2x+X$D_QH zL*<>@;v|M^C(1ilpw~Js>bQgn4VE~efz^5$d`agw2DY`r$ z?rh(k_4r3ie8G&7{@?|koDF_{mFaBQNX`+DM7AQboI?)LJmSv%v1~1P9jygJ76GdU zcwFX5TR0i0O9CJ)`=Gx*-M=o~_i@1YNx+)}^O;TQBq;-yyM7T!CBC3Q&+Bxxm2FU- zMhyCM#7n($%G2_ELCJPxOHXC_?kn`p>oiot z?xdQ=w%l*Q{`@%e?BUN%Fws-O*OB+&WAIaHEtc{>j^AwuOW0AiQ@!_22DgK5j~eLH zHE3efPZ0&x32yCH^|z4f);98_Tm2P#MEs-v8+%3#mb$GEuLzH#>kMFs)5CM1C~!7O zz}eUbFpxaPS|2181E}t5CvD=+L*mZX%;2-69Zf+1h1dmgXF%LJEbi3AoxP?uQ^?f% z?8tdvhpc^dPHqa1U%%S3xWY$MoE$j8$>Id(UDKd{^0qm8iPoW zOhI247gVL-hZ4vPz}OWCqyjG)pltX}N(^OI4B>%jB0Gt6yI_9Q#*=tAWTPx)kBVNoU6mWnJz?Rlc7u&;3#!d<&nTco~@o3I;m15|12c=cD1VA2zK z44Jw}eJn1I8S^|Gmj?=&)f&u!vWr_oi!?NV@Nl^43r#F_otY+^)f^7}3Q4$)u_`?? z-oZzYwC|*v2GKRnYGAmP&4Th1b9vQe&%>zwhv1?XI5tr|Z zb58ZsWlRODRaIW5PoN6wcHu=FzaZDhq7V6p{& zu8u5o&Hhq>EEmvjY~4boXtYGNJ9Xs{GaOs)#>jwy0*>0Q@<5i--0B%S<;mS8P*gjN zSzC2{MhaG;hgJ}mH=>zQD#)m@PgIIZWCC2wE^I=7UHSpX8g`(Bfi2u?J8_GEkU5A1 zYS?=lO{n4AYVUhA%$st1$iX9TgX#hS)pxprAoM7j9pR!XR(jZ0Sw*de%aJcjWDnnH z{!Xe$QqF>4w&KYrkq3)TQHb-x=> zQVAd@ZQTNw`dTr^%!{d7g7WitX$G~6HD;Hp6r;QriTf_EhHuL4&YBFD`a>+-9{({L z=|u4YlCuO>W-_z%VqZ|^^{;pURSXeli2}&r_ovZ{2*s(`dPbTjoFZTZ#CU7Q(TOw; z=7Rz=<7sgtzfU=5OPqe76!o{j2o;I@)*Horx51{H1haR$eim4NOS4vgldnUw1}62u zV=7r`7Wbvt4%DaF4%VgS_*#sl#}?WW_B%9NyPTvKtE#-ra>w+QNMRdswW-SBA#qo+ zvD&u6D1X12Bv#v!dEq4gD;WqGlz{4=CXM=63&L zjB7#?(Sy-ZQqLdh%WOIF2|QJh%U8N{ORtlyI;@%`*p9$^ini`DMC6^6o<__MNVahhh7)QkSqagrE z^#2=9gBnft(PuMT4o9#<_G5tL^|x-{=fVnrAHV%5s?kA2Vgi%cJV>9@ZPe}ASO zW-1$`{LQyRiGIBKgEJ3pLQ|~JE3x9Q`R%W;Vtj0%7<8dOFkX!11oryfSg}r67Lb3i zU%m+B6!&@z1;9?hM4;109NUMcOyKumtv|`cz(emSb?v?j25)h5m)MMoZs2R6Kl-dc zj|@#ne|gbwe;$VOF6$Sy-a~+_CH8kHyGDCrZ>Kjk=}NtGncQ|18R%*~;vUoU9i2E* zc^B*1)n3$m_+^mzEZil>mAK!= z?X~7Hdo44w*RoK1tvk?;qY?#;iq>I=WbhWklwYjS7Ian^G#g=(G4G zNqT7+{0E{_qT-P7X!SDm$w|EnNgU-QF8~G=mP#(L19o;>IOshb_5a- zew+Riu~BI|UUhp79&H!AHc}KI{P|4&3^L}+&hwee&LD43V<$E)p!^5v#Hg9j+tOor z#9qcK3C|#Pe^%;-NZpGV!Kvu479Ft_*x#Bil*Eb}GrKUzh92%!((Kiaw}5VWbxxNa-=sl2tk?-i`h(Ujf8|`=PY& z>*{DAbqxeEmj3SRay?_KduFSk$?s_L?lAAt z>*r?~mYwBo@~JwLBWxmaH!3OYqqY(GMA%41a3Lxp=!)Ks(XauEZFP{f0J0)29JGyz z%|&>dQ5HzW>!kElejaQBabF_r23xoI*vP1+Rh3_4G)U?B;&@N#5^6+C5g|@z{3ea1 zyz8gzY9t`i9XZoN_M^CwvW;FLJHg9mC(22XgsdmxwUs66U#RIFPBxT%ST7sJ7xesO zGvmD1i@QpUz+P21cgd+%3`*XmECG(8jIUDGnJX2ifai?4ytr>ak;nzI4w(aA0FOe+ z30tss9ub(bYQMPRFe&712gJL3s2&S4+3dpllgRcjVU?BftiFl($v2RL$Vv1BLiPwl zd|T}SWWaDl)xLToCqCX`zyk@tJ>Yb!OVD(^EtTz2tKWy9x|H#b~gX7Qc6745nO>2gsJgJZV3oDRrvteensDH%LonYYt$}Et^oU z053px3lFO~{>3L0dC;GhuT*rBiUFdL`UnP2+c0_rPm`g>_cBXWzxgV0=V3@Ul%7IH zWHwpJANc~mUrhWqF0wRU-&B-xh{cUrKGtpAV#w1AhU z7E7j}ZLoIg4q?a4?Nc1vr9#`_`m^jVkH5r_11*ZXfWAk>eI{G`7JpTxuU6tO)*eUC zGkgQ7$o)u$aXp-gs$SOtBFr)R`8J>dwn5Q100VL%m?C(hl5`aHncqNTj0#d+$L#oK zI_5#DB>krK4kB&dXuP8%V=5@TBBQco>BUAsrFIBE}*c^z;e+n|NN1r)=^xiZr5XCn|80$I&?6 zQw_rwcZHm!5vGT8N9B%GQY2L?d!IK_i$Z}s`XYA1aOoBMD1DU^{JHa?H8i}JkOVfq z3MJYaUxEJ(aa~0H2Uo*Q(14^;HDzjaei%xM`yN>~;X6i#vJ2FlfpFGg1X!xz$8#%- z+wJn`(xrF$-clG-ShQ8~8M=+!mY@KDw7*r6}I`XcYwv9uLYJR<46 zOPOXY6=|1@Jk@WYFIgt>ag3&e_{E?0UkC!I533l0`WDVYdsp6yePi>2{%vZE9`%vg ztgh&M1-a;aZNCD($cWrYH-7mImf$_A^P&<@aOhW6-2MpS3j0vwM=%a3XjblB#775e zkJwD&W7Y7bp)QT{PFpK&O_5+QR=4_HGx~Co;>O717~jvlzojn%2-faJ-_i|7pdfxdcpR^`k6Ejo*U3y zU3xC4bdSVQu~;hc7Y&r?)spV;ERvXc($*su^q4{}km3iN>gFI-r1^Q9?+XbC_8zPg zZ7ex4F9=Ki;tu;jc7y19i^DLvgAEtp8GU^1kcS$^;Q3_^BcMd!30)D1Z?ubV*gp$? zAOP3+#{2O6IeiX(B*61&J^ejm?+$(_D42F;QaAj67BbL>bJ2&tPwIsKhanq%7>Pba zf_=zc!qfR=`_bU{j$$Pj#vi|cN2RnAPq}Re>gJNx%obaF{Z-{vIs-+g>Nm~$R0T8b zM{V6(KX?;QA%L^AciMtmj^M*lTkDqnnTIn=J8gg463lG1g|@s!?43YOO+i!0*0S;U z#D3J&N*{mi=d(;FNl~}Utr%3#6?9XfW@!z&g|UA@iiNQNspq%b!%9&%aQwbJdTADM z%+wmmUwUk1iM~dW@Ku@T>6IIwCW!?Rl4uHgV5N>Z)kFK3%G2IW*T@ut9I#;HYb7>g zd^7Za%~>_FAN}ntTY9Vs1cPpx$6nff+p?ttka#?nRMdU(_s`(_iLd$oIeb6)HQ!Ii zee;EQ9L8f9P!L2U0a;OWG*lzF)pauw>vdzCU$=VBqT@8c_T4y=YrjN(Slo`5vHt8? z9=D3#^Ym#=MmZ7oP|;|)^}j*j0y?4|^^J>Z@$`fqMp>?BacR;r+YrHr?4vKfgs${0 zA$}3|)o;cd{;-!b0r6XV5%s%V6y2m6iwjePF8S1Vo2s7393 zlNx<7=Z6>3XYU*kYH^lG&KkU)hexFnr|Zw+?ELBcr&$9m%7kvLMKN!iA~gWy!6ycyr|+Y zjp*CSf_|UyJ|-S*<(!JzV>JJJtOg*v;S^n&kNg(x5y@F_ji#N}eC@nblOt|5p&J8_ z_^6wiGHt^u;7B|eYNla3N4XsRMwy&ViUy&xwcnz~NY_p5r1y%;c2Fjv0y-^FuloEx zI_D^?&~p}q6!?r%11TsB*-;$fmQv%bsmPE%NxS7@~)xsKwdT#!#q)IFjQhVvZu>=^okVOSO{x-Gik&MF_sj_6m&PFMbA5!eUolq zdM3=1ZgLn^Azkt-697AY|Cy;vA5vT9Ycmh$3kI?28k`opnO=+3&De?LyTETO)-s;n zy(~o%cRjp}914F++?QV{?t9pg8G*Mna#uEaI4AS2#hDK;2~UlF6ZhS9cP5^_Q~UDG zRPBeS;>MAaq|l5Q=OenNytor2n4xj&DJX)LQTx#a`hMzm5zk_fX*UC|CQdRr4+3ywy}17!r5oFZ+f@4QO)_`R9rhMf?Tn!AK%V!v0)*aJ#A%hf#gOMp2+X z(|EA(eT@ds?5{$mu8_w=C#Qs{tjn7Qi}h7zU?$*Jd?4HcX7a8_j3q}@>23XL3{GV+ z@7pAB-Yf)jb@(mR7)4OqjZCUiEclj~*=y9sQhB^^f0s(_2F!HE$lDaaZ#uczL`X7gkq9=fQifZvahooD_ z)3X2rvs*WCY$l%Eo|hs$34gzYzu&>127fyI(ep^WeT$dY=j)f&0m^H$HuGB^%-Sq$ z`GGGhq3(X-D1&{kY%&wa8hUfI4B%cY(KeK^(}oBwibl8cg4c}R48};7xYZ@yxMzV( z$k)Jl+$!F|^RfGj@bv;yDX@FH?1V8+<|)z;&5xa) zOv+lHAgIWuMtDmIv%J& zkhdLLe|G$oRLQ$HdjE_0-@=$cwPnFic-XV1htolL_62l^Bn9T^v%`q{+52q-Z6}`B zzPkq_h4cEmS$!Mc-7Z*T^}{7p>Y_I;CN3dbm*G*4gsUs=OA7WSDh>;@Sfw~pD=*P^ z0-{3ezYcFcNQXx6QW~sb(~Y*0w7Tm_?wXZ!?a+0_WHkAuOE-v1p{8qWCEB73aT%je zimy`R_;vJ3CDH3oun0Wq3@6|<(iVbI=#ZE9%XUP(`-rVoyt}m= zA#P70VwE$Beb8@Lot}_g#X%~i1ByHZyHvfGx$lE+S^pb&80q1Qco=;>fF2}9?>g5m z@H7v53z_JVOY$@P{G)(YY=gCPiI#P{Jk_HPGb-YXOo49N1-$z^xc=1mi9JcIQu1-Z z**X5TTK zF6Eb){s~VX@r02{`LYE_8(to`(!ZS&x(@Gjg14k6Kbf@&odvPW6AVVs6Ogk+tv$pv zgIgs^e3MZk-c5;bfteI8MvBwxo%|+25%Bn zVW5?v2a;+25-F5xp|ehzyYM8u7$Fh7tzv=yCmFrGZ+WWmGV`h1SLacdCOgi)dcj2d z>REUrGe@A8;=Zwkb?Mjmqgs^3F|)6U{-_vyP9}w^ux_Z$tI$4(=TA#0!uQo%IQ>$9 z1EZy&1){Bz-(W6}3f8ED(E#)I*3WP`=^1(S7K?~C)KZ#zDFBFt5oHQMkR7Bo7f=Ji z%`!@OfOVjD9=-J~QMQX}02qWa(O@68L;#zmn_3O%8Z4t6=>Qcx-2yNYw$9r50H7eD zhStv}Q%w7n;&js?r8onlrrcHq1XQlEjRh&<}u|67K;q z>YwB04w9E{%gd-u+#%#BdFeZXaqEZWl{P&F4w?KU3PE)MHFcI_Qq# zwkYn@@Z#5a?@X=M>{fsK5zmpk%y_jF7(6L_1@J=GQ{Q~^qc_)p(Lh%iNHJ$Z@1b&K z5ow_)5SV?0NNUwK?xWK#S%;yBvIw}jmI)Y=;YVah4OmkyAIhcDLMS(#{V<%y&}BvR zejjYaasCOVa=U=K-*q4vP2!LZk>cPFCz29)5KC<*)~5hLq*^t!yQKOVraab_0c0>d znI3n6Oc zm?9{>#^5i~bQFUgMCtReC-q<-#d5%e4(kKBy0s^FJ2x$0Dg_O z7H`w9vlYqy`~}S9XNPF*65j~=R9-2KY%dal(@6J4W{BHl!??d`@r{PQ5@4@0ns=9= zlvZGLy3}oWryds)3L-=mpd4SD4lNq`uQXsGkHOF148o=@KSSJ>4@nK@Q{@?0++>$l zx}ECK?=TdXnHtFU_tS=E?!iTM^#6svCHmT6$MgwQu_^BA6yI=Y{m;-(4#TD2#`?Fg zN`UtXehB-_@#Q3%u4@q;8hx;Kgjb7ixJ|KKWAx*f(Ojd^Tvl3@DL#`Hwm?ziMX6uz zLHMM_hV7!k%OCmh$OUoN3ZwW&fx%QH6?)BuUS63RPO66gjN7N~Si$>3Jezo!b)4}> ze}>Az(uh)<-cYA;m0q(;oqmBP0h+}vg6s7rE<4P4xYxg&yV024l`lz*~)fwpf}u7Dlq&o$Z{d~H74qgT|JX#3F}YLaj8 z+p+ybQ_wp@d_xl7C^YD;78+Tz4#C8lWjl4kq1WZwGhll;(e{iJ+B3@6jkh;dd;cnG{DLSjfj!Mod^}@s+(f$ByzB!5J12jmdqZc?C!4zRt&T_fN zE1X*O7UR9pLlf3{8tNQ(Djn-ju|VoUrjE|zOvVDol=_Bx$_|ml%=5N7Ni3+7P^%9) z)C<31O8t`A(QBf>{7eN2IU)Fg#N4LQ1GKRX^!|$} z1TY>GP}tEazxzuH*x2|;04L_x8QlnbP!OrxU-7{#hpQD&rdLC z@VsDZdA9LG4MuBf2}Y7fy5Tb>Xe>c8bvFmLzK*_#&~7MLXB_E9y&ZB(Mq(c%-H_5N z?!-HQ$~`=(7%;_(cS75ZE!Yh7e3t*N*diP-b(SCbv`U}*kzR73{K$t@7cWH|{2)AZ zcz?iTY3~~5GtTP)L2x;mkK%FwxImU=3?RO9Lku9u4GbV&zMfsv8QwGv);*#m;Z+93 z#8?js3w<4BOgJ(=PC|fHzT6`m7?}Kecbqc!y~l6s3I|WzL7Oa1YOkEQ4^Q^Z)SfoMDHd> z(C0hL{f%$wMdF(H+CqcGK4c0h7;e+lrsVS%>--r%O%1SuA4#w&S28=vyF4y!9ghz6 zZs^c7s^WENi?r{kbKup)Ue^imJ_$eLjX9h{ZJk-G<<*gP#BPfen`uy~ z=LTve&56x;2Gvm4#>w>!bq6_l(~jmk4I|8ZAIzS&v8JK!El$2)d?V2Cc0xTCkUcx> zhqAYBbZURW;j?4?P9P$>>})?AedwYOzTj5h2Mxad2I&4@aOTupj_$Ikal$RtY|17a z!>8+ssP+%h7$#GyC#d!4elp`mMkx&`t#N!52KJ5NG~W?YEgc8ghc z#MGLaXBL@y5olEYRo`&=^bu zrwB3MQ2O}OsY*4KOjAnxFiiVoD4a}@IThrr0c$T+*eex-3R(hL#K+NAhMxBop=h1f z_|KR#q1|ZnYeqJm9N3>Lq+5Sz%#(j>Y9-U_d8|9sW-PF=Rsud&Z-ErGUBh7n{+WBActfo@GZ2 z-7G*jx@na)mt_)$XeJO;S+48hOYj19X!u9mGhY}tB>2L{u+iFUD^+E|P?3t} z1~q_seF2lrJ|J!z#1eVSq69kR1Hr?`jiS!CiEt8A;J42zax$hWMK}Y`={srGvJ!;%SCUwuk=)n=g6n*qC0rp+=qHMeXRY0o0 z#Z_t4zZC2T*t@uz+U6u*yOtRu5nG*QOA0fOqgB}@hE@38=#AMz?y}(0yWLJ#Z0Yyv zOP>!*zc;${79}6HNh*Syfv#$*)1|fy;xu=Dp5i$&jy`e2%fQQ<7+=Qso)7w=j07S59dO~|@`v1q-*9XK= zo{8@=15C(-S#?d;WL0djqKlSDei|}ScOkn=J{FcB5RHIsJ!%r~F2YVelqDp?CJb*z z)2r#(UcKH&uRpK9YxV9_60KnuEDOX&NOF;wT*NljrOUM>p|DAi{XNe+vkN5ArpF)5 z?9BVV^Socr`+PsRiY@55>%?Bnp&^*?165Fad<193tmn}2-CTxMzGJ5JKaL$OD970* zVP`?69XZ6?hcj3miSb!89Gh0E)tjZZz}8X^Lb~8s7q^b$60xqx7N~Q1*Dp z=u6WA;?o0l^E%BSJDZY8;~|qTm25Fb8M4KM4$83q6v?bq)96V(xbAd&11C>80ptSA zFO%-TQ6T$2O0ocRNcY4b>iZ|D`#3tgZ=EZ=)`|MbNLuu1q5V?mcP62I5Y`liPU$0~ z!fO-2GBD@FbBm4&uQ|siJ`!I07^$0n(ha46YW~#3oDt8U|GQe0#q^0?i;hlw#0*HO z*d)Kv?p+&^(lqwQZ$d?2bqqH$lIFz2EA01+pdaGL!mdZ+S9z>V(<@KYd_CDs50w*F z4zV6UnJR-h8SGDKX5@2V6(TS89$T(!7F;>VDzj9!=oXu@8-KYTp4Fl@1fB7wxoIu@ zn=bXgk{>U_b+0LS*TIo7N!;6@1unkTr%Ca5JZkV&ldX>ej2@cf0#jV9(^FiCVz+N@ zGQmYO_si2;+?EbAm~dX^v1REeq^1Fk>TH zAl=HUNDtzaq9vM^Nqrzu`UWTP#OdvAf}@c%II~MpG z9DPAS3$sb$$X48@o!hmfQ1=nXQc{czWVY&Fg5IF8_cZ4X=|Kz)Q@oU{G%2M}C`Tz> zj~vQEiUHnVFZ{kKqijae~2lkz0s zYEa-uA0cIb?EA10Zr-)qhqG0F`rino&L@m0ypeb?;{bF7_ zA-oo*jdfyMA5WZw%Fq_Ja~O^Y;k7e3j$_P6;z!znB6e=QsUf4b2B;I=SbtLNqApi> z;^}Tqi-K3;AB^V!V2a1;IT|_zhE#aB6Lo(Fv!LDqD#&tjHadD_;@IzTA@m&k_1yEv zKFdD}2j&IRPx^${4%^O=I0-Z3Xc2aF?kE!%FVv^nF35exxQCN|3+uA;%ITV3pDtE+ zfWkG(zH0O>B(8N=;ya4VqiJ#v2E(M$dI5Dtmd>Szr{Y=%%jyaosJBmc|4`dndE<80 z=(`6$SF#R{#@S+Ht(g8D`AK#vny&xQ?8aOc{Fj6Oo(a29BLs!L+GUM)c@!_*t{S*~ zN_#>NhVbrYgZ3BR-IBa(P2TNI-o2c-a}{fsrP^h=_Ih8k;7j`5mFKaB%+Q}{^OG3= zsf0R*+E>gt?DkwS8c??M8lypr=_jZ@8rl!?Big_zUnxnOFksYvDVr>U-#3!{^2pQw zil*o^!x7RnS}PRPZ84JR0Aai&JBN5|5;HG^nhdRnkcjTdsJa+Hl2~&IN4BwwXB0}5tImEPghx7&>lr0s z;vXbONOiyb=_91#IQG;(8M>Gjil;FbmFl6;pVN%Oh5e&tsfIVly1d^am~uBqDD6f z+YZ}0VMwSXceL2|RUiRB11)9=ANdVvl*hi#;J zX-k^1h>JJv&M<{trqMu#Nh1^W&6J@unN_zPH#V)0n`)3~A+Vav*Yr=U9)8fANPn!; zU(m5~O_Z?N41_Wpi2Lr;SmpYA1j{zgqafU}k=2iau)7nIEdzC){>ouN0dH!(&C5bW$? zQpS-^vfU(}7fQRua8o+ooQS5751|Kl&nE?1fyYeZC1Fii?DD7M&4*Cn*xi*J+0K$O z9^aecaVflS!uO^6dscfdULq^aq!a6h{PSr2yDNEm5|M$#og8DeC|=}Qz0K|BF9K@T zSFZupmjG=9pzt-qWCEA~=1|i-3bQc@Q{qk^U#j1v8WR1GozAyy>DFX~l@Z^Wq%A%T zNcN8?NxZmt^LC#vV>%FkR`$Th@wm_)q^HZMUjA8>YP!tjq=u`KyV4Rmit?n6;-(H= z`dh{03VnT0L1aD?_43U50W<sx>xHf1Kj37Uru9NK8zr(YBDhroE#!zkpe^v>Gt0`wznuw#4F-JlY; z`*-%NB3kjCrix0r?jZzM7L~3GvjRIP?JF<3v{EKb^{2oy9kEgJzO?hAn`Po)`v+e3f0gW zz=OPKCH4htBx0HQ`cVsNoi6OOTt$b&`~2~l&CxNRS&Pd1;AAqxrl~}G6N_#d z++u3GrR9__qt&v??ttH0N4s%_Ej6we_6POz4gEKKUnPB&>a)f+qoXA#U9=sk0RSCk zYZ1V0pHt%&l$D$Ed$ngzC7!)M`>#Tar;y(ZM{q4k*JMv~wX|; zTu-j1T6c>V8ZciVnJ<3mvn0~!VTz=L0t%xlpd-bF`cry(1N!gk??dM`en4nH85%Z` zE}{KHa!z>deCQ7_(_y88V@AbM(v9NhYFH>AOniirf{2LN&gy-N3#)TdRE#tI~}lv*H}{OOwK!`#~GwDIHVDL%entI3ysK$q_a z13_3Cq_v9)Dh8YgZNBea%B9yA%K-V?L;w786Dmx*-jm>1O$KOKn2haY6Lhwo$= zXdu?f$anE^miB$M*!&LK?ZQj}*{ZTTfjY(%U*AT~#6JnhF_Rbp6rqJC{c`g8M=^%l zS*1Dx%*wdI%#?2HTP4!VSX?X6W=+4BGB1Kz)ZPkx>CzQ8#t3+ zfo7Dg944a(nqVU@`8(Q{47;K6esqrg>c1x86awg;gCSWfBYS^3<1tM<2aK9)9nDm5 ztI+ORRR_mu+QeX;;#vg{vm~yLz(d7VLX$XrGyiBorL}2&emtSiab+=Kp&b*kp`&J< z!qF5J)M>Mrqwbp8Jzpm;H8k?*gxHuSZ{rRAdHKBxrxdeL4qg|^VUt*CZTz{G=mL)} zV0M-$}EdNKu=EXD73RP zo@vzgwW8J1@z`j*B0kI@^@B;qhr!dl9YyIvyQxm>^QY1zviU){7k+e&{5nbdel6gT z(BX1XT894<)?28xMxhi+nzXtc)Gbcb<^F^%*CefIN>*HT{S|fbmRSqe4|Ui4*>x@Y zYSYH6oUFs3*3Xlhs?>LoyoEy#*7L?n@*u3$Zx*;Xz{q+MbDFTVm``Y8<`eG{RNxWE z(zV2H*5seG_99pP|e7ml$F7!zXdU>ai zOQAp9&RilzCbF9QzO7Sv-Z~Jo^^mZwTUl*}2ekvS8l}i`)pnScN7HcgfjA)JkLAO_ zUQPh@vLQTwy}_{I$jMW%7J9^DaPU@W(AIP8QxZD%neseatK{Q8 zSBrmhEPiYX&JbuJq(7Y5zNXK_UM?jcz#L4R6vIu~z_-sOv3CrH$ANW--V+GI?V9-8 z2E!W$a#1M#XksvWvl#LV6NB*LCvl9BNG_s@4z-j3@~ar*iB!Z$A8;mSbx8{I;jv4$ z&SO)s>zN5=VRSx>&jdU=Pby;gj_HIqwuN#h>rg5t$rL_53Ju5?7c~9?Wo?TCr?#2Y zBCb{*8l^NKJssohG?gO{!zSB#*g}~b^au5as@XjTC zjA2H#!Ekc5%4W7kF}9MyATURuYR$lh+&@cxXy&>8?jct#Tt^&muN|e46c`0{?W4q%#7}ya$cX@U%dm zI39CkxH&Ps-c(){c?G9XXE;;i?rGy5U`l}TUBzA_{u~ncI6@*PymVE9q69v-2ybyw9C~ARq-WeK7wRJLG*TgT0cp!9(7nv1j?7;u~ z=}&*EE_r0)Q>B5;4-WiJxe4g^>dC29ofu5w_9h@~GontFMRzcRZtlYBI+Zc1 zQ(1>;CC8hxRi2h9L+uK`1%)3N2qg*w5ar&{>;N(Bq2fUL%#I>;;ClgEpG5u-4+o(< zo)zMM(5X!ZHjf{vso!SXN)H?wHcSCNcYnJ3tNJ4z&MP{3iTA- zohh(vX0Z(H>qbl=e>Fdi<8R6jwk-rk`exFjt~KKDhJ-_h+ZHmRmQzx6dYmiJp80jd zEPG~5wr-(PTR;lb8d6cwD7Z?gZY7zTNwVtMSEhR2P^1>P3@ZE4X0t3_&v!dp4c^MI zvl&M;^7FUi@qDC>-)iV~zGxHzeNZ;a!o5Lme0QHg z2w=8Qvf|yraKH=gvh+}t<`8OFjrQk(ClCZ@vsa}BfbU>`sgbdR&Hfh+J~MH)HeW6i z-U?D+`p_wz z&>u)wIJioka)+dzdl`m4!h&d_$q579=c!ulg zKXnIj^tHSy``I=4g{$HzSSmN>fd{NAkZ5(p%y0jzyY_{TwRVn__$l2e; z69JD#kyXXa;D{kzPa=wJdWskn*V9X@O}_M z)XG9@sO^V61Pmx;HkEZiqBi9bzjYt^9zKwtTVjwF?p*#s{kQ&VgOpBIe84J&OQ42B z>}xz7WvDIesLrX{m!nJ_(T+VYKoeP80Xwe+7Nj!17{M`P0wSK2JguP6;HJvRXD79w zP(feW@~`GAfP z(6DMO5N}G``5C$tq30e=f2BHa@~VIYF={RV^R>@3DFF&j18-sDE*2wU^=!#_2MLy8 zl%U!|1x`Nk;5&4FCYccI^_(7E#(?IZrzCXY@lsZ7EHZBxr!_{+S}}1>H9W`EAeE7# zPOTC;BF!i8GU&4dULH#_#nHtuu+9FP3tq4o%D^>@&1SeG zX!wACyBTF-J>?|ccFVGb5*|!9wmoKC_W1PSb_x!+UO3!(;7Q>U8jWNrjYhIuaac&9U2#}Z7xDJX^kW)*dcEJnCA^*#Tao7D zu$6Sm)HPjBo`l)oFx>q(1_w{e(cy!m355a>5(m8glebehzd;b^F2NfY2369!SQ zu_)C&q{fPY-TlYW5LT&vpH%k?d-oe?q`g+m^@3WF0IpD}2Z*$$z|n2b1>)Pb0LM}< z``3^TzJWQ$wiF90P$R-z* z${cbGnuSj)&*jxBg}KD}zEZ!uMtOXxQfNmacFB6pdFVHbb&sM%0C4*BSNhX~blF`0 zz+<;?;7bm?3KiQjmvK<77pj#Qmlb2R?i8rm(mQ*d$iz7qwp)>I05JGzFkCtq^20_n z+ej3mDaW-E*?NhN^x4n(L4lxo;ut&C#lob+I9y~;XVTjlsaKDt9o)0nm*OEQ7iY_p|~Ef3NX?)(V2dk_Tqbo zbTmyJ2c!qIr_G0SnLIrDD)k17)vibEML&%ZQy&f`7)F@z47Yf>@q4u2wTbxgBy@$) zmyTbScK%@6G(5705()3h75_-&2L}_rJjI%3S<37vqhkr3#>U{FdOCf6s-X(bslP;B zVU3l<;HaQ}cgfRYIz?Hyrgj!Tq{Xl2$>GW>{lHVpl6t;AQejf-jcqA~_!Gv#cEYPV zj7%pznKM7pxBxm#ia+L?4vM+)>*bN!vZ>^7_--YmwhL;Bu?*PY?^VO> zLs69JPRB@Clu% zfw!dv57UBIX+WvG0R^Wt%=xa|J2A|;7D^3%V(<0D>R)tzRPYCvo-vu|;XyiS6b%3S z*NX${a0kwxjSt_=)ppW9ZhqZlqB-wxBl8QqoRlVSGiCTP39I_xjRUF=qbwEJ(2Z+=x!Np z@CIaK@x+Ti5c$SmYaZsXA8}I<&v7`|YHO4-UjNd6+Vn3yL%&4%x9k1flQ^%a>Of$gwQ;N^^NKA^vDOPl@twggbke-5_SvcV%v-^h>SnU5iq z|IasO&le}p$0?04DEkLB8li{M z2s<%oGtdaz_2A9V(tJM0(X^rt9~~81Yw#KuS}XB-N@y)XcGcfw5caNsy8`E+@S=zS zgoGFK@p?pf(FRwIh7ex79q;4X{Y`j(S-Vfidw-Ai17mIyAX}tCrNM$Ug%xRvx&qX&t<8F!^CAp=E;>s-R-iGd2;0- z^W@4!=E;?Z%#&+L4dtHJPp@TNUwfVF8OO7&ifh zYx1J7oi8__sKay{QbwqHH-_yN+?+rM@1vKj2!ogGo9M3`ISntl+OND@=ip@tLVQ&| zk^`7uBht0*^Z4|!IUTdMh<&;z1MOT%o*EeZEyhaVo}7$tT&_BU%A5EA#XEn5JsOuR zS_zthwg=wFx3cBl$i;7=3_a`&Qc{JM2s_`yAKtJN`6ff8(q_=ogXNKKjN7_CQg!FF zJP)@eX5|5BYFXvbFEUWtWL0**L2q)&_wWY8OuO??ez50>Z2ZZSJx|gb6LDK~`vOKv zr6NiFCo3^>ZweeRJ`Udb;0KFDWvblEMKkd6Tzs51Uc?*WWuK9_vq|$dXrOtU*#LF> zxLSpN95CJsnAhnl^~C!+{4~Sv)95ECw7XW2nkOn1cTVK5|F0e((q}2J47;A7WAXUE z>Q*UK;8jp03DSS&W)?-<=D+s2n66NuYNJO33)0`E{2^VZnNUDkaRkm7R6StJ z1jx%kh-PRv53!NbP-8Xe-a~imssXW6^RZ;<(F@)IFN?XZPNxIT3Wvm_K=> zczXQ#yJioscgFa`z)6L~y`;PnsMN^$M`oA&04G9qFZI#{4ac2yKISb?j-Le!{nU_X zE=BqavIiIz9A<3ppRZ`H*?_OqJx^y-14L+Yr&F7ggW}9KrN?2pzKtfvlwRTL0%nJl z0mJnl1zK12S#smtJg9w}lkUUGLCpnB&;gjB)H*$M+Zfb*`d)2<9LWjNN5E%_-h0(t zeRMya9VUxj-q$Yw@|Eei+C}H;KXb2|D}DTFzQFvWl~wt1G(0Hcz+DHZ??$kYWScCZD%>EwVRub5PdOv9_FY6Y#6L;4q0X|i&yw@ho| ze~!ZIibNAfF~Sdr)o#LS9xLfo3iN8wr5^?X6F($QNJy88MHb&;47yDU(Vx@^w}qH8 z%>n1RE3ty!hWZK$;n>@plnAD{4=@l?UfUsRE2(*sy1RXwxzbeTl>Cn(^b@Cj{e-pLJmyObYXw9bh{#CP!{xQ5o`v9>d$CpZ0WQ%(2mQW3d@-IMIc*>{-!Y>$L{taPBIBhU&WV%%=V2 z%Qy6`vuZh}VHJ?w^l1Bg1c?cu2h1g-@KR@Mg)rX53M~=*Z148;iIW`&Y|Bw!-gsAv zFRv`Vd5Iic>Wv(rloyX(7h3kvBiJtNMc-w$*fjhPh!VSuQop=yiD63?@h&GJTjzF` zblO64EXSWo`s9mw{v8MNa3r?L7a#DO4m^M(9HQCEnV#skc3up^1OIvwl0ONeA7U)S z&%%pUa%{doRSsoD?Q-lM`shJ9_JDsv4m}XPcf5=90kX0CZ#{_16NWyP=TBFQ?E@F1 zCbf9}L(TBCkx`4Ypw&R!mojk@Fk)!dfNAo~4Ne{x2da=LhqTDxMKE z!aAo^3^6Aa=a^DG+UksBw#mbS{BL-;xOi4-BrY>)LS+|Ajzk4CP1Nk#zePSEQ;O#- zkeBO-ooimn!y@6@9DJ*D3Q8@PcK~_vKwB*@yw&9u-f~WPiJP@KSg&q6dM^!sbQX2E z6*0!aH6LbMYvJS`RoocgX~hXN@aoPLF9^FD=oT2s4s=ULYba_ii%UZ@U(~=0XaU4o+APil^IVS8Hr^7fx zjvW~OCvu-{K&d!8@w?C^Mz?E3cPt@*fvn_sn(tOQ&Iq}1h$EFsTwL^PLPw9#p7OFSqPKk|DKiFnZcrQij$>k)Qi zfDuw*+S!eWn7H^?jhePzIJA16SZWbo3JpZEjraHXd_o7KHjR-5q{r5`owfBxQ^)|x zB!jk-@T&)Y9To?K(kWXyfU!Lllh$ii*Ix?oSxhNiJqZwq&N2Ty@&U&E^p66J(KIwN zL2Jhmx!VeuU_{(SLEcqKjiiuiW|Y-tSgmqbE({!Yb=ShH$3GX=_l8bw2H;5A@Da`d zYzjSr3)78$rfJOI<1vLfES;lOo48!EjiVkHP~Zc_a~g9Nku5CnKU;Vr#|+e3A<@H; zFExah{hX=k#>$PRh`%hMC?h@5IfT$=JTcLKT9CIO&fJ=!NQn9J;|I_{Me$GK2$k~~ z75J#|0@|Xqx#DEKxz#D4zG7+7Jn1o*7op=}TMRRVi5LAvn1}vh;<^#G=5|t^jS;W# zFjx;`DYS1+A&wh`c6&;l*xkh80`KUKvM&oAM{F1cK6XX8?x1g3xDXvW7&QXd@N@>n8k}GKbv(_Y*XG`CO+G3CY5DAmZ06X*``X+RU zDmA1*;gAajRzgRbw>b4o)dxquNCyK@zc+%_dTPYb*DA!>GxZdwPs&ub=q z80qo2cubHn+YE^lM>dSyTm?g4m_$dm^hemY;^F$wc z05^o~`sOHwCP30DQ3mA+TTFmf#d?bn@W5v2PB8@HP3dB+k?Bq`%Fme$zIpOZP?kbFCx60VLMn_NAciHTInzi6;O5tqx~T7|)x&sI zX!cwlenTj^pQ}h?-jYp^=D}B=$XlUNn~EP8;Zf#8V$TT;F-irGL8Q~Q7}Rso2CNr$ za|!O|629!|AoMcwi3gDiPd-Ghw+DCS2|?bP0-LhlnDloL4rRhQ6!|=e9|^3w6@XTFlQyHLI;d?kFW-IUSWzD6G~$k zM18DrBPm&=vZ&g}IFBmZTi~4Z->I^{!Y8(n%F|b{K~oEwZU?Tl@RCxqNNKuVaot2# z&HvK!&n<-VuDJ5}eC4@?N?|6_I-R*19Bl1 ztwVJfb$+j!g0&@nB(!`7u}JNW=({CjUEtrFFjf^Vbc(I|p>E@*I$G;9?sqb;`y+Y3pC57Mm$0GVyCTNehWlbix_0Y-ghx zVwVJCa~5;480m5k<*t&>5dRo-432exTy+Dk;I;UNQD8_X6TWvY#NSA^qio!x(R^pc zu(0c+DLQiEiG~79EhX+;5MJkLI3GTk2xJBP5*R_AB`Zp;t1dOlU0r~h%u8T4F;)d@{Oj7rI= z)e+$Foe@kUilbbKXc@JqRpk*!85MA2tk>hlt!qeWwh9PT8uUKRaF`Tyaiqgb&3FUj zzWbW}pBZ55N~a5?Az#-0!J1ZgR;{l7TQpC%h5@weJl*a5%-Ad%r2TEqPiL0;Bd?We zEzLqj7itK9&0nP-_L*3=tB3D_|~^QUX{e|L8SK%_a1graw!^p*;%#FVBL5Jnn9OB+GZH`H@B`qnnmCxTB}kz!JFg zs)40=sjP~0m%?hGjbM_Bck!)}#FTfJ!_C%zBeWcx2>-Ov=#9UL-HxpICiGghPigif zv?^KoD69s@Gh}6>qUON^nCUDCjOh)ZuSJVGQzXdO9_4f4l{+aKKuyz&{TBcU9s<{)&umu@S zEXjZpawi9cMxwXD`-L;#`)9q^I-(XC3GGLb)*Zkzdzaxz(2;GU6GG^O>O)9ZQwuuL z?tLXMPV3>@;X858_wIiRE`{3M58pVYXMhHTCBl5uD8AyEEh6cL4RTLny!Hli@q;e~ zusLzSe}l4@-YPHA7sb+lyWo5~tbJc=LCG~dcgc_ojhc$%kS~cQ`rSnwnCdCbUW%6 z`LO?tKv=je)QNx&cT_Jy9KaKCGdFLbWD*0;QhZSpd5^oc{lJ0KYvJ^k#VhrvYQX$y zJWjQ!x(d~+ypsJh*gWAvXvzH)T4B>N`QwBM7g6nOSl(+j&_Cpc*}%}NfKluwv?dW+ zP9oQPF-uCbH!p=zy&@=N?ulGbq197tR)rkbQ9T zMU6}h!U6&3Py-Uw=fz1{LUbOMcZ&oyZJcvjQK_ogP6KGh$al7oVgNhh z#e_!NIO0Vs?+v{=cdJxPDt?pVkD;LaY{3C9JeK%^eUDo4T*OfB!ruuygX82AVDK zE0~2Q#8#04(rF8$>#zvKdn%GQAIl-WMEbN=U5%d?k2MN%C=W2dDXH!Z^`o5SSj{yQ zFcnGr*n{y$P|>bSjSj5(kQ|*0KWc_Yk zXDi+UpA4#1fE1m1;&aKS~fsIU?ekyKrN!S2NCgM z7!ne%L@$`niW6QPK-Am;UvIDi_53yhtn!XJVyydWC(!m1Mk%aQjOdgD<2P0rIkE<& zZlf|y#MJ9^khoaIZe1p>W*crJK;{y*xbCaYNS)}6Nb_iTE2z(|rq;rv-nEqxbyfpX zh-~HLFs9-Oe2a>&Cs7y$JBdP!!bS@3g9&)iJ0%<8y&W@}n;k-X1_|AXaKk4jr8zr$ zQIT4wWT?&&FRf}_laLdVQGmEm+{$i!2;sdQ;8o4VLVF7JfTK-#CM9m3)vvHWjTDJZs z;xyAZTD3H+mbSGn*?pW^Xq01*HqIk%PG~o;100UJb#^}jhhisy&r0D_-6pbRpUUn- zZg^ahNV1ihKuy($l3+ z9U%Rv=6slxnv@b&eE~};yKy!#?P>{Er|f=`K6-}!-%S5MMgKod|09_adEqjSH>App5VuuCdQMM$+r9=>*F+_D+?i>4^&HuP!oohsrpF4?rkn48NS zL7#HekN&*@^`mN2&Pt7?|Ac%Lil!FP{4iV3BK1v5C&>ch;&iR3*ymfI#{*cIh335u z6TT7qq(14hwnKiXs%YSv7ZW2veQk6P$h13T|mGVA|>!(-nvVS`_w&R48RY;qVx+ zSTa(G;(0;dj_A}srj~HF6L6rd(zFA=Cg(%HPjxBM@mwz&r34O*s< z6PoJkSbndjxq>g=&YYL0xE)^)j5jSH$Mk%v9Vuei&pA-za-{Lxrh#0cgIy?wrTfT= zh1_rpJ^h;QP}$6Z*rxtm=9tj2P`nJh+h{bk={dF72v{2`e!S^iE^|R{I%|-u2#?T_ zY3qTBv$;-}c_R-l)9|tDEODKMLz_YzQ~XE~kc!BcYa3jr8Tc=u$2?8&JWp|Oz{0~R zRvn9ehUTY0$i(XAIAU@rrvz0c(xedh@zhMM!mRZwk65sw={YX5lI=N41qait_(#k#FZ1DP{EWdrf$hmT!X~*p5i*aO8R~D z>(s*(D%^eT3X_QnJz51)!HND6O@O_RJg7)xq$yjR5cd2L=chd_(1lUCa>R)(=ZAld zOH7K16Ad@(^Vjam33Oq2BPdXRjvRp-Bq2`d2fjG5^;WHoRCp5|tt?YrgWk0fmZz*w z^i8TlkRBsmi_L3QDk8oe1eS15!#(P=7Sdz$j3t04eHe~-IMqR1Ec5^-$2GW8I*-R< zagO-GR=4Jl?y$lehXv+B{9wzu=wk7MhMT=*sv`%8{ue2k96_O#Glt#n++y~Y$-zM{ z9-Pn4)#ORZmJe;<1Ke+ehju(`s!i{f3UIgHu=LD2~BZ z(pbWL=2$}(mNU;RN8w|yEPCboKy-{m(WeGX_IEqV3qFF|w~+&`RJSg{T-MX{RHo`O z>vF}govNqA9^Xx6<&pmY9z{z-tsQ@)gjaXxqIr|<_^!pyh0^+IHR_&c833XHM zUd#TxenuEUxr#seopL zcDBEcIvBw1ihcmZkxAhAIAoBA7&&6_ndC@{kIfH8dFqB3O{EGufcJBuqm&mqisslt zaF_XgG73ND=AXBPZ0EJq9iyUj*3Z_-LKgaV7JaTfe~04EA~Co{Rl{AxGYGTkP&|WT zkN*}rXlyZ%;faA`L&yvR78{Yfa^lX2+{wW#(As0dt^<^u=V0Ta4SXf9T6dzM4R8@s z>}7Rr3T>fVF#=0jM+&Fv>_R)du0IPE^2ecy;u+EBQDt|Me%pZD$%KBFBK8RG6G}x8 zQ?-2$NsBl!qG>2cwq=Vkp3virePW&^Fu0Hu?-+)!s^l$n0f^hSXJ<_zkrFhkP8!M#1oBkXuue9 zKAJ5bj+4%47U=@syT6eqQiR3`gJ(QB{|;`ci8HV|=qFY4FA->4{{h6c%u%4lN(NgW zV}P6#Kk&_KeJmyML%Psfn?m71+nZyvfl|vX2$WJ}r6P6!(aDQ`P6+%F=eJ@I_`E`x zLZxC5CQPgd3cH@66m<;G(2yX%Y{Up*>Sku8b_(efs#499uEhCW^Z9s}NwfcLZi=(g zbIlL4z?!&j2JAJ54B$#x-c4M$&?WQB&!L-W{{YmXosPd7mH=iznZI~`f1`uoqmsE~ z0A6I$7jx;09Qm+GE&aSssrfw7OWR=#(w69>Qe=T1x^F=~pgRY{{Rsihsxr}wqXw-P znaN)CAswK2a6PoU&c6!a|09%nl@S6j8qnb3k8PD>%Q~ek%UL1d$2oFk07WQtR8A$j zlZiLhU!JELjdWXxIfJG;Q?^boUA;ZHY|Cu@Ya@U6x0((s=zCZ#J+CbsfFJmgtGbX` zCzqTzMQ;%f^-P=;4t0tlDFe!BPc=?_6q|ty6WTe(c+a{RI6$<2`xwcu#f%+E499V^VntPJ>Y?Z`{EfeT#sf9k;{H zjq)YqJBy*zfd>(Q6@yVB{}eSj?NY7PB94gD1QUSbux+gHmYw$sZ#j4`2?GaV>xOTj zq$vNt;?yzU4C|H&0~_%D4*W9JYB(ne+K!Tn$$^-ypQ$jDPNf3lRWg0#yls?Vt`Lb z&HifOiyjjX`zs2n$NXMum73+x5Mxaav1iAes7RZ(b&+G_g6%`wIa|!uBYp@iU7Gk< zJObBq7|9Of4Th8P1_5H&fF%=X6X+i`Nb}{X%%=21nb1%);~;JxV6WGlgJX#~A$rhL z$$zs_#;JS?y8B^3TRr6p(&QX{=1o3Ju6K+_Xhwzk9u$Ls9?nI13a`oH z2uGVZjd_)rYR@0wBs5kkexH z@$!_{f5RcWwoZ@|r|SeQu7%xHbyU2ZblXBG$3~m$o5?wODo;><1FxtEa`+_t)0*|) zN4n)t6IRyg%;+#0AmZBQ5)Zu(W^CuHJGuK+mM}?N7zPZ^G;Uc>BTH&-C)r6MmYWWz9^^MTV zX3fTY13vkHT!NLeUbiuCE8_t_K#@nNfq6k&Ee{mjN>;Nn@ATqYp_b+$FUBh7BEOwP zG6dNmX)Ix5eim)a$JL@SVZ|s4F+8JkS1xuFx(6&7HCh@W{un05Yp6$o{PX<2wguyz ztn?_U#pKcG%m8KVXx{CRpT`i;e}fAfAQ0Xv;=P*e3jm4XMYj!q96>1p&e_r|u!?&U zKZ0M6Q4?PvV1Op9e;K|D!%szGhqWc9kq)@YfXWpD11Y$U(}b2vdILm42bz+t&PDTW znObyz7cIJnk+nl<{(BTM8Wq>JHAaVNBdQ-LP`|vaokkYLGbCTM@0fES3%5ppl%vTm zRWG2-v%r-4#epeiYfLRc)sgKS(~axab{_tp5xf1VHqY5;3LH|>5S$Enl-YWe(n*zF ztQ2uT^}1t;@W+$TcjzpsieXkj94q0ibQq{fAgD+YYwJvmRxXtQTNw8wG%?(d)M^n+ zN@KQA+j?H(5p6D(=@H&KimH{-fhp(#b53~caM{|8=$OU>M}*e&6~`k(mvnQ`(}3uF zCbVH(#Zd@#tnj3NwOW%U|0W3AcE_B9bO;8b+(9}7Wn&~{>q_+4c0unmYdZ;D{s>rL za#-&&&={qY(Z}P`AS^O+0r+qjG--&&C8V9Ix}=Xb&Ej=@;G*q_>dnG@Y88VFRZv@M0C(s4{mufF?MOHvTfT z@t3KMKSE!awDFhy5raf^PZ-7@@lX?;=@_9|X+E6#%tP zCl9VTdA{4VFng9+lLob5(wZ35umH&62IshI3F~`=l;lk}^FzIvA7L}udbB>&L4HVF zgSP(dtSuZ(A)NqDqAhA>IEiM4FI**+rsqu#vID5^+SH0dvRv|d3yOwh>X`2wVUC~_ z;+!D=6HHT82X3R}{80)gzjxwWIY5cs-wTvZt0%5h04E;#6U5V5^b@+6rQ6gCr60)e zEV&ccC1C5_He3)Dy!y^MctmaodP8VAYoO%McvqTm$Tbg`olul%{*AHKGbQe#qO1yD zcqw>)Na9*f2`y;(E_9@+r9(C&tPst;04)x#!vtKd8Uk7n)?Od53(&8&!_cX57w`&C z!eBqqa!OhU?4+0hb8)|O%D389I-+>SXx;|Tb$sG9B9{stKXDU$;Qn6KJ%Xd=j78^A zWmc@s6GuO%a5k{&5%C8&F2XL#^H=k9{Hcw(%iPin`>cfL(CAqj6n6d9wdXfiry9{1 zH4s?mq7pU=T7&S!xG58JT{DN#EJ7nLbU|?- zE-j4L^Q4~LXoq7r(wCJ`){|ItKB?#7Av*DF!<&%y(+sy>=E{M;D|V5`Qv0850vEH#A}9jj6z3>O+($D zAwS>d6qXjw6IwnqV65BDTydiDqomV#^V9Muku zo5^;}Y>81)q$B_7osC4x=qV(3d8B@$i|W-1XHxfcJobL1rhYJ!q3 z!HHz0|3=#g<|_UkQj&vGxgc6my^K+DJa25wt)iKNeyqFG7UvwebLHP;Pkf>Vo`H`g z0@*WO#d9F?+gm2#^FdgKVP~tsZ!mPzLQu=1F+s{w^aS(_DxM#b5-U|mhk#sOB=$8d z7CIb2zFXjusW_~tdF!i>Mi;`X`TMko7OhC)9dW)PI)5z4-(dl+ytnat?-*nZGlO(4 z+7MMtqC1}}TR$CiETvS$+U!gVOewAgrD6z)`-*<0`hCUoy5jkTQt=+FFyT;8vyU2- z?r(EJ@fi>9P$ZbB>?&qQ@6K;xVgonuYfgAw{*Y&?yTZbNT~kgx_FL||v2mt7C~WOB3!2S*v; zq#sIiMCl)dz&BE8XwjA~JpLRx1@3Gi&<^))_LOC=6d`~%Q3Vx%0sDnD6+;EpXNA)0 zvlI?$=l(j)PZ%M7IE3C8!%dl(viukL&_6~6Ah81Hd&;vpKzP1K^Sp8eu=Yxw#}&+v zdecCxPI07=E~I+lj%{;}WH=+QGCo|`HfKz99`L6&&oRQWd&d+tm2#w!u#Mhi!0M?} zwsUcA*pI+F-?usYX+rZcC@@2y^s3m?R6zVg;)h7z!&$%Pk~paNhlJ8DKx9l<2f}&Q z76wQ)K%i}C_f8}2JRr##o!7y3C&6}4gPl1IHq$H^Q3l`{g%W816kNDEn>!7z85e}V zPS+Nb9@xO03~b=eqEQXdcg>MQ8yKVdq=@2qUucKkjnEOlcD`V*T0wt@3FAWS@20WH9yl5V1Y@BzfR z-A=)X;-=Gh3So-M#6BQ8!XNa_5x2maL(LBvRGmF=dcCYv|1d5EBWn*)%2#pz8`dtv zN%r@^U{OQ?TMkvsGb;FKP$Q)*LSllfA(bfMj4)u$J4 zaeniIIC}YU+|_hAhVR3;ctCt@$%3N8S@hQ%a*$OtgtY6gk!|(_H{C#ukNbgX*no1p zj8(cTkS;THEF{}+Bb%+no=vLYzg0Z%zYTcDbQ|!ib;iZSorMoOo9?7@ZZt-%Vs}%z zt(*QxyoKWZ1DEQIH^7OvTKXw*{@b<`-bTd>f?S9* zeOQwm9Z80lFshFmF}TNJnqw|D!{04kEVO8GmgVj=U^sWRTGJ zCoZe42AIR07fp8=3{B|=alu5bf!?P1!fU+;&fT&l6-6y+x-<_)q?b5HzdzwOGa=Ev z$UjFdxum!kDWx}wuKE5sifg{=jw`NApr+%fr76TSSpr-h!=55Np1TtI3IrULC7rDm zFErexmT10OX5CkdPxxxhaL($gKRqK}(9V&iDYNraaGJTVQBem!$9SFxDdY8~0m(Ky zPgdqA?+(EW)k+oO%GY^uiJvFJg@c=-C~}(Z3C3SSpO%4n^}af`SW?0N9U>5*16~ z_eCs?FVA4QX5-q*Nb9}ursPpTK1qKiPmH>yAtrL9qg)_Db1!LbN?(U3`EjA67k0qA z<|*o&@Ggs1JV)Y6zzR2-zmxI``X<47`$AZR(H8nt zQ>c9lh}PqPnf4fm0rN48X+2d}8wnkSB1N?(hXnTDUM3!=8DT|=cSe*qCvmmBX~Mp< z=aoP%RWy&bv3c3da-%d~d6UN{N0c`$*v^~S8r7L=w{yFcS9l7Cg%*P$*6b@QMnn}s zYhqTSV-Lbd9_?ePl{*X6MW-A~ZMqMN5o;fu7O!BZNcD)#e1XvW?Wm+7=JU2=nyHD{ z-?SLuQdESujWtr}U=Z-LzznDegisvP;1G`pf#+~D??)JMzli%00zXp-!0bo3;9ClP zOV%7iA&mxA2%r*P_z8Bve2nyIV`w`J?+)AgbU=EV9@N@JaQ5TCwXrD)aCi-z{T2#N zr$QfyCxpQB2o7Chbb*lM`&6(Rmtx!}ZvBNTdY?^()x0inVQYv`Bz%l2D3`E*9W~UyLK^yI=oS=y!Og z1jcY7(A7h_75YvLXfs$0gGSpZu!f}nPu#o5M^&DQ<8wJA0~t9795B_WsiqbkYSE-E z@nD@?W)dz510gfCn#8ttN~vuznc-4Nm~e7Cc|CxwTH5vY?a%GfuDh^XOM+UMNo*!u z76MWY%G%(vdeZQ1qq0eWEc1Py=RGr-1ib8L|M=yTnR)N`_j#Z9d7n$Y+!K0_5rAT} z;TZ>Le52E*FHp%NYY0Qctq98*0TD(J>RuS$Fz^4p2sgy0b>IyDfglun5VsLQzWzyCJ3&86p>gl zGgXcHNq}NVRC?p79p_NWENgtR6yVCG#qz*AxH`IF9dtWmfB;;RsAiB})>j?Hh26br zhVw1Hk^!&jSDVqLT$3KhEK9`=U#bT?57dyrCi&oekKAsb&7^|wJy?NmCSc$wCQ z*mNE{Kw~u6OS4HuLWB91+&nDM{<&gER`p)7nIV&7n8PJJU-NoWJDTWa!+nV=hIxlR zt)IN1!CWYQFoaLj9Io8RJHMDcLxb^w$~OoH^mzuv;p6iGPctdSY{p?8hg$^0n%~~| zz2?Zq@8I@xM451k_L%_t%z~Q>PvHiSaggy1fQKR91i_%O0cbPGW8$_CVAZ!jN#h;k zCu7@_xWWhfaXXX^^9`No{59>uUF1NnGtO?ttKjM(j3pi1CUz7F_>$KMg$#wE9<3hh z(I(ZSQ9TchCwAx{YK2vsp0veDY!x>cft#d!^foSk zio(b2iDul9hWsfy)h8%|hBRRV%xa< z>On29MJq5fjgY0iNJ~%~lOn8tV;o9wan)N$d=(3Bj)&5D*v#X9L&?=dDmF8}+#bv~ z&ie+td_jD!+c@=w+!I672!$5+cIS5SDL^?^F-4A*PGnS%N+-7J$%=Wh@yx^3fHJMw z7VfbG1*JS&0GB{68@O!bl30;V>9+C3!jU~g(luuUp(ORbgSt2p{B~{xzGrLOspHF< zPr8(7j@(mwo?Ap&iGqb560tb}SA{&|{4IX+wI`Cgx!3&LrFi1Ky7RGbn@oDH=`+dG2A_$?^$qEtAW!=cVP2-sBv0G) z49U}mpW*VfyCoBsr^RrRr^T3$k*B@;)=!Y9eXNw^Y1^Jb!PMTgDe|;?oVT0R08V93)JO9+U(-^S&@4Pm7i+ygkYSe1g)~_r>F>^0b={T}qLst(1_( z4DAW}5g4*{0xLy{TDXmuO0e+1f04S1oJr%>OZgqEa!8PN`|2FLnRO$=Lhjs%#^|O; zDcIv2REbSLf$lX%v9l~bVwOVJ&_?d6{b&$HtTZ8_h0F1JCn!jrT!xF+WlubAeWHow zVSH>yCYVw?E6QPBd*?i=GbqZ3He@Il(q6_*C>C|G%3&BZ6em3{HvI)#;+Dv;!x?a| zT;bCnx&ub&XZSFM^SyK)X$c!wD~F-5FKRzqh0k_X!z?Z@8D|!;e98D|zuc>>%n{3b zmxlhrkbpamw80*t>I@_8t8(}grFWJ3bI7&`>Fe*HOoUQ|s*NQb+FF`89d#i?t0d1Ad}v8_p{Bi6f7- zXzT5&XShi9oR@3zYX8Vuaf&}%Zs`0x@#%hqi{~THX5?fGKN9%Cl zT0rS*348JB=C+Y}Eh&Bd8S-E+AdeDoOqRa>3|WV9Nfnax^&-~Qe1bplbIEB~S_?=e zCUL2V%X%sLR8mMA8i3+{;3C!#?KzaXMcGhCIMtJG1Yn zBUWH{f&US^{9*kykXRM=tIPI}FAp7s;)>+{+RmB@{Z;emVF|@iT>{&KLYJ%nHt|M# zr^zIkqVG$9-z^&xI|_=U1Cn zROp?1K>R~Yb)UAn2b8fpH>X3sGZOAjD5n3D-^$BQGxr$OD)-i>`=kFMRSZ?2?%hgz z^t*Nx){@KY^*I2non>QwuUgixFSY<^I*P*lz08fqNf&$J4l(pFt2)oRsi4jGpoLy^ ztY>cBkAtRPi@8vHcRX~~r%$uc&`rY@L1T8_&&|725l;8GANi2n{rWrRDOKGHKo4p= z=j`^b&|P1M$Faq1xI%x)Oh>(Sc<4E3v-5Qb_E*5@>VF3j&S825$3wj72b@n03elku zpMEK4qL3da3K{f6stNkAE0vgNr@e@?&I(plh#lW3#&^Mj)v$VgBCvJH8y<6?G|`?J zz#n`yD?1%vX#u&FWOzfp;*;(n9BNuh`j{ymN95;uKz?XF9bxX%NPjyQP&O8uLTGRa znNtl#P0PA383xwQGIOeMHX=Gr&3J@Wo?NL_4y;@e?_=(hq^fraPRQm+!xp&}g@%J0 zyz$WKc<42K9Bw2qKlJc$mI2H`b&F>|WzqD-Lr3DFKK(vuxM3{qq)G*2FIDQL)@aNv z*1c10MY-kB=a_o{8o3R5jpSBjYZ9A~NR5vs1BoVme>|R$i|&oSC#j)6Kvk(-eV@{< zv(&D$`ai@kqXBjIfJ${hITg-#8i!0K8#K@~wShY;)K-+I*4M?++?S-bB8nRCz%Uky z#5=I*O3%YSeL1o_Z^u|bKD4rPa85t`6s8EP+Cu`CnNHr zKSHJ)S;H#kTa7PG^?j`MX@ssT=iv*K3715X4VT0&!){1Ge8b&|kKM$bkQuy&^+qp9 z${8_#i4dGeo#%daiSUv5W0xH=7eWaQt}Mt}n8{o@YGJk-+Qka-$tmW3iJ*C*q*cHg zz{lR)gK94G1Y>SaW#-kY7C5qRgWb8(r++?*vk&PJ%ReYK&lB)CP(2A7J{abJFwL!d z*SgSLz}@CJ@k6hw-ciC(01-7;#2@>6hv~s&v zmji7oLUwxa7dhZoT9A!wbMA9q+QE9pjU*We!*&g+kkIe(5$J2&Qu=T(^y8o%fCVm- z!5_l13O_2Dg0tgw^R$wO<8?V+{oXuYafpQbismzqq!ulRuNUGQ=IO4R%qFXc7;}p9 zC}v?m+43XUQ=g|*Kfp?};39Gp^ntmLC=mxLuyCMJaVgP%3-7(O&P=A9-CH(SO#Z;g-)nT^JMpHo9&R!)R3k`Fbt+nF12leu+tEx6}YfVMf06q zYU>UJ5G4qeD(17gJl2LXlS(w(dI*bKI-iA6bQ0M=dxmE7G};oZN`upP>3n1fJp`qx z+p!>MHsHjqPoQ)8eAG0&Je!4dCyM0tLm%SnZ7cNmv&^us`s3^E0Fv}m;A8biVAODW zAWiUkt-jA@*7&I7AIHl)4<-LencHVgmb(ofBD(^;E8Br?L&=}zVxZvIW)|k49 zFtTaDy2&N5yEsY0uLz;op!QWq5E1{*#P(s(1 z;8>og6>vu$91cm~xZ_m=I7XACj`~*hgc{?9J0M^C0Dw*f2Kz{b6@oRw2TW&LLaox3}46& zZb15M)4||Mac|T^0t>aSdsE9CxOpi1-qa!o#37LvIgp~ylu8~*%ZMgQ4*eFjd7#`* z4-BO7{#oYWj;d~dg?=02No9mQm{I>ojBfBK{csieG!#QWm(9>tj@Z;^CJ6}A^uN9o zm6dnf*(i!6ux{cHv&p6B>jB6$(BW|&`DshX0s7(zRC-=5wW;25MYorS{siTgKyLY- z+WjyKM0#YiWA5|RTr=_xz9F{U0>Q7KRC&yO79+Gxc0&dog)ZucnTV(!ppIK+YK3Se zuo?LWA;jQRf{5!VA|xRJrQ7a-OmX)(4Xx zmce4H`|R<-0xfH)S~UhpAlx6UlIF^^Zai$UXx2zmS2N>(dC2 z9Ds&w?`j?b*Ib<-}j{@p8R%>TV;Kt2r1>{4ovVA{7M5K^}Af^uB^8!vS z49AKV@~%4AW+_jtAAq0vtPo|z067R{ayo-re^#BT#LePk9TsFb*a#~Kg=V(xLJ5n~ zyd~lRv$lAi+#@an9 zSG`rO$i#{4g)?MnHi~+rsTB@L&5AOeWVuEy%7GDfA`cOq!1FpK7_i0*&@9syNxAS~ zCkpJm3}}!^EboGYvM;~VhNb3Mqxo*+A1|5*3+xxlyH;chvE&!!Kx|QtCa5W4^C%rF z%0UY&Mf1e%$DusuWz?|psKDN28SDeO2;h7+w0!fmP8h0TRwT*8^*1_uSe-O9%LsDF z!woYq$N^_~r6hk)FF23FLV&%(dgV9k)0`Kr$H3p^j9FnD!d>m0vnU&GedBt?`O92| zo3(ySt=DPBK2fs^;PQZ(j-!PJd)Rt#1zHVqhEDqcT>YH3G$1b7E~7)+^6*;r=zKQn z42`k-7ogI0tl<+WOA^0~S-T;%+K5;IEsoEar|~t);7}I=lBi}*&>I@hp(X89{kGZr z3QWWyYV-NkW*CUL_J=XtrWJ6Uz+is#j{uIHOKt2?N!89_L|LY@%%MJW7LyA3u#NT^uuw#RV5 zp23Qh?ljUa|ER?|CLSmn=gndKyVCv%U2oPYA$~iXsgX}&&DJg}3`(yH4jpFK2L3^k z#NEftk3EU~E0o`8IIDEekC)|yR7SmF)LiDyV#l1+Rqa(83g_>su-@C zOL{0%Ub?XUTGpp7U5JcSh~`PwC}6NkOeiQ1ol+rX0uKnil!^zWz^@ftTgjRS--k=C z=fU_oLErn|6NZ^XGizSSFrhtZu8nW42}OqTJkUxszlFB9j^lj}pjEvD_%EzUKdSPA zYX{se%GY2jhgxRGgu4)LZb7W)UK1Rl!8_o`VhY}R?{`DB!C=^8)UOgzTRNvkwI6`yK(Ir6% z*e*x^CXIS*h>Zkq1f=3~exD9^)C_}8p21WFJD?^I4NZ{JD4qXm#xgJ3m z>Zg^yhb}v~yx+-?lE%!Yu9t*<9~5zAB@b1wnl*SRv>ve_Z+AzQg^PE@J9@!In%$a5 z0JZhl{p8VFu`}NIhBf+gMX-oAtciC>sMe=-3_FQqvp!3I>ASG>TTK*>vG@mw=?@`C zyd#1I!y?>HiS}49QN+mXt%$Y0YPj{U7hwX_ZQ`xa?*flM*7~9m8Ebthk?cCs3!4{f z9WX+wlPY~UeKZzE%V|(`JQmI~Ts^LJfX)QbnPQ~Sz^{G!wY@a%J)U)@R3!#Rc`g?| zTue1?n2cv(q)x;a=w(F56QKC606hGVZ+0ddT|Nq%kzcAEj(1 z+GBs$O>e4blM_k{&OksACVP~P0b6_vPTrLH!Tid8S_&a?Er5|yi;1iJ4F&y-B9twH zDRk{x^I8+eFHBZZfl?0ab@^toFGBzP!bR2i0>K@MT zz~+VK`26}$&D3hujp~k?zm1T0J4T|0n6mTi8+K-u`@|B!Q|$SV2%&je*_dHGPKbww zb>%z8Jvvh@5b{G~V)M;r%FGG`SaxL+wEJduk$uQ!orH!t&4%>h6K0 z%Z1S>tm7@gyP|`V=2*;@N^IHV=TS1w{UP$(;Ju5Vj4Z*#|x+Z8!EHTMoLYY`y1e@*ST)_;%GXmZk1@YdAGyFH#FL-VEt1tH;Z=d>&G z2c{$mK@z|IgM}#Ob_8uEtjYVcB>DC4=X0ubB3;=uRKw$bN3%DhqBd}zm7~bBvDO<8 zLG#_O>uEK(n2=JgwovyV+g!?4^^TeeF>t-RLG19&)PyR2UmsU1BdYs(O}JkZ{)j

    }&m3tTK5_fm2?iV!&4}5n#Tpu&3l~0IG`yfCo5;Xf(z_zJkYuPSq z+0)jt=hadPo5(}s>i|}~pg&lhY^8e-Hn9#VuG?tS0N%SxeZ;PL9IOmw7p(5*Rgc~3 zei{({n_?bh?TM@9Hq}FVO*P>ef@B9-RfLVH?%oM|0v<_QY*$yA&s*PI8v20M?_^ak zv2w{;_5`#I@PHilQSJ#=wI`9j$gaU2gdlc)qTY4*I!&@JP{a^ z5kaEtdg#Cr)VsIS#L2^Jo~D`G{WYH0ZY2I0QE=g6ucJj^_b@4XKChy#F84(hx|*hz zOVPp1HXEDS?wQ?IV8-8BZ3PzmmD&od3@+NQ_P7L70M!wradTU~N7yn=_ShTJ=!w;i zq|vCwrIx*_^khQ2&}P`0IFj{F;?4}c$hYPT`Yc=|m7Tad+i}d%8ai+15FTo*?A-v2 z?LBNOZP|^mW$*OsN4^3@!LAwBXSb5(-@lV5ug={@UMQKl_ZSAi**b|AqlS(!7u+&m z&5fXm7Ud8`E_A=H*=hd7CnK8R#=9j7k?utJ4MYBoyCx5L8Ezo`XSvAn8u3G?^;U4R zuX4QZI<@LWzy2qpQVMFCwq95o`Wwt*xc+rh(Baqb$F!j%5Q#!D9^23i@WnhfWU+~d zUX6dX0=lQq*@^rT)F`w2Rloj6Y(r(Q(qqTI6^b2EKzwC@<#4Oq37rzRR^Wv%)Cn>9 zZh#lR!d~x3+zh2+GnFXOkIa5+uQd4~cQdvw_l*HBe zBJF-5tREQgJ*@r+3Um}o>gF~fR@`Po_`rT*XO1=)nc3QM8@t5J+Tu*rqOF8u<0GFw zz5`O=9u$=N$4p|=Fx4|Za4*#7RjaM^J`j|bH*CE~Eg zaM73GepO50AhP9eu&tk;+@%0LSiiv!QG)x^LmTvUd4sL?uejsNb}_$Xt$cz(5yzqF zl@t59R8pnJ3&Azt+YqwFOl#l{HFRg=g*Cy4$iEK#H#J`PN!_|1qkkj%XF~cPJzN(` zin!L0{em&*Vb~XHD*9C)x>SOSeoiG1S@Dt&GkDu5` z&2(xz=U_Wb7mSUAbM{-Tn6%JvoavYf%S9)3F4y-Ls^y)}xWqf@mUJh!%fyeMT@-Mo_;tS%rKK;N5Zve87 z&8@k=nqOzJX@5V$-+_9e5kmBRDPzpQ4%G&MMUA9J{}5<7(B|XzN)VCPc7)PGG5WSZpE%#f1xfY+a__jrFg9A7KSsvJmj66@LBpdaN@OmgzkK)Zc9F4X7Cm7TtI1zO^O<7q5 zss(QsfOMhS@r255Db zH?3bkk0u+}I}9bYe*G-@?J=*p{9!LWo zd^0NUr*ezrs`1)C!~Gb}8(*AT41_vK*Cg}IgQk1nqPylN+kt;XmDMhc& zc!m`HQ!u;xmH}M#0rZczOZUtQUEg#fIJ@0zzGsCwG!w3;fR8kt2%SX^^cx~duNk05 z{zA7SD6O3VD66Eu_~s>CjziOs6~&~C-5L~?v3bE6`|%+eE}(e-w5bIya(3bjPI(Wb z`ni3q&se{RxBgNWvMkwf-BGE$KO=63ap4PoYqUhb`&4N9XbIgsg4d1^=#cQvL+lWE zIj)kBO-yWRGU4HAgG1Wkg;uRKS$hC~*;If>Y$kv~IHql?@GoePsh@~yRoz!qFr8Om z2|i~O8@!8c=XgZ2U?`R~BG_JQ@*_vVl(LT*WgFweO&9{mpQ|sraI&T%lf&1 z2n;#mNau0J>F^~w1RxK}eL@hK5vFzG@&tJ2S+&MA8(jK_#QkDdJsXL#mO@{uB>Qfx zTxdRlZ?ZYitLB5?D!|uS=!PV3l4|F$Mwkvx7MxzwnZ_3#b31lff^$a;h`JfHDg*!h z8=5w&(rfvR8Rim}Ztrv>K7^s#68kPo$f_+_;Pv}fs!QhUZKX8iG@8&JIJ(xHeovD0 z@B<0FVi7j5c?7231Dy-rL9}A8F1~-6CkSSu);84SBSLQGlIS!>y9bl0D--kciV1eJ zU+mbAc6S2urI08dXt@L2Y70u24t-thXjwo}-4r!{BI;K0z*FcI4{XB>JH_37;(?gB zyVrU=dU2-u6eij?{6K~j$bS|SgzT{v7laK!(9j$R#LS(0z$X?*Rf>YZ+l-XOsVR|l zvNL>#krJaAwISBB489+nhxAe}xE9==A>E5T3N6IG%;oU|w8wSKbMudReTYF>pz*i94fNfM_Z!yuKmwT`#pxXABX+`-y61SM( z1E{Sx8zKW@UB5jbHo#F2*up_@^+wNFt;gX~U4X`{z0B;iz%2kr683+*1Dh-!*p5@n zhFAFX(ecZ1VjM_BwcRcVHTQVHr)v=l_bkIg{sr z<1~@;3iuj;lYq`6@xaezZLFRJ7IT@NBKJYzSVAJ5}41FHv)0p>;!z%$c zXnAl+b$InN7YQJm(@^nM$6;2O8MfQdBrACN3ITYsnhI7ny5@y$NEACed|(YZprY@i zBlHEhV@)Ij89&+eEF{(id2i4=kdL&~@RT}nVCc2W^-ZBXq42Zk~%GB>lv=`DY z;AwC9xU|!fmDXGV|KN-#Ef{vP;fZ5mHmANHTqV9B`2xW4;Q-*iT;x7=)c2)~`b_45 zQVu1`XCAmi9ID0vz8Zc#sXSw__az2rr4X>pV%(y$;?x*rKYp9G zJO+1=npg{Z(64&3p@KxE=|-JbOOrC*gy2ZfOMC$?Kuz7me)}vcc-MrLZ2t~&bj!y= z)AGIcU>57v>|3DCa~7rwD+{2Stx$mCI|D1 z_a)+R01!W``9y<*t;>?%*m4a373YUc*rS?pY&sKTtU}!(f^tSw^kC3d8nP+T>>;ZXg$>-|HRIWn@3w`$th_5Kf3a;e7eeq#2qyZC zvzNqkUmp;6cfs;_(1M(7go2mI^>(r4TXDLc*5G8{KY2woVy_d|(qsx_{8n7if8=`+ zRJ4|2#~N`A#*uq&D?ZLwB!*x(bqK@`J_Z4~8g@vx2?bfFboi00cUT?^{p4f%%Xz}m zUVmTQeK7$D^TYc&AY2gMp8$mWIUt0PJPMf+Q1;`AU03Tr|0vsmy!-9;8EtJiZsOj9;{JX8|0zjoCnj%>Z<@z;U}9~F8PYFhZ6r^y zchxNOK5Ub?`%UK|m5SztTFEUR-jXfur6QHV)xosIA)$Q8>_Hu>LAtWx-l~S3flPi^ zuumrGJ-9iWBU`4&3hZqr#H>nH3X2X1)<#^H@lsn)BW+iF_-k;)DH_$yxCFHk+f&s| zyL*K`CeZFqg}2In1QFKI3>a60M6fw4*s}r~49#f`6{LpK2nr zbtN|PK?_t9o-ox3`7UN-iyu@r(YfB4IM+K9%ej*;=NniXok68i{Vk~=tPz(`X%^>v zzyViFv+;)7@E3qj@zN}`!cYq5k^S+2+=gdV?d(MMIR*rT79MA9yTBFBn`MquJxV7( zUjA@p*;lTI&w`hHgYdh@u?0S{V;vyfaDIMRcUM5}s+%8>dp3N{In4SzV#i2|ejL__ ztf*_kK_tk!GYI<%z3v!J# z@>}B#tYBk2*eAsE`dB00YRTfHT}{KKRIoW2<(eFIWMcp19whS0b!fTVhSumGWTh^& zgf52n--z=VOlv%d6FSl*VAxH`Fbjs+g0onf(n)Uv6e?h7Hl}i}P zrgEgqMbX(N(`Xk~fw=<7Tww|p3?EbnK3l>kpikmi)+Vz+yeift&*v4a67Vq#3lqK9 zhN_7R9nM0@r6Ma!tvyyqmOR;^-ObF|C- z8wB~yIv0zw@S*|Se`ko$rGa)p>YRwuC;Nq9R3@OCUTM}GEsNFgft zU`H?)^D#?vL~O$@+>81M#O+(~dv65ofN@}pN@Wco+yh{jS>%=%5!z12ROIyOGww(L z+$8|dt`2YCyZw{kEx~-1_X=E^$$-6y@rO&wLK9bbPiHefl<9o-U+rubHM9csKRlmn zKJk3UZ>v%Kmb~Qod_!=KGI(!r#$vI#4i4w?q3NE%wMfvsY!;u0qRNT~KIP2j{qvy? z0SUEpz$z=&%Hsy+h)*?gU+8XFcO!kbG_Hcs8C`Akt6a8*zBB}qrNRpR z*AQ)#=|`@edO)B7CEiBuf#cq@+Ni&T>QA4z?y<^odf6c5ipC8OO&)AJguKR!>3-?S z#4Dz~P3-Ul(Yjr4?G48GicR^DVd9!WQ0GMOI_B9prNe{2!uGaMKU=7u*KxkqDd~pl zRkyA!BHfNW0TUKFtz1<9Q#jxU7?q4^dCua6STIR`f2#KOcnJOnlJkO!ipH2{Gd==W zj(yx^nVyK%GQByD=9iH0J=Yr#o%ic=bR=Zz#E~#$$&EWNXr71t@zC%j{D0EDTHNMG z?KhRVB&QVsh8jdV$A1r)kH?wAK5gy!h4R`0G=m5IOof?qg$dG^JjL}fb;$)*KEQOVZyxBZJSPW3QF#Iw{NxvL^ znWLoFgkL6t+I^Fx$Iaa(69STioT1`*e#Z@FqA8?<=D{B#& z8+lz+I1`pZ(9?t{+lKdI7&{{9Iav!u*%x!7-W=n`Gnux>k!hmuZTWcmo^qe5;d>uP zq>E@P)vCH%=x2(f1UyGG6qY~qcy9$3fSsLL4WUJUw zCj{h@`J!?i!PyOf2V8@j$9SJxz)DuLqnwy5c4T}UH5qSMR;ntX93TuuY(gO}@Ktjk zqL+Xmlq{sO9$-h+N_re<9l)Ig7n4>xWSxwx;dq(FX@=s9Eyjx+rt<1P{xdByqbit79b5 zfg?MK9-oOM_*zFIeISKYo-&|$?65B$?1d|8Z_1k^QV!X6e7j@A(Awk5YnjfTYSbd_ ztKz)v=>*{le=GELk8J;TVaCO^Q>q4{fWCy1(%3z<<^i$e1DZNGXsz$4q11UBGv@6!G%|%lXuaCJb^JTc+t7nNUjGO1 zv!wz~*%+TPny(%IK6So^?qvQ|V#h&xu0?yJG;tq4VeIFnIE?)OFm7bqm(gCHCHL1$ zXx&HdZ?HAL&B&TWJ59$f0q#-38{kqKf2oxwpcN;e!YFKbC&jV<-=mfb{uP%cU*C0cI)!h zSKUL-VXdSTkc#n%sU{U@S=ILsNmG{~uTu&zK96eaE%ZYV<-v4tU~tW(lQy|NR#foi zQB2EYoR&u>D;03@ipqaN>GF0Y%!>+1NVTrU`B*_?Vq?RJm7<1hp~d2XR(d4=$cxN^ zd%g_LYaINvTXxO~EJwHO*X1&|RDAIG{-yzwU{!sEEzgpVZ@H6| zWI7LN_BJ28OB0?PkE3#KSdc69&Gnb!kOtdQlBovU#;a?t0zf9Fh4!mGb-#`!X68K2 zj07`N0KhUJ`(g7A(jvv#aUqsWxHC)H%LmQ4hno+Egxt4>=4b_RFP}dgph`PQ0`h&q zy1Dg7xfORzeR5+YHh!qum|Jg!*zuwMr!OJU_&F`)5sCLn~(+P~=<82RbWegF<{i_7~{ zfWuhx2mptE01o{G98k%=^DWr)XvQvO)8jlz|AS5c^TekA`BgT3 z4p!3ZCY&&ZFP$P-I$Z?zU*WUAgjFnHOJP1P1CSOz#ESrJ)Nw-c-F84qw4zd)9`_>v@&&M=6ifH4v& z2+7@F<&56L>{Kefn+npl2)r!oQIEK{*lboy#+Qcv0~Tq`{pKZ!x8%fp;OncOle^d+ z-h$0{nOUiWz3D8KV6%_Q$7`>tiMe z_X8!2sVvx_9h@e|scOMlmjmMNkWJjXY*svAg`Im;T@GzL1{e7I&ED*qo-pB-Q(xpb zzAo-1$~$|a5$S1&ZJC=R8|~JvO|ueOMx0%!)>d5JrJAR#KgjZBG+XInpsj}^yI6{=p7G_O|EQkI-II7f ze7OTksW8Zd0p}sH<2VlQTR6P(DX5PREg(+uaAH&s)p=->7=xP7r|~}>&zfpuB$NCR z^wc#@ESF+OV?Q?NZh07r+?Oaa z`NR^l7)7$i)0j@!qgt*g&Y-XRm_^(>+;|zu(4lLf!O)3H$OKc_6iE#*5$o`8aDald zp#|uWd$y$aG*a?W3%-v8rSLxfh>{X6@bH_ahTA5U)L_JzAV#`MNf@4em6DQgN|h7* z8ibEm2PYUzzL~;az&xA%>{2{91{lZK1a%Qs_F{xVo`+XdOkycXP+3C`R=%0}Hckd} zllU7a>i6QCS^KlJ2#Lh{e`s<0f}%nyF3ML$-?jSL7@SVbv(ehc92eL!IQ}F+hnr7? zGT;krziZ+QiKq+pI@W>@_5oJB@p8b~f=}TAm)OypTmWfeM|E&$ zZX%hmF(p+$0Gfb&n6o^=y#>yPhRyl)dMGWBUuh54LLqljvvVe12B#Yg8lg1UW@h0S zYvCj`n=QeW5xi$2^$iJjj@ehRbIgDx!0N}%n|p<18B$?EKz?1^8j4RfOgS;W%DMTU zvFsfN6jZqDqHt56+-OwmjHOA>$m?*vJB|6qt0q0m;TZ59BcBIb>{2ew z3;7b99%bSB3{yx>@OxZi@OyA;eBsU{3sWaed}uanqnUhTM3^CoO<@zFwViw!-8FP; z()|UjWV%sFD1()5W^b^nadX!3L;+#@EL);jSWlmY2W2`HW8MsRpNT@GNem<6c2u!5 zXiHg70N>^-3oW%bOuQP3P3KIgZj7&w|D+dg8wX-1X{+Iu^XdQ8mjq(3V6Ki9T!0nG zLCxXR7f_?uO$a0*tYHq4rxWn4^fH00AxrMtXyP*e&abrvC3nLSvY+=16$ z9b%1}g?o~FZoy~Ta~w{MnKxU60;S6a@UoUAB@{p7`BG`R+WCS<+LZHUJ_b>QPo+~+ zzvpP`Swr{~G4J}t4zso&Q^G~N11|GE{g{PrvjEIyvGhd#i~mOXQ}`{2Ikd%QPLNaB zXJeGNLsGQ`FXJia9>>R+MbS;cC8fbRDeuTXm|#XKvwbA~n8Zd|;~w}%y{9=C^t|E8 zQwxd%3k=F%__-*@diAY(ty~}|Mu7*n1RPQlg zg&)~g(f$i;NqcvWS=<{5LHG;^ z#JuFv3LlCmPBGtpG$ShRJt4Z^NE}twL2LNkzcJUMY{wK~i6aL6!2ozHU*1nQ(z%Iw zTAD<^=rlH9nvE3*s-biK6P4$Uvu#ag0>P@Vk85n_@D+jKEO`f2mh8~yk{yaaf@1LD z2Q2*FYoB`Gu)$$U<=QoSBdpUY@+SD^X!osT?U+c*Yt&m0qm{&vr0@U#43U@W)csqA z_#0$FGAUZ(L5d=sD`Wb9U$|_XE38aPIY-QskCg(;-I0{@1LZ|U7(SD@qL?^ee%#MjkRo^Cw5|_bG^Fgw#JY~gIPS8JgoW(x1>G&NUfN$p^ zD1Kz4gmU-Nt-aPm8|Shp%#<_XA3fE4u;CnFq*L_u68(ei;pGibd048mr}@N22PrK4 z#pnfbchuUmDT`#BovC5irv_p49g0cq|4bz!;Sdbe&q)qJL;`=xC`?J8&4(-{efH#0 z=;ZfjSL}Gcc5`4;^<=MV7t6ZT7({AZrxw@mR{k4*mK@DSxEwj$4@nW)m7HqHKZof&Ct z^$)OLA`!D)u(lD83>>-Q{!U`ed>J#rW$+f(PUO}CGo+s{?p>B)CZ1n$_c3QwrJ@aj zH@T4nSW|s>g!5Sz8tk{m`#A9$07PUPGJX21A6_7G58Ht75W_%^BBgE{2h-Z;XM3{ z5t9X_G&x8y1Bu=7sJ4WQtHt0{TD|{T(hiZ3H%Iv2aa`P8DZ#y2++9Y>4lYFBm#i1% zi#NOtfzgXMkG^d^WqpezMGrw5NAw~jt#qIrdNhS%jcR!dWw=<|Za6r4N{-zSfdr%d z(fG~QUhC`DCMFVS1hCT#5jU89uYn8U}%Q-kQ!JAQo=~m2wh65mb zn6xOER~i{Rk%$n;r&Y$>j^O+NYex>%0Gt>ojD4UTCr>=^Qw&7-x9O|Qo#{LTaaG-r z_OvNA?K>t)i-DAO#za~)Xpu>-Ba{Csk-p_H=v!%Q^@Ge~W1U<@Ps7b{Uk;m4D97rJ z@5O6zd@tVG_4jsOB6T_*0T4w9Xs<-m$6-X)0oQKKHskM)!v>~K=qCCNG``Vg_|F=C zFZM2c-h>?Jh=wHYF-)Z(B`k@qFaWwD3W}W>X$@%?pVU5D0V!BonqUt zMpk@$K=l;E&so(|IyFjHJ?pZNX_u#4UZL%HIOaY_ppD z-I8oZ^o)g_8rmXu6bids!Axw#l*TJDVW_kzvg!WGaT)k+;Q{^Nv}WM95d9AdQ>)JL z;Au*aEu$Yop-XDj@We3mQ~mu=KSZML!*6D>DqUS7Dc#vP7iytnB$`bOpkr!bCUc*K zH6fCzV>o5hf>rSinR@wu(wU%k(2_dpEIV(Fs;w`e$K7u%#m+gVlxK80?<6u7fFM!6n76iMj@d>J67ga`p zgQRCz7fGjMHKq4hb4h zi*YzK8ixZ(^|D4f9EfRCfE=y^C93{%YMOfP3) zGpZd*EL;9_-2!|H0+dV>P;t1)Yv?BQt~JNk+w_qPGQ^9jG09Sk!2X;YQLD-F>dV+d zxRUNiWJ~PWiSN4drMh`Y?B;k|g`bzQ2TLLBj0&<-L6>qPV#hIc8|H?9AFFgO;Ayb~ z3vR(l>S@8{X-f33<$1$nbdgdfdYOzgI+_}vlNz4~XF_h|D*UyL=WsGpRpdH|0|%AV zD~|?Y`$=LGLf&0Au{jeVaJevAAfVbRvDpTG)OHlcW9t%*@KVX^S2YRwE|xlc6{?m6 zPF?Uo6sie@<34=h8L@dLq(#L~YI6?6i_M5w#hNqY38T06q|1?XWg9M~bC^>w--K^X z!vrfd4fC$>d-YTQg|=q1iN}qK@uHfn-(xlU|AjdA2W%Y7r{`hRTH(nO4^X|3b^q_^ zwNUJ!O8wrLCkN}(e+}X657-gaGY^v6joA4V+eWz-K(1_F%!c3LlozYGVoU3S-~V=Q zq{mZjj(Hx!^ffWh8vISz5L&j1>zr&p7`zcjL~P!Jsj6AjNZ>RQP-GK~G~%Xf&0e3@ zjIUM|UVY>{h{dio@c?K+v)g2Ny!t+fWZFY`X@6~=(l8HUrCPpF^(+cq2X$V{$HTuu zkNhh(+Xh`!8uCn`>zQW};U?5^DD?S6d>*$5K#kj0VOT(NJ79j#m{ko2I&@R`(RHR! z<^dc(7E9VodeBJy8>Ey5GY_OqjxI2w0imDh+~=_UW5~k~%VY*D6ED)MR6;jZ&t{{W zFw$tWNoU18wS=irM69u)blnes{2l0yMn*Xb7VxaBAWx+?)S<7jW{lCwaX+~nuvyG# zPOd;|3~Y|$`P2Mx91W%iXRbAk_Ip?88)8JJBV}NrJm!8a+(}Fw!5kJwbWItXw&8Q} zoaQIiWk^c-=IkN-UNAHRzNH}nzVY^wn4aI>Mx)Bc7zL~~#n(NgxzEE8=zse))*~r@ zz#%n-X0f9A0cE2lvo5`{d@}-9l%R=m&82B8`Ov{V{qs=m*WiuFTuyy??g|2 z3IVNFI74nh9BsX=(_tc#uDExGxVO-pM54;G!D~t40fkn;M9Oo(Axwl#!?1ban7|hb z)0M6n7z}su!U;sE5D^)wS}k8ds>&)2`76X1#RJ}Kwv%wijdr$&l2x5n>&FZ;!Qz3E zh2nwbNHOb`m)q9QT?rdoZ-4$WSF%i+X;H&+*)a1LYr+!1EgLVyMF14qKU;}7pa~wi zTWo#aN(dvNM`sYDibG$O`e6X)7aFVq^_~FQFZl_iQo1a10`f6& z+cKUSN`MTt{V4BuKHojuFjG8Gc-e&_e{Hv8MS06n<}dNkKshVnYrs9Ykf zzhSLurC;xS?s7tH^f~O*2mm`SK}fPkJr-7Ii_y&$|H#v3c;t`7)-DS+v-~nOkk8{t zp#&|9s&1VF7ksVgcJ|0!^)qYs&Bd8VU_-muwvx5cZLASbC>TPGu0L=vYG~5(5t}~! z7Ly^kBX*PxV53M{No~UnfWYA)>9$bASecHjY-Kie$756`mAu#n_iiklP%Y-x1F*NU zuxg)Sh+z*#>ry)^6(%7+zf0_hScl;rM1qKNU)_4mgET3eP87szpXq9w;VEn@yR258 z9f{h4<0>H#c{TWOiD?86h7DdlkQ9-=>tYO7VbC}t3ms;7cmJQ$(pg9z| ztFBh_S+oW-gFDW_c2k=>z6&tlv%yUHlGuva2rQ-&PvM9=E`{zKJvDR(xpL&!#n#KT z)FvbFxVi|3hce7%I*e`HJ)qj)Y61N$);XRKguz}YiWA^<3Hzb8J~)mE9& zbRu}IRw8*d_gTPa4qT46S7ty>Vn>MpC(a_a+{XNNYnfzyLq1yfc@`QM4|wLnrkIPe z#Cg4JS+C&C>vJya69%1T#3krb#CP}x8(VHi3sYr|=8+KUhHgTZMW}M)Z-~3`k@yBj ze1oJn0vLizm+H31H)QE`&(T>#`tod_Y?%pA$j~@hymGM0u}^;3DTBdqj1)S*Ap-w`URCh79WE% zjpd9yySUd5_~)|anQ)a+h2zXqsumv?l3~lhXJZ~O{MZwLbX|e~i4lDUTn-4PSfb28 z03?cV7vQza=dzNl9=LfWoW@8{WDc z7dyt3g!Sp>5zLVmkUQ}fB)0q&y>H6CtOgje&bi4oN7SvAi6dn^w9His3zS6R*c$HITCO1Hq$MqPrTY}mz>4f`tm@%0Y4Kg@#B zLCGVQ22C6ZlLlhIH=&wUr{Ml^YC!cZVu=_DVoC(Itbfe8tbbVDw#P(@7^cIOrHh7O z!~;9*M*yvmqX`F2>_`XKR-A(p2gkah1eFM+D0f6RS7@oqFTo{tm5i3dNi61ad< z;GCL{jWkk!qGp7%NUkaol$cGvT>A{-*I!SlaZba*2!0U&AzLD_;!~V7dkRUjJb)8q zPa#2e$O_2}1=B{xJpASfljPY`26>hTCyBDB45Do4`s8vo`SgE$KXth>_xR)!wKAzc z)o<7>WnX6{oG0#!2^~N;p>k>%`Ouv9mQ}E|BD!UyFUQ>0g5>9+^d9;(v8Rv(R3Uae zi&MtB1F;t3q%#4u!y{R==xb)nU`2nW(%m>Ffc}9!j!iq zXt3kwH=zd@paH(y1n-EEzP#`kQE4zrIAm9$3wb`)J&CRd!LD$_6B;0-*CFE-R$|Z4cxc{sqMRmam z7qzTSD-w*&&A*zSOqY9Ngi;N!canZ}u6(pGCeV$;NYqYAB07qv2IRilw+yv;?G(G{ z@zAv_jkTeACpcQKXPzvpc}T)e@fIipqSce7da{`(TlP4_?LV514MeVM&TC{g)b?wO z+S-i)>2195Q*1!%k#v9rIhx*v<6He!JU)m>3}9y`-k^m)cpegH#LDjlFyuuX3da70 zQzSotjHs`tBTN75FF@8mrc>508d>*oZ|5=Y{cSoP*<5ROdO}Bbi7@z69)4#ce1Q@E zlXTMrFDJ(8Kf+2LCKT%b{I|s!GovLP?ZyIz2$Czy?I!}AJcF*;0iUbX+ zJd4D=$BYup-0SM)-VX&jL5U219Vx6!NHCz43xk7h@Q8qL2kG-T=ECEHuLxAiJ%@NH zFLLkO{oMNu_Z~UOz1z6=-}i9u7Vf?2F!!$G-Y*-&{w=I3ErEYaTr;UJ-UpLggi-XK z0-k&UY2o+)VIKTa(rp_2Ja2X@y60eq^xT7haf?q!RdG;A33wI*KC(^(Jcj}ArUX2L z0moAUp1^=eO2CsCup0wt_}7}^UxTLR9?aPSuzQh@|4><1Q@gb2c3r(jmCxj&u-b@Me(|O^uc;S+< zj4jp#%)qyr!H+ChR@(aHwtv@>h(}$lgRfg?%FXG62f6F^^uYt%1(-GFLP3|o7x6q> z>xzF(FMW<<-syuovBR$T1_461KAQ;LYT*O*+mk$y>A-_EyD z+63r=LwXRm1SBl@5+-~kHDP)(A*!Yy+zmlE6=Kuho2ja^`*>APB_f(1;}M6AhrR`1qgdxd$p|4CftvIOmnI{u6Pq1#+-=6@{R-gSU=FY3y%%{UncQ1qc&Br3zcEM` zP2~NY0S1P+_qYGVy{EbNumS8)BN+4B5akC@Y*YOLENj9tO9VMx-1bj=;r%)pLhtnu zf`~fJHfaV#Yep?d10UJ~g_r*e6+Toqp?$Ijg46$*2R|?oTpCNC1;0a!7Y)?fA;}X5 zc#`}@5%Qnpr{&P?i#o~w+H2hZxkY=(Uu^iN`}BhZaN#0lhekD#y23EFteGT}_`~it ze7Z#wPmZX3NK}qPe0Y;&3TANp;+_I~aGDa$9C|lZD~_oB0{cn|4ktLKEr#yH1jlrt zpf0h;9}(hr`SiciSlbtw#ioD3-rXMFkNAuUS;st5(9RJwGZg@+xeM;b_qqy2(}st5 zp&W6mcZc`WgP_>-@Bali&D;nv!x}1zp`SGgf6EkqIMuK0$F7*R+?pt$rjwNK7-_do z$*ZLLcRaQwL%Q1M=f>yP#^(fl&cJ6FKDKa%lntM+!N&uiO87hkpE~$#h0o*gc^*Ey z;qxc>{1rawjTw>yKL6F6A>9nW^Wl>ZpHlezvNc0m3BT3w`5}BZz^4U1Pr~PMh{j5sIjFjc2Ut#B}||R$?Sr%uwl)vEr!^NF{QR* zvJ;@NAz`vfhU+4&e~K+yYUz`pVnx^hFB_0*M5<9}jh5FA-MltR8dr?W_ndQQ zHycdtd%w>QK9ilf_uT*Io_o%{=bQ`AYw+~JlQf@m<}+>sf1KuXwfS5R&m4H>n@S@ca&* z_uv_XCl_Eo-!=mO6?o>h@pGuG{Sop%jT#DPP5Tqm2Wm6dR9Ig+mHR&-Wc2t?(uo+=X*Rc&-t(mit z4Lj(aXzYfa^iIO{hB&>`p4W!M^uCSWyXk#9y&t3Z9rWHq?>p)J1ikOFnD#Yl|2i0g zkaz#ji=kre|GYpKKv0| zdd8!;DzJr<~pu_g+hlg;>3fijq`ojxZU@AMvCb>IVeF2N~yWf{m^|qKxjLF-yKmpdm zSh+Bu7ZyO0z*Ic(kl0a8-tK;tl@+)X=n?RJOfVOqnSz7GB6#O>5Gx+iU)0TNALG@& zaa?*ZOn{%H0s1%q$}WXRqC?>?u}UY4>|^r;Cg8b^CcKL8<=p~)l)oyJO0U$tt41CH z?Ak)u)!HgxpR~V(9T5*`@>YG_OX(eIEzP`l3!!WAbYd<* zb=w8ylt4L)sE}(|WH6u)?!!_Jk6B6vEVck@f0Q8OpN2G)IMl{a4ntYM;p9x<&g4)f zQklf$tya1JOdZM{lVD(AsN9{J+=7b6MRI@rI9AzjdkuyN>INej{yf^@8VxY8-@FQO zf#15k6FosXm~T6)+NR;b-3h2(^dyV8*jcgs!ysS+-mrc7m55Y3_&wbeG7dt}gH;}r zbxr9(M(c5)5_nbP50S6;?Z9)TR%G>4h8V?-MONu5G@{4F7TSUX^f)-IRc>~_!rst) z4>G0C-Qyn6D%)AFrs&LOD7~88!Gx<~Gp{gaPS)gI`Zb$zQy+qN8#n8&&Ab9mCT|7= z&SSm~n{PLhcR?|>E~e<(Bu%&~nGcjr`RY(JZm9}*HPUVy%@f^?2m zw%0v)=J!^rWNh9iQcAgmr^!(!@-&()`McP>^AK|xk10SmBfEG}P|$O+c?LxOibpz? zZP}5J6&{Zo;aixpkNHl!-)B{)GWrBv!WEX-0y`_8oSLVVrr>v2D;<{Jtot*=!GJpM zpi2N30z#kz^LBA>{z|FJReuAMPeE^V2{x-SQ`Ciru-8vRh*fwCq_M$G^bH+k#d8H; zJLKh26N03isM}{Kr&!fKrkoB0(dz7uxzunv48Z|9hNIOLTPwH^X_4JHPBJ7vrd2-3 zD*N0A(IaWTljX3Pueeu1+%5*u#j~KF-0zf>%{K#b*-6&Hg303fuLcy~jy^F52^$~KQe75H?DwcK8CTXx8VU z>*h)L>a_=0em4_(V8NGq8z-YfnDJeFyhdH|0YwpSv>vGG3 z(kq(M2c>B~AZ9wSBw`COa+Sl<+u=r2N4rZF)Bc(uLt#LYQ|rgsfE0Trd2k)Poleea ziij2^pB)5PtNRdiWuLp#uRrk}lNsqx+E7<|vE9!c@4H{F&~1!Lfk>M?K!=L&d(fAz z;%xZoQZB@?N}W}uc!`JB3$}wvN2a_SXy2$ry=J0gqyJHV7H27o;;jPcu1%{vjK}z_ z5FKT%wZo#oJa?hSjqgN4K8CEdGJ%zng@=5sc|Gamh4W%^zdz=^&##|&{5-#6+|DWw zCno}XT{e{rELd4F>4)@dUYK_&%{!HqEp(TaYu;%%-|?L45=OUM;eG09i-@nO`*mc; zmFcX^xg$sU(yxGcSd^=v21~@fc=)2a31KjixX04jmrEHAy0IWw)lzPGK=bA|?Z+J# zOSqy&-G3{-HF%jyyCTXlx10+4^+~l*aTd3b5}$aWhex9-P~{1!bG=YFl&p1k0^oc1 z0$?RxZYu5_NZyXFL@|#6zupZosNZwgZrUHw9z@tF9w1vW@xUH5H%d;1Z*Eew2U&FY z03clFNT4HkdnsS<1aZVmK z9uQzi$m=Asx6PPR1_VBhLnohr?6g(IIIzkhRPw1j_F2cEJ*)~SZTG)~QhES;t9lvq z_~HU+fmS`^wUir5nyD?GUKr2Z#(vYa7u?34KCc84@dBb$pzx&T8!pNdTVJt|rzI!M zY?u4|wMw2AanX6&Ww@fz@p6fs30sg;*=#}Wtnd#$lpV;oDK|xrC*%~(#-rk5UrOp+ zw=z3uJ_fC?S_0%|SpTVZ-bmge3AZ#ZM4DH8iI2moRlLqI)Co-b7$5`XJC=vk zM!^#PwmR2hYLqmT6&lPV7~xs=fZliVJbom~XHgsvcLelq9v)logi(iBe(WpTVNJ73 zxpfDO1|gvTf~$a-mV|1f(-JN!G>RG>4OcUd)0o*2(3>b9CqfCd)$NrU9d+*-4bFhR zJe}N$5u^N#sr_hMOgAh$3WqxT1QMdxN1 z#X=Yw7mhw^Q#iITuao7s7shKOuU%9L^(9zcrPTV{S-oBATJMV*YwXdXM%>LVh50@Q zHykt+YEcu>^+TyA{8j1A#;;3nL?o#vVs|IpZ~B)c?dZSN{Xs<#FSYz-+j&C+h6R;= z9qJ(miwt|U$gsG##17o&B=%-k!`uAc>68_Gav9kW&Ro927 z%n8@7yc-!``?y!Erk@XSZ}Uyi`uWj#qn$OQ{Tg2ASaoO)URW=-O{ZM);qSOtA9`?$ znzFBY7cHuPHp!WlSWQ_QkMh)NTo{$Fn#yT>CLLwJAj;PGNIJ@KL6jhFLcd?>Xy*md zbvKPbE!Ry1WFs z?fZ3i*RCoJf9<+&-FJ6wc&e(~!k1o$hcIIFmzW43Q89|AIcQD4#WQdH6g#IL@(F(# zMqznv_|iEm@4c^9j4n4b*q;I3mwEeZCesbPBKI%%?MAu z?*26^>%*6*x*$fMHG$hRzz=5LHe1b>h9TE>6L3=|`gA(_?gpxM&HeB~)rOWqwE;mJ z#Him)H$9W?&zZNmnIQqdub6SYVpRq?sHZh!=i%#l5*wYF!VD460prAgF^9)Z)P(pxuYQgc>fG z-mhb;VEycm4y~RF>^Sr08{q+1q|Tp!_IUGgp(!7rg=*27_gIx~tjfmvLSE8F z3FyYJva=jnkDNGOXbyfyZ9oGKxhx+zTfOr?vwQwV=*=hi1Qo#g@Sa8>7xX9YjP&ia* zL{Eml!VEHd1L1BvjPb_qbQ6@@JO6C=ihDXI4M-o?ox}y}4dxqs{jZXM{Y z1E@^r>aZQh=n_Gi*;Ai~nsqZfa4D3E>K=!@%)aeF1kdj0to2ImpP6lJHhQLPfL{6=MCO>R`)i%=IGq7aIi}AcyWuq8#Q@kG(MkCDI>>u9 ztg^pGaw>)5UfjEAZHMduw$%&uu=l1GPy$*xuolk>E zwIekwxzE;x1>@B&-tw><6QYR6fJxu}HxvB`*bBggLk#A{xu>Doiyl{*d&?1hl`vOs*W2Ne*Qa&_g>=*y^E+(&I5lDP*BJc8z3Yr;OfA zj!(#^?KE@#>)&uM;51pQn10{QvEA>iPyHIx(jkDkU^=5wl19`_3&b*Lb z{O`0^O}noH=0rv2U`0+y-~1oh1P66sYShSpHH^B{9QXd4yD$yu(cfU610y8p*Cs^> z=_@Fze?Y{Ws~u6pTS8+%87DZK$!RWHRcorO9pu$MRwQ*sJDgMvCY7 zsEy>55Qs{%8ccc{)Zh3OPB=Q15MJPb-{pW_X%^C3hwTu6E#8^k!UdVijYmosahjE@ z(Lm6Nx-+q7er>kD2V=F6LyS(w%+dDBYiA3H8Tdy|y6Q{PRi9#3-RtBvdJ90%6T?7J zwL@%0Rv@;3(qJ}xVmmP1TdyDia$-{9ah~)^njp@?BdmB!;Ysq$Hy?zt4TwVtJFn)v zUuO>!nWEjBlWxP8E{N#b|XL%xW!3>qdu!!~>sO+ESAc?&ejiA~CV#q0`!mw=)Y+1nM37h5~=u`IXrqLK;};#ps=x$SXz?mYLNd zbF!33cUQn_ER{OMwyC4II~vfE-|<$I*?BV5M*%!sD>TgFSs&PuMsikW*Bl)jj2MzK z+H(~;FmJWng0lQtp{^U#fiNvTW8>xIU^%_V%yJw&gKd<7P-p-cQ0J9}Lq$qjUzqb7 zgL?Un>@ieUvNDIKMsuw8O3Fap+fuzyKYbLuu$|xuxU5Fp-|c}EJVCus_ZF{{l&X6e z59~mGjyOy3KEO^Oz5Os$(s*%01xPozgwfosUJ6_fR{rIqxDEg>Wl#J21Nvj$II*^t zJx6Sa(w`>xx}T{?*F#9-eSvK1o+9f0;!{X&2RZFs_B0XK3>v4z=y5A2?$7PW#uF6c zfVih%WA1CTr3mBn*XVwY}?wh7*!0(Tm#R9*X$BR8< zL5XD`q-#%SSM@j|hi4WfM%O?gojs8qyPL;iEmr0M460-atl>hs4uXv0$(1UE`pek@yX`o%RT5sSpQv^@BxSHJorFEspSr4o(0Qkq`_1K>P_XUJ|TX8YfVz(xT@P3JBt!UJ$lg;>yJ8WooxU z8MT~Tb9qqza4P`(X}!27-uWk(slp@##O|Ds*(OCsYz1CToS{ndy3I}RCX33 zWpN5##SP{K!0BGi>~}LC_UbNTMc)c(%CIz9^j-yvRFxehyQ|QF;_J8t{XP>W#})`$ z>F}*U8GR0R2=C9VbV;4{6Jo_1+}(IxHEYa|8sQ%RZ(U_?SSjumaeK)kz0yz_6Mn+T z$P<>rxPuvzbKOLb8n;XD*9|6bA+xW6VFtpsyA$s>TP(OM9exZJ2HfTEr~FIwAJidx zAi(UjK>&L5u|n}>Xd6{!M|wRBL%=+aLW8Yz;K)3TGp5p|cG=Os#PQqcku|eeuG<4l zpB>Bimu_5BEY}8qDqYFq##ziGxO4xvDTgs7_D(W~ zCP|%*Fw2uR=1H;OuyinTIa`!+A9NqB@azBSqdE3ruVzbL(Ri`@sQVyaDf};9&JJp;YL{|>a+$ti@>u6p&HboQk+tQ49v7k6 z3AqP{hAwHk3MPam@6wdGxRc{i>^ z33&(pBrisL$CBx6J|5?3zTK#eJ%j!^ZC%O);t)h29 zq!^0(jpq?e^W+yEiIH0rsDRb4`L>=F*V8xtmcwt2_(t@0_|>(?&l?<+7?-@lBgso* zo_v2Opzptv2g+MnHw(hxHQvM2-W>9Ll+Wv@uAXU8CX#%6<_P@d@k>C$WGXrr3Z*4# zs_U-_!pQ|~JW5m@{GG`?v}B9XHai|y<>L)wYGZ*#$v2(&nBIC4o@xAN26cW=|Lx^; zbZZu{08-DAU1GEZUWz>VVhh?m)f9OO#FnSXw&^EVQ?jx=y?L^z&M)of9vp zcfOhJ2WTR;*HeI(8hDxNO79d1W<1$9r`r%7VGd>+v9((KxpCC(s4&M=U^M?n5e-Vl>}{KyM-=#TFwmX!f#-(yh{ z2vBN|wPL-1V0~OoIkU*FAlkQ*})s3A1KN{3_X?I60wmRezAHlXYpTTswdW>{;q;Q4tqQsuUFZ$m27((;r; z8u7qUC=N9u(NO$V;4Qkl1gn+FTWU1d{CUi?5FjYpKUOpu4x13B5&0NE`?7%I8K5mJ z(yhr4YI0MTP-I2W7)GRSPa;<=sGx{O|#9PSbRnK3t~tG=1cm*3#mGz!D9aDR4(Q{fQSQ~v( z8g3tjVg2XJ|EJngLq(%9Cf0E6mXz=XF{|QwY3nW*zHW-58YH@HEr*wiQJl6kBhmP3+CAvK!>@U7hcZ)8uxo zvYVC86b~%8%yy6k%eBhwEI41QjI-cEt#T&|`nAeO*kja-m0Q?jgpZXw*kjlNoK}#* zZuS_~-I$?OcCcWvR(Xs)h8-T%9!2voSQ_=GQl_Lz_{FtOcfE*)l2948W~S|2O|)82 z7O|@B+Ol$171x%{XH`43WeZu=Bib@QtJYKlQJ+D34M9YK!u@uQqKHk}ENaRs}Dh$XOFzEQl??qAj4UMZWD~ zE4m^DX{;is*N}CT;|w0T2K7`Ptx!LoLOZyhrk(@XGMqIhkebN7=yF0ng``97Grdj7 zr%gH`>!za#ke3OaKva*(C$#8l+D6-_Mc2{GAkYU+7eK%b88;{7edtVy1V7|bQaKiz zB|!iJprhXMYIc9Ujx|E{qEjq#n)&+CM}pjo^I7hrNvx;m>;Ok<;MM_|_ETNSV?bJg z6z1#+oU^8*3cLGN?w^9D-U=4k9m2Wy#@*0EFzuim{V2WDq=VU~zj*hj=iSpBg!+N% zp+9=}r)ORB-C45^cMp4-A_+^lfb%&f`^8FTGP|)-V5LHuY00QNl?ngkJR)y|dBmNn z!gw%r(-9OpUW9J76b`lf&Z4s?xgRYp=HRYhyzsd6p{Npiv*8@%U{oZ*v1K{o#o`{< zv$6cg#XaTET07sfPwK(9oXndI-eQgyCiSp`(p#%;7x$D6i+gVSq_fXHsS{q#r(X)`E23uK#0+w$jKfhQy(=tq>Q@>oj);;3+jEbU;m;7u|a5whsW)* zLPSunNQa1zj<|`cH2ux*?|#RL`#ZsqzNW=yAznHpS5dcc zGmK#25!QzKl%4MhT4fUxa^@6-8}1H&Y0mfVU0D-$%~^R*-AXQm#Y%I!Yj@#>(i%s@9E48}!Kwr=V6X#}&J}CS_4_3`@&NWxQI%UxzT*PVee0TlgBaGY`1R z=8qmZ4I^-rE)3v!@wg>}7rU%{^0rz&J$a9%^|RFesYS9~d<5A@y{$}jiObDCRi$;;g!1s`-D@>l4!b5QfNp9G3Q+#pDR$my2z-5&wj_r_*I zrZc2NsDV73yhS>Q3c;!5_3lI5ug$+uUF*XmY{e}tVm($V^U@fncQZHH`~OHrw9>6reQNM$)Dr^v;vxxvpG^MkdB=;=NF zVZg{MtCuCzeK{8TR~S#Iar51Drjz2^y07W93mMV~R_}Q3yrB^&9e$JD7+Sh9ingJS zezeux1&2uGKK2{}18+wQvyGFX8b*K5h%$xu*iuG5ZzpYIesrORj93$r|PSZrdPMS4?Wb8&%AW*ydd&_G> z*{3Szop`8`w*j4s1!H>=DS|-Cn;>6PgVs)dF|ki?24K{Z&1Vr>s?PrMg+K&<8tJ9w0a9c0dhKq0_O^`|sv> z#-7BrHV~?HoM!GiXLgaNIDvsz+QXS+U}c_v~BcF zQV%($-nw^MjwlmwBiS#wD^t?BRU%ZS1Zu(SmAsVEFSOY^e?jabMLTK1@2oy`YfuiFb5?A)Y70-x~NuHr1~P`Tb-r)fvq5fe5@ za({!vG_g7}2NK%e&?-|O(pnf^z(QzEE4n+eZSNP!DYU#y*I!!bKom^ZQ8YB@exh4qG&3K#cwtV%10o zj26ls7P0jKoPWByA>Ej`zKY%lu;Z2954)(Q1%*RJg$+wW`ZqUVOLaBN-n6hzPtIa* zm}akmVo^m0=d8X2?K!RZIw{KnHYRL>cIo;9H<9`4hjOo_1PYi#1>}YFkD9T7z6%PV z*w1Ya>2Fi?sSBdX=By90HI&|fei_|)>eA$HZtEJi%BeFANSH2X-U7CGs{0^_5NLYX z={^Ya*cNkKf%PbWL0eo9zLJbxvFpG0Csd*5#;&JXF9^Fy2O6m;$F!d>1CW_9^Kmw_Rd-e*qr4lL-zvMfvExm+VY0Y@$@@w)d7mVA zh#P){I@QVmilN7g9>!WVxRVpo)@%kNz9;7JGvTp}X=9DmDiLU1Ur7H!V|o{xDT8Ru zI1%`vukotE_y_fCe`Ojy7SPM7pnf^M3e_-#l4lOrZpuN4fnj{LGEQi+$#@g6|=aT1!a6!X^B;#K6Qxmp?j&8ogrl>!#Tf*OBo|(7{gW3{{=YS@^#MZD3k>?L1IBPcg|h%k+I`&y7ejrhFS>bE8JM%4o>v`W;3? zp6TNc51rtdM+zeC>+)AT2#e}leVrVqc6zJT;YrkVGh;XMp?%_C^J>HEn7;@&Dp zOm?9OsTe{*3E8i}S#f>t3cAU{xx#Kbi3@3S^;>sv+U{|v5tqdjOl6nfbPy5JuT29u z5kOfvD$Xag)(~$^Es+( zv}L(9+9Cn%o`U*bva@ihcnkB=PmMqJZ_|Ea*~J#xerzRIi9kvI!-77_U6$~TO{=F{ z6c_oQ{XJy12_cZam(JktO>3^h`>ji7;2y++naLZPRu^Cb3(Tj{38tnKTtf+_Qi5rC zoE>6o@POFON?lSLqxCr_YHt=b+Jdi)1y`lk0_YF#C#fSbId!f<= z@lC~-S(J$$>1^Xa&b(?N2lo#pFt&@G_n?XH+4a{q72jkDUkNiI<^eL{42JwMuhp+N z4?uO%tUV7vA%kA@-3}>I${oniRXLd}<#v6HR%ExQ1hn%_x#0yDT8LNBt@B;dtC5T8 zlJ#!u?cGAD^y<1n0P{*8ua}V(TVSy|QdUR=A&rB{8=($R0e=X}5BPNpR)7qs@hbCl z+f4a_0+#BWdvs=+kZg^5V{qBNMFgD7c%x+zQ zp%dHb_gO0n6%al=yLCB++uP|kDYP63*Q+lQ?QQ^4fTy%&ck=D_96WCjR+Cj=idFW1 z);^5R7%qRfRW7{Xl_lON-f=p!ZiX6HYkto#zgL^zCFXa#`R#}ApKpN=^J1t@j+3qEY*O1x+j?{xlGe5j zhc*`xPPqbix9HXfHY2G2q2xTrOhH@a0AWoVkE+;SJDvl0^I)x5?9{4-L>tK~@GsHU zW4?{ZS3&dc#1ihs_(tv;90U~m#`b%N&AaIceKoD%UvU_MNiFg42+Fa>S~l~h-!Xr zplym<()Va*(MzCNs85&{;bV?JU}@w{+kL18R!j7z?LG)^6Ped#>x7k$c?JA+GH)LK zx|r8)I|R!X^U_jO5EJ~cM&a5+^kRCzbofkI*CiVkbw92NAZ9NIKDn!v79-^{Ts>Z# zYpNoo5OaQpbBo(UL>yXGKMOdt$^mJ%=$#FN6LG-u@kQK@b2K-9gc~d3gHKs-TZN3% z9(oMkOQb~IADZ@`q7trD*Uq;nmk0I#CP$%ySxOP+Upb(z6)eiNc-1xVIX7{M=(PUL zZLr{$2}C>zdQuLx!O8-5t#UAWT$zhWfU+(zW-Q@pzD#NCBWd2Wl1z-_eP)`KZb(3< z7KB2uIvu&`B;B6T2kn_b?!TSr_v94tw}Mm3QJhRZRf=9le0|cZb;;xe$O{|voE3LV zJ#^p}b8QUYkG5{Q6H@{^Sb2gGHAdA_7oNMxgHm_>4}aw^SXSDuPB2+T7q?l~!y-!#lBPl)n63zWa0_o6Q&W1b5`3)y}VINT51 zAH9G%t8*=o2vUghTZ@(VQ7!;3)7RH>QkhcCN874)8+-;q+RN10u;^j~rS7`3s6tDv zV=&&Zz*sa}`qng52d%g3_f92AkT{h*yi+Bd!z80#fVfalFCzcLPEOCv(qR4-fe^YN zJavIG!;eE$_ylr^wTagB7Hd%Vlc#-W(gEQ?{R@9jBcidVCkOWzPV48lp6Az}+Y_xl zX1Y(UpJ{rqdO0JP&3LDkU%$JZFfKts_|Mpb^fRRY8uB#u2#6r9!#oP_-%XjX`bLPy zeHp<_SEIG!@obE)`t$2A4}!c*x3Y%xYRYP}1+!{NXQeM7<Al>pphW&&Gi!eqCsz?oIc~^JlS&>B>^Sr|Zkg?t&yYvl2UsVszOG zNN*{9-cM*(3nmOHNdy0s^6PUJo2uE$I7E1$s2bHk+^eE5)bwow>J{{XU6<+HbeE3R zk9^}@qd~4=vLH2MPgp6X-D|T~2=tiV4KgzoW{*{*47MijCg<8u1NeMWzA+QlrkbiW?rm`J^`Hz^i6O{iBQ5ZARIx}f+{XeHA^H69t8t+&#%?ZyF_m-8z ze9Z0a%k}GLuf}}=!3^`{P~ac0#zjs*9_~QdLchMK)Pl|?V7^kuc{O;Kjwh$?E5J8s z-aGMA^WL8DF61|C=Tc67{l}QM*AMGGGy=gqIS5CQ2&Fd=z`}&rj|p+rTs1w>mRTXv z!?&!u&fCjW%~+{Hto9QJWVNd4U&xyT)!a1u4a3Y^ag_ZkJ~e{5uV9ubVWV% zvDSK;=rHnG?R2N7l5_h`J4)Lv>O7e$h4~7Cv;u0{xtZK{j&opaR|6I@~>>)hP zVQn4MDDvdG>6rDOG~mGQ|4jpkZEMSF07@Z-_9CJJuAM02nRiQ&@RMjoU$r1M13p$oQMMdUz+F+p2&}ZL!o)iA?h;@*9-qvtsY}s&UGN%kJZ@Oyf#L1RY|0dj~ z{12p$4u!v%kcV;0GN8Ai4==oZ3N3pIp0+z$?cF7c$@% z6Zn+c2MPSkV}sjFaIExGnM$)|&KQ>yL2!f$E0>UdB8p%!uNB>h<|ZeD@SIj~*ID;( zErg@e(V)1Ph`1*owciFIz9?5z&m-F7fl8B=_{S1|K>y+o$xhSQh0bXb6l0;mn#dz! zi7&~ALj?i=$}ANba|((^EpjxhN;Q6gc3+^e(^uF@;Vb}M zQU@y#?sx;sx{RIMC^mhx+;sNgwc+jaDoW5z>#g^Q(Ff@* zr$&r!fVYj7;sUWnfrP~ui7ns5--%+&J@`98Y^lOuhuDIb)V9RM79W1!AhyW(JB_Oh z7GEp2d<}n##g^;vcdpp-CH!5=?*}Zd5?jz5w0N!9auNPU#FlaR`z5jE6T(~o_&fw; zFuLw46a|&5n5TfFg4*b?@Z03h{M^DX-wcn_svOCDjxB5vOc>c=yv8oWgRygB3rd;n zT+EvTjjvzP^z|E*d!#Boau;Oj4Qg{C$yJcAR0TbQW=_0-T^3@~-0u|0{gLTtA{e5* z;pKi-GM%4S)71b`yg!6_)}fJ{(B383P{1vNvA~@vsCXGp;H+`kP|MvV@wtI$r_Igi z)!5a9ZHx$`Yv;Gkd5O&E{;h$az%3jOD8=2<^=?jY55)X4wdtUeFgk8C=+xReKQ zpOslcnR!GRJcrP^g(p#ktm-thMpV(w)e2kfHlSI?&H4jRev)2QzmqAJKj>^(;JPne*wYel=57HW|g(QtIh1LgCw?@CyAO zPoxQ^nBDQXY_;-k314C;!~Q@>KSxJ~PTVZ}*le^IrE4^h;^Bs2G`@Nr&+qA)z!C<%-OGC$TZxkfBJ_YhbTQtHJ5c*qCxir8i4)P(%*~w&*$!!u6rN-=Vh%Xs zgp3~O=V9nwJ%Jg^4)yR1R&_f0IRkynAqeCh8kril9%LQUkcyVvWvmqRSq148{FdLy;^|Q)bc{QIMb||M5vYW$l zq3l~s(?vW_ax)QS_82+k_Ztr^XE{955k0Or+2U!m`f65o5Vs+#)AwU%`%6M)$tnl( zmu1e_i?nZEh+3GRGhm{bbVji2+S-%ojxNvdtMd4Y+6T>r$ zCxmAdJHpdj;^AqxfeXOh?0F{x<%6ufM3xss{ zc;T&S?hRrT`G=S%2X9t(V=LqykNZ47yhr6Z@zFRilt6Hf`B5V!pkH+>5*;TJ9h;Ep zV!mU6XO=;jfiZGsn>7uoljw>n;;my3)1dowTC~Pn*hfusuU8~CFONAoI*`rS=$t)8 zxuWHG_~MOz>+A}vG8r##?#yX9uADB6C&zt0u6A2tZjaX@z{CCB3e{%qM2G-6=n5HF z^5Wy9RAe1fPQW;{F0ygv2D6feDxV^LG zG!V2UGzIl?bf)4~O6)m8C!+^wS|2o1pV5Y7X#mMmL`Sl8BBmk;=6zv*bi%ar0=^_| z01Ma?7=<_+5}z0b8bdsqgYwniHR@<&eb8^A*^hkk%wVrjr={=1{@?YT*iwe`-kT3Z zg3d{UvF8xOS7aPOQ7u1DLTW#@0pN803+$kE6x2Vgloh&fpV`j5dH5HAaz+95Skqat zN`TvJW(O|-Y8wUmOTKtvQF-vkJKa!Dhq3`$On{XFLaY?h-F*7OUS668v=g8m@>*dT zl~qw1!a)!Yp4EyG{6!#_xkixgeAR1Qy@WeTjy;E?kdO!2hwon0C8s8vwT`L0J1?x! z5zD80)P%KO2>S%qgmd10=%rD8)QoZCP|fF4H6{q2gS&2bB5WueS70iY8( zM7keCS#4MH4HZ!@)B5Tj-g;UqwK7M>_{Y<8?w{BXsQoUIc2`(ydy(^LxGRy13$R{- z6LHa9e1E03AL3wvFdh)}dq0OOnhOLijdmEI9v2;$gguuqJ%M}fq6G|Bt=Rw^)LL;J z)0f>0FgUf5G8Q1ok#PXqFSX&WdOR9$yy!q~c0R4!A^YY<_9+u-L&NkI+_WDD)e;ue zMRs8H(AwD&9uHt72J$<8yETu?R2d4udbyaD+bUKR10`5FXd`@pX!=H2HQ@kwv*!^W-Hj;`e8vS}v;gH0D{9 zOBikZzknG)o8)e7QJ$%jr0yp=93Btf*s~lG5`X)*!??_MLoKcVs&Eph!Z)n5zll_# zGe|E#HueO~N_XcN)2M)TsYqZ8&#RCbcGm`6m8`9ib!#u^1$HEwS zx_WIoM-Esv(J_NVU+Jf<5v&6M;l>ha*Y5S)3g3&wy{%7Ls6Kc`v5mhj5nFKkn^mP^ zazD&D^t80J0H(jqf>we9cYo*m3h-a`4qctVR~aX;gqMB^)$-^30>@|qy7G;x@Y;di zWD1QMJW?g58@&s!y3d#zwGT~l7RDjFd5grF= z+CEHdxdIo1)~P5gg;?Wq$nq+GNSB(3`%F*-VM1$x`4-e0FTrn@`JFyiv^U{#Tsy(G z@F)oVU_FM?kyqxdE2N)VKXT0XU?#MSLLZ^f&6&_$5IS-?X6)Hz#n7J+>`p7fVhD$A zq0k)^x-%2{{q@+G@7>}Qd7XloL74UE+YZ@Ukma@hFnj&BrVijj1E|U?b)=I>Lh5TQ>!mjzvJsi9v2zX z1~|hBnKmWZUTVZpc!AL{)vrGr!NZBPy9^K&O;;KE7KjMacQ&cgn=)1vFQAl|4K0{Vj$*_#A-rNUY9{(`J zFpuCN0+-n<9ZlzQlm+TqAs6`mhLWb$R-t~jxM%)2aZicR`L2CZH-y74eA=?!b0&35 zw+V_f2y*@hUxOYcv4-kW1MTt%&?su0c)*jZd4Z^VCgN=t9!G|pdyARJIr3G)JT87s z3{q9E2biI(&-q2cX<>)D*j}R1*r7AmuU44CyZ|FP7etTeak5FV$lDQLKd)C~(yvIp{QXNz)`TUk&js&qsq zvPu^oPUR%O28}I}9gRH12_au}9|U&H>Gs(DP%3=r-f5=Rm%|2Wth9UU^s0wk(wc(0 z?aP*eD4ecTCEB|VkIS}qMQ1&xvQ!=;ekXi2^EpwX#WPm)ca`?s^KO^PdzLt2G3PnM zsNHs*!$~6l9;C7$m=aCHkRWX(Pen9+9eSxfdON@aXMi2SU6c?d)1u@bfykE@<#*R^ zqxY5cj%1yz=#i?!c(E#HS2PG&ScVP}h{^TCUFg~e6D^^;JUB)h&(DGo{gwIY61>_0l;5*~ z3g0jP*9hxL{fk#`XKy)h+M&fxe}olH!e0wpC1}qd{s>!$JYSOJThhUjm7+&=E;UV%&k*mIJ)2dw5mQttIh6f?6)TOoIE=kgrpa60sKq2^6 z7}vb_u|sN~Rg3mRnTliRP|hfw(S&#YePQK(8emilZQDkJcnW|w9vbSIYHe@(IhJz> zI!Emj{l@bc6^jmhg!(&(3>+0g6+u7l(wL|a5Gaj45i*E=Eej*cvoKQNZ%?vMDDM!XV!ecKH*>{_%3KC$o@fic-g4FTdp&X?Mwf5I^!eAK9M zjPOy5p2)Pu&!RXi{5BoL59VEm8=ZYtwOi1<>&#Jr9zbkkq^PMs;sN^cd>#Z4St`&~ z2!K+_u`mTqV^p5z$!Am;(r<_6Dd_Upt!JLb{-flv>O9>$Dzh@DelrAMzaO@%_qd!$ z5y|SitHf>r93b}AO-G#spP&4K@q9kw^LZIF%1>vMum6us%ZW)yqllp9z@tH0jk
    jem5-vWW%=q$h@qD7MNKc!)Dc@2 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¥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%0Ad59JSma5T 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

    ^+qXDEE6}Hx#t{e38WR$s>a>imCiym3CV0g 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 qmR^JDTQzA*>3_z);tnnEH=FVrf!eB$(|2v;JYx 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 z zp_Ce3b}>EK`1@srW>yMf+Ikl~bu5D`l{vahHNzt(7IQVN_nYxasZmbV)?bY+Qf>Wg zPRI3`X$-UqU-Hv@8p_L>&2e>r-a0%==d9SD&v?lpaJ=~*O_Nc924)KdNU#otZ-_quf41WVh7+{inMIZYr5a8AR z4*k9FCs5p(mnl!JIY{O@^h;dqbF)L=B8v>6B7ew(Ar=kLm(CvLd-T7|lQ`Gz9g@BLaZC2c9g_hpWNg|p!-?oYpQWjE%h2w((X4m-n z1@)M1UOr5$fwkhH5_x|%R$55yT7j<7e|8=>GUMD1bmlVdOz}h+en^KnlXV{Z0QF&L zLValV3uYB5pNwc+E0ChERslyozjOgtA(?N*&0xOpW(*1I?S#?_31s1_I za;U7~Yd*u9*Csx|pwfRPKS&O_HFC(USt*M*CyHZm>V>j+a_Fv+Lw5}i-N-bTe&_Yf zOY}uP5EhWc zyfCpDp1Kz#`){_~S|nkcG41Yz>@9~!8^8^x>+it!7 zx9k%G{wxQ7n$DMdUCsC+yrml22Yairg7V++{D_SDjW52>Fb1J_U8!enB2VYKut~A> z(-!a?4r<1a-Prg%TgIeC21Odt*>DrU`2at{1Nw9G{o-<4pmCerBf%)3Y9z2qkN%#Uwtosoj%wB~yG7dJ4?jQ&;YmXt9B;C!O3Cn#`F)YyII1T`eMAWX z(H3xS4=Ba01uXUPW%0Qo2_u?&!@3z3CBAUquVf zfsZ5*a1-w6wTdV`D-X5Mgx>%uM6K3kA1>ZcZSJCXtMN`ezqpUy4K;2tsd0;K^llsm zU+kjye9XDUv#DLB`jQ)Y@OrycXGd^kKsG%~;_dQ@J4ofaTRPgD0!N!y17f$&dDyQM?;;NAJwFc5 z4OgBxrE&Dc7u!aZ-k7BHE~4~44}D$H>TTQ>8c9$Rl%{8<^um#W$RGO{y$)aA7Q!B9 z2LA_5SaCT!MF+v9wZx*%9wX|Oc-=>GKkJ83%|au5BzAn_HT|(UX{Mg3X70AtMmMaY zZlLMW+hn}gSJEoDI%U4B#e9hiYa`xfo}#hSUM>ArBas#=qi?y6BpNEgQ2fyxK7uWC zem*;G@XT{6&jaDbO-4$!o?)b{wkr2L!`KI!dwy+_gLE(!$6`9DDU4VOp56p9XQZOp zJUa!=53WlyFu?I|8f3RS1|wPSIA#tFa1ycN*zYA+(VWX%Ogy`SVD|jx|GpJ7uT5#i z_UlqwamL_QJbmuqRy=xcvK7Wb_hsioutr$qk(^z5u9UMZ6PIp*tQ>GgZ}5DQSg$PG z^dGEO9)052^~$-L@nYEPrdWr-AA(eEO-FvPKEp|V-U&t5)=H!whc^(ExjdmO3M7yjBB zP)fG?#NC6%7XnT@kCOP>4e@pMw}>r|QoI9V%UiI`5L+YY>pRj#d#{yR?mU{1S}*qT zXm0oAbr@3Xb(UIJ$D}zSr{Iv^c_cX6C(l{t>(~7N0;?v&wcgxoaa|MxwKk7S46Y}0 z;(`LU0%GtTxtXTHeIxmOsO0yjWPw4wIgtOk$gw%e$NI5;Vo6Lr?_8` zmRC~Az}0c}%a}B=K%z_+bg+CqFp2bw$nf92z^a;q6$_2!2HY|Y6~lER;|{AdtUUen z3Dz*qyi6)jIr`fO;0h&j=fHmh?H?QegYo{A8kD0c$f71ZFMUBETG>Fsr37B ze3E|Vjo+Pq!zVKRuG#oa^eg>#`kl>Vd{o_}IQ<^0_zv`&x#2&c-%XDmOTS-k_$GT5 zn+nT`it`pEsR(`lNccHo&M|A79VtUQ+fht_?geGRn#;FcuqRk5$|{@aLj!MY~? zZP*(;M~&Q%oLUlNYgoG=)lguMcm;($f_5s^Wem8s*r7E4E#AcHK4l zcvlDY4g<`*F8%En;G`wt1usl=-EYV7_$j}xU6L-OGcA8OF;2^!<-Fv;<1CqXS|V?4 zd6LeF^(ET;`TRlr2EV#nh+cF5@*Vi%wnFBMH;uBq!aRmAjHRX0@JB!xz#Ba)d9pe! zltB#AOI_GW>nmTZrLwqaY%#HpL17+Gk!2f>%lu-uVJ9=0^|MAY*MDDG_rz^X^4$$@ z;a-bnc+)L1H>-&=2aSx$XG)E#o{^M;Bgwe>BTUeqOXCEcH!nfZ1poZz<`n)RGFA~8 zPkkOX{{$gfwjE1N-SHzPE%S}9M>=Z8DS^{xu1ee#n_uZEq9zANv2G29 zko*vy=rV==nG!?lnw7Fa`BDW?BVbCUWZ&%>`gLRFK89E>k)#$^A!+FrwBp$Pv#ShS z%Lg|mZ7m!G2O&d4^Qjl7KWp@2e!LeQ$1%6)Ke>c^@$P43FFNo+e7-7+_hNh>XBPSj zekv(F>BTyNL)Pa~PgtIY?CaDQ6lI#i{b?bepmZ$^veHwI#&k}YUK&s5POZLffXU^; zhq+TbFNvF6emC2Y5)S>U4>|AYMBdLiM()7*@6Z2%{JrUc5{ z<^ffk(TwJ3GpY*S(&ntB5h9iTfUf@|JE6k9KZ;aXf8_Ttf5NxScS)M5elv{bCYlAr z3O1qQpo=~A#ip^HUSktItYg0z9v3qnvF20$*^E5F`xe9$LBhW~EpCH+ybG+MJuWR@ zjs3}tKAEv!X4ox>46Oes!^B3O#=>MqzRbw6$Q=_{Zz3*w(O;ek6ZK3NmZLDhUJ#(= zX#HmFh?rg^GMYk};t7?JER{%B3*J$ory8*g8ztfXYlA~3olH-mliXsfSA6b)&*d)t z7nB?IVu~bcq1mQTF)`TGKR^HkRQ=h>X&|dteE|p7LD-xh@X9ztU&CfPl^(asN0NGT z%6sk`0!pTk*yGfddz^z(?H)w9KATd-!}AT=9~ue4*G-V@9o`(XU)Tz^6|TTm5Us|7 zig%ab{Ss)Fc{u^^iS;e;(DKlQISvVaL2C9hrLhpT06Wpb1DYbjW#f@ zHU<`8Z$0)$Mtj5#uZX(EYZ${rZcHO|_V-%61%C@P{w+jfE25)6{7_ErvF*|G+Nqo7ixpLrAKMlzr@tS?wuL4v-3+=t zkC9q7fJbnP41Zi|^@tWvUVE?8gX3epMT3eZYT<(JJvz!NDR5VlnDfX9r4IokwkAYTt(iQd?uPmLe~Qs^4`ZmscM zS;+WKZmj9ux%ez&DP{<*aV^Ws$6N68t)402%@`s!rEv|y2Sk2vH)Pyv%TcS+u+qXV zWXqs!#9f_RlzW%5o2}6#E4BWH#G8%Ys_2u=_ylf-H`T*m?!u#YS`^38L47!o*qzGE zZ3k54`|yO_eL$JJOPRSB?|bO|4SIi_c>4yNI3z@z+ixF&yw+YTe%chrb}B&-S~!)y zXr+elmm!XHp4Lc7q9QinEsgty6~tZ8?*?oVU;Q<($iKq46R=_=W$vC>im zVLf$441 zO0w0+jJ4oc-*^(MC3a;^iA^gROYo~C{5}IlKNUn%`}J|-c^^1q4XXp*7Ky<06a6Vv{&*@YVTX#s}ig$hyFmzLsy!}GW*1#q%X2gLLgV^uMyCL@m_nuEZmK!i) zQ|A)U(w*13N4JnD0oWj`Y+Oks(8mM^1Io!@3)7)Re>%c*7CntLp8E98E6j#L`DK0* zb2faJjt~*vbbWa|8+YLWr9Ug5p=;>Blh4@a*B>3vX6#JkMC~qY+WLi;ox~KManjaD z3TCOD(&yNH!eS&*RfVbu#r2uqdC&*{i>G9VKJGF(B|CUi9&#XZo}7|rtmYna(Bnn& zF`t_CT^!}&(vvV75r45YwkVCCra`SZp$g$`{4AK^ZH!UUCU`h_#lL{iOW#j3gV-2|Hl#xm9In@m{G%@Yw%mE+u6CYv2Z}mpFN9Z4n09iXx+zKNt zAEw%d=@oY=PRZA7y4{v(l7-iusBjGzc2MD71x0r2zbQv$^9IkpJ4;S5`+jiRH_yI+ zIgMdXBba8YGpIH9bH6E)};YibJW_SIFW?m4A~| z`8Szl@%{u=u{hAnW%12 z^Y7&|cOE;r{qhW~PgB2Ng>p-{+|(-lPWe!(-y$Ch5}8O{zcfcOu>1v(wxdLF4PN%X#7GwmnqeL!c*7=eay00jD-FMHN3csx63!k zy)iay&{K`EsTo))@tHM}#NJ$*T9V+ieJS_#4Tit*-hU7Nc?yoD_e1@>oEPeXXX(am z!C@&*N*qa^$*5{!E)Ws05BfR8^?+N}iQ;G1rs{ z0S7%=%jBt%2c$0&Oh?W(rQz@96sWjuFdbmKB}3W_RHbFC%dFpm z`&~;I_fm;kp?lmME zSzVd_Fntgo*Ha9>G2eNKpW!oT8dmJc^-bgIzfPuc>vUZd>v_XM9ugxtq1xHJZ^D)ko;l*oZ$F0=g&0szm zDEp~Evo(H;=u5K1;Q0cgl3{GnAI;!>Y?^8Vd=cwY8HU%VIqvm&N4`(oU1&_OgZ({d zep4f>`@du>sVP%Rn!@DlRzrGU#-S_YrqMo@xJR(knw^_N^NYhA{?e{2TTE)BTG2)W zagqODF|qufCto7%#KoJ9)JhmS%b;tt!vK;%vkeDU%CDG~vV^_O2^ zE6|d&#wU_anN0JugsBdM={qsZH-<1wwuam!VdhDgoV3}SfccM%0WhC=W$Fj>9Zxr1Rw zBuq{^D+%+OfiQpn%M-%4< z$0w2&CSm@`G63d+hfWA{l7tDhUhmq@Fz=TzIqB>q%xee2eD%Q-!tB8qjX-+TNr;!7 zIo?QktvCU1=s+^vt}Sn_iz19AhMgj78qcpv}T<|Ep03{GbHPNsc7oIjMk0#skIaf4b*{u>Z!|MWhLU z?vk(zC2UUGd07Isc_8dG1NN0ChTSA#W8tiyE@8iY+W16LbrSY(V;QNiEe7mEOHT-U zf`na#(Z9KaVb@F8oRpn}?HdR?-GKe*iD7q{7VF<`9q#0P@^ch8vV{Im!BCwsN-i zEaP@%bn}q*S%=qWI+p^2CEpO*l``>UFSt zlH4a}{{%g)h7q!ik+RjLFPy~aMEVSa$5~%zup$PfO2#p`JBO68IqkoAF3t22{ayNe znyHEY-lo6&zoeNO=&zgpCag;{)zjbq&|mKQG*b=zb2DAH zoliWg(cg#k=YBEG^a%YW>?Z?u!{_Jrke0U}6p4C&A3rPM0LzJt5x((;`C>?bBl2*r1+#tCRY zC53(QW|L9qsdg@ObG%R*3dx|W7ygs7L?7d*c^~!*YXBywS5?H6oNo0f>-J-Tg5c@K z!hnNa5q|$1X&O+8S5}f4ujFwjRTAC|Z@E}ViQB0i+A^ew6>_`2)gxB)nU7<&&h#R0 z8?8dtP$f~E?U=E~A6YN`ZAO#Cg{-aLj6;GZ<)K!DUMVFWRRtf;150~|O$*uQr3w2C z%djbh6&O_s6av_K-sO&6X^S@!#%?vdxf38mS4r6B(3!L{TH|;21>MP&(Hh*c`?uR- zvEB)ME#Z)Ym`6l=N2dDIpf3wzh(1GQtsyF#RuBs~j|N943F)IAc>Fe*#m(de${PJh ze}*Z}GOD(CbEUR;&A`10x3X>v6&-?6(~Hu=V9KRiz^kct!Q=6B-ynW2l>F?ToWjpN zKGCnu5PtE6U;Okgs%(j>1y*!;mnBf+%_Bl?&Ki&SiXNHO5k<6?M9bp)*nqn`>V3mF z8FW}SXU^yJ#e4cgBhq*gDLoTAg~-?f2R9O#l7mlaWoS3Vp}kd@iD;B#)bK8)ztiqL1{fSQ|)b?~e^RT}Gz^E0ylr|?*QgU8BAz*7V^C+j-3h3o1*#i(lm>WW+w zQ=NP6va8yR&EUE?=X=*wYGX@#6?S0U!w^sXMJy&}2=LbYFA&bBKR$#94jEMtqi^x? zjzp7p8Q8pn`q~|SSq@Aai51RuxV3wcM(XGtP^~+6dlE zg6GS_%}WRu?CiR0jH+E@Q)MV&8he;%JGdK8mVTrFbbm9E-ud_7DTxCQeBx;PEfC#} zF<3c<7*>wmh9M&{#z*}#!=$Y9E{l)iv;QeaaiJW=eWnu~IZ60)c@am=o$t?cJ8%l& z#l(>b(GJ;{<2$VTEL}K?tICrTs-?^C+9-3aEn&7#TRR> zEG|k{Lx%#QRo+wYtp*PpPGeNBLlwS!AC5J2CeQpPEAlz_-gyx!@ZGpqN*h@x>H}7M zQw^%pADf>7m{g1>8?sIM?sqc=_`Ek~@8=K`X@rq>m6iT%ezCNS_fqbMSt1$H zgPlJv@*-z&zy%pU0%rvM;#zqHAKSzH!tfUkIA0Bj_JC5{Mr0+vgG4)x<|E@E;H8v* z#|1K0ptZfS88`eCndA2?wedm1-IQX4d{v6ud$+oY`-!yjlbr+qQH?!g)00~$iTDwx zb7MKmNJ@Z_+T8qa*cyhNFnpYNHm(6DmCN{qhZ@1z@yS*d=NKO+T*Eb1vvS`9^t3U@ zg!SJ)z>?k4NjAJY1`U*E*wJd##eGQ(ua(#;HH%+fu|!<5`z9F_v|D;6!1O5(0Xg)G zABDQPv@*6vO3Q}HBF2qLe1~lCm`jP`{4vY=pHV46?+2Rx zZ|H4|PuvXxoLYi+gRpg>jnyFP)&oRT><9DSa;N?d>AplPb_u3=jfs|{-}Q(jRt|`I zTBanH1H`%j#Nyp4Niibl4nioEVvab)u!R*Kbe*K+2g0wII6jR%(p!S*eHb%*55^R$ zUmL=%8K})IYol%tIoO}ts4__oB)A6E8%+t_Ej?0GVt6OcW8`3;T?WsYD6b(E#E{N+ zgV|{GjPIolIs&ff?|%-4q>|vgA;6XXY=dGt19xjY5W8!@%^y`p^jN-w%(-1@xS1!m zp(F^b0q2g;P<sLb{dRQ2C`=j@QptsI|du1_}i3agrT zvH@|hbX9L`W5QU5^gM}QG0m2&esE#Gv+b_$t2e&Iur2!naJ^xdHwZp}#<7~`9&^7K-%ov#zEjV@*7z{e5yM*?Jy2XlRD*3m;C9LKl|m6E`R#uPrv+O4>#=* ztNejWobb(#xGmbWvP9fKWmd+vvT>&H5$lpu@$xji==0{DWWviEGsl^FPs3A$k~u!1 zUSj0^it_Z4zeaRd+cZ15(IlB?^ZD46NNW`B~H7K^2R#KH3Fh4bd;^5Hy6}no%caD&*U`KcqguXp^ zQl=?7CELW^J*4-1HInsD`2vWRSMKurA}t&4_e3$k&|hh;0{f?H!59gL$? z7k@*ZBak`f5phILA*!=2cq&oPT0ks&ISsuuRU67%kiA23yO9Gsi#fOl(9d%8|C`KD z9j`3(p>?p}CsBVs?)TZDSDi6f*h}dyHG;(bSn^SuWleO%y!id}P(St=0p9q?1WB<; z>V^^WpBWnc#WHmDjbCy#B(E;*l~b_;j*eQ1RkcLrj80n3TC<$jNg*wGXQWBb{2x+C z^_O1FNOg7Lf4H;hg5;qNzM=I^H0pt|DUEs$jY=Y&@^2u0Xhgcp5Jj_;rYTR6d$!_0 zIBt(J%{|*4aamHu!3$T9GkF`fg~qwV{njO8kn}Jm6~uJ)S~>Jvu8NC=J1K)B=;{-U zyavkCzj}nl!gW$2D2`nobmT5WCY0C?D0APHazQl6!7fF^tf}?^^5I;V>;(dvQy0}B z_GGC%<%RYou5vg;y#)DXtp$5jUI*yrl*sd=yZ^V*vaDz@~~Vl8U8J^i3EyX5PGh@@%%+BwBh`#0RYu+@2&U0Hq;pU!3( zVDO;J=sMP42FFjwEv-J>@}kS|={{$Ra?i)qBwt<&U%c*YRh8nt)L`nbGY!CQuqZ(P zK29+8mzh;%F!ghcVCpZH$M|acTjWJImVo%7yhG(2gg57S>K{tgd_X+)AFDE+`VXNn zHXfoiHEtY@r2o(t$-b4tr$4J>iv3T6rCtArMCJ-V@#oOsu)_okRB9{H?)V;4ZH^b!58B8e%~ilE9ak1`F^L{78=P$ zZ$FlBKF$j2oWe2V{G<(1zqF@8o$^pIr-x+cGDgUM%$cm@e2Au(VywHA^J+1wY%k^3 z6V~EO#c|LrbfO0$3}02s;c=rLT#T1PDVLZj1wnQj_|gkQ9Q4sx?e{p{V?)kL<$@n9 zx+GLUzYDF4CWO9U=}|6l+ZK%v}3H}wWp@t_>% zk*QTQwhQR*ZjNnRV$<%nYd4RLmgKPGuGh>y{uX`1LyAdEts#-o66<{Aa4a&z97*>= zoM(-jGgJP0|79RbEz=kO;|7 z3*Sv5W`x*kp zEd|O+UpudI)P7({kEAYf%<;VAwnto>Ef(1jaTQl2f1-bVFvCQunlxXD!!-UYCfgcY z>S*aO!wSV5_Y}46x9Fe$4T`$gZX6AqOb^~1g!-pnn&u|cbnP|pL9l$-`je7P{^L<; zET0@acvu(ki!b?-h%Z8OeZpl!dgxr{d=o!s$LWzw3;qMJN_)?z53F2Bjwct7C(7ZX zGApR#g)I%@WT|yPQRJbPsfs#V?^syoxF|`cBfZ0YqQ>SYLD~rKsrn^^rkHCD(K=(E z)h9C5qH1d>Q`Ks$y(gs{c7QX(>a8Z~~h4L7KD z_nrk-1?zz-eu5h>zum1Iy+C_LNllVGLb4v5BJtMmH zvuG(OcI3T60+KY|ifw9S;wvnJMWt%2O=4HU-n>`xcEq;jec`WYRVz9mqkNI9 zsQxfzUmnT6jLlw^Zspc%>@L5$?{xUNZz-KfW_LW_PM$G*RVfS?BJ!;>aR0Q zZtd4=O^93Q)9yt%`oW^yt^MhFQyjn*rLlIsU4E$F!5`gvgIk+hP6Q=dPA&^nTw@Oi z{?OaFx5gb1+owgwzCj&OCSJpN)TRk$chNPub*E#E)8-4eV6^r7DoCnEvRd8FYjSHp z^o4t^zSuT*Z2Q6vBAMMS>LyU#g}#bAb7C#Zntt6yC^Q}ljaDmm6aHzs{uQI*Clm^M z&r&O*1ngdY?^jq^UlDU_clv4hhfH4lb>KcuZL-U))v1PpJzpx=#G%GzSTsqpA*JWF z&!BLT*!DxG@s;^2-Yl-4h@tnZw1mPPG(>B0NBS7ETU=h_6~)xsEx35Yjw?5)qxbZS ze$mPgmVTP}GTpIGkENALPjHK32W3#d>>ysK*y9tIyF8-Plee4H^!t4kUwElJjqb0o zBHMNFk0p^TbHQG>^K!@HQ7SP(Bt5LzV)W}uM`G;(0+{QMOnlB)(MLerN$2;8d(bKV zNN%UQ=*k+U@gZ*I(e&CXHB$GrFEYjIBfhbzt)Hjiwzo(&t|E%dH$;)|Bk(pg;>)R2 zuBGMD2p4XK@O9JMHhNP(MVbBayguaV@w|VivE88;Rp;wU9f zDYN$Do_sde%!i6cV=o|XsurL4#hbM3SMD1MyCPBAO7k7HuSUEgzRc^4wR$4y)`gkk zh}eGkJ+HGkmwI2Bx!0>q0}154Aw(ljUTeVePg)IZ@nHe*bNL5qy=Rj{sx8sh<%is+q*z$J(zWnFmmnEFse zN0B~x*+5wr@pR}fs&n7svwV3+eUbEc)w~@IbIiW8*3@JdxQ;pDe^2;wOfRl{Y}<|z6{Oe z8~+ME8*ty@OdHgqEm*OI?}os=43c(gj{fI;8Q6G|a#p)JpI1OP=je|hUA*TiTreis zV%!fnJFcP)*3bOBw4?9&Cq56tT6mX^?~jthUdgkPFkL8*^h-(;W42H|EN&PcUQokQ}7?HT#{ zq{E=oziE_${MqOtVEUW;q4u+c7Q}& z+2i9L+-aCoj$l(&^0&b&>QbIR75)Q=+7;MRA_ic zF_~})+HdjumeTMi{BBbkey6YnS~;%~9>Ly%Lw@ZqI4I_6`U{SZMH}BvlcBXe+F$sf zStR4KTMfr8FUb$L;y8fiV8%(sIB#v+1m858R4@2a`8fos()iy}E{^JSlRR>E*PY>x zxMH-X?59aL7Ac7(tx9wId(Xjq{4eArZdjpY#c>!np+HpNUaGPK&fRt6B2!|tw7j+R zpjY{5Tg07&gKM;Ue}=r>oJSe0i44LQx3bLcG_JKN+fJ*!J-vlE3jgJu=g`Y;z5wjb zb5bh3B#Ut8iYfo~-eJnjNmmy06*Idd>9C$aYbh&^q&FJRS63l{#41IYWahcKGb3LTzZ>wUZk0x@X;!n zzt)VSo}v9Xo~`?}P(SrumkEpYC5_k+pdz|_^)^xV$_<9z<==>vGrK0b!;5N7if23V z&-@o)5z=PVd&FP8;wUlAeZOXnp4J;t?*!S9kV=20^j9YF_mXyPRVIn{TAANsVzgHQuhsPF22vCGXes^v1xG5v7$l9WdE0)@TKcF-6KWuv&kZ5}Q@Q_qgdl=MsS$eW`pX*K6d1sxP1icP#30 z*5=N~ZWi_j{5Y|!EU!jvW$aOtzV1IB={WdFf^zJwpCsOX5bs~M6BBR0J}w(XYEMlX zdnz7ai-PTmqiXb1EkSgn5g&ki(ukzIX)J`h1a5;;rA_=TEZFJV=X?*fq-R)#~H1CE|ng%rpU_G&p&e@xpUCfnm1jrlqNB+Ey#c+oja9= z8r&Nd2Or9&;buzXyk?na<2OEkO?f#oZ>`MBmw7ER&n5G^WL_zAm5t9N6L)cx19U}o zm{`)J+=t@~esN2)SA102{C_7H2mup|J+F;w=g1vYyEjKP+UZgAIs}VV%{xIf=I}$l zXw2n@i$$Y@9|{HgYir(#9UNN9>O}D*|mC(iiLMEaWoDLo3Io^Qo zR^andsDSg!N+C6P0N{YyfxY;G?Dmbq#stV zhpL(BcIcb-WT0X7=4AV+f8^ULW|GItxhRQ%(0(a4&IUG`x19c}XqW}HIn`dVD?n`d zR^2%yLCWZZVr5;nx#h2E#ZB47Q>}rB%j|ImsuyRf!dun*CVkdojLuH#30&bdf_?b$ z@K8=t(%vvw(t@E#ShUE~Zo9HLT3M;|Z1v*`=(y031p_VmCkjhkM;f?dahFewjjAHt z&5f(EI~T94olebb(tr6L7R#Z>Xtg>9TPZ*OjGNiyC!I(0HWSK^_2&A;-)a2*SU(Gy z?7vCkdNNVI)t{&PEj@nimS!Bs7SV#eaE5y(3mcnZ#!0AFw|Kqi0VwWuXTV?z`+J4C zxIW84TA|M#YjbjD?I+<)@Gdk3ZBd%ZF*izgs@{|FZsGTI?qHhqNt}7byCT%0g=nR% z+=mIBIKv~3dc<$py*LPMAhBLJMO<#bxz+8lbk|>M3g(3u<(rfhA5xYmuC)}`Scq=( zhd%GU$jkTH5?FgGk_vobzQBO$m`%fJHipyg)h{ZVrvlch!nuZcrtnU*mF6(>HyR(wqpP*0^^`66g~r5IZ7HS&u*K45rvFB; zutCQs6Lj>DqDPCkx9aKwVymxpe_FDu{gEtQa(ECxMir0uaYwmKN&0pWeZM@hJ~HuG zeT0_ZNqwZlXF1}-<*f&gr;j{7Y7k*lUmVRiV({`lInbbIu}!2|%vnWk$z^_u?a=0| zQY+dC+7>LShbE3*RF;dJN>`scAkGl;q z^KQ2xW?t)-6>W@Wm>BMoXH`U5+0-owfVG*vmJ3C&oYS9_&sgZ`E9Env09=j_dPn$0 zt6y2uj)`oW{x?2F9O(lW73|bQQF&GgW(A+PP8}4SC3)-W;4m!%&SQvA;q#$Jy`Ax+ z7|a18V_kOqC`MlZ9wlFR3qJE`x3sul!eS4O)Bd8HY@svaVM6`djqv3@&s)%pv3o4~V;xXO2$AF^M+D}EH-K5w zb1_I58UDvjBTf2!YhenHPBw^hD~NLem;pW!cbrLp_WNQj!Lb1vY!Lzo9W%-kj@~Wzfj;#7-CI%4=&A6Q@Gr? z28(HV=Q$fR`Bq}so>bVLN@07NomS?hS(RH{xlC>0*M~Z!0u~|rE!zS6Rc4b7# ze#KVO7k}x4g7_}Yo_1X78{4Kvu7h#D1XpgC^fzu>q7$Z)k(h}bwen8jPD!3SbO@|& z2&_&BtPK!Yt8v5cO5E_<1b5E4a|T6pmi~6(BI@mZbw6egCdN1+zlXuGNUflsiJkCM zvcZG+(pNEPcI#)hWthTF(~^CLKhadS8(-IRTEerA#*bff*=Y=sl!T02`YFUcjex6R zXs)sOwW>~7ZvEm2jJK-T?!#fVZofFdhFtxV9HR0|%mdVOcQ{y;_-w*BlZbkhb)UC> zo<_~aaM`1~>pwKR>OVG92OiBeYYn+w^pSqaBE?j22p%or{xp~JSVydbRLKiFZa)n> zybTQ53>ZYEF8$_lv@XdqlEL_IgpZo*DzQ;qIt~fzo@8G2z^~3G$Bw7zhTK9=)BN0g z_gZtpla4n>NdMbS5?24mNQ7UZbE|!kdF4gkv7xEdQZLcu0?Q&-=*M`m(o2bT(M6$ryxH((Ta+6bFG}o1UOSEf zUR6aiYL)(W1N&c{q-wtgSekvbKXuEVO~|pm^026<=}AdV#euP~bPEOsPd~G1nD*?= zHklIRhy4;uRjsPei{nz&x*Mk`wVM5^_|h%*x^b-Y3lALT-Qts?5z2j&Sv@YJ;Z@V= z*UGzTn00x@m!u#}w)w=^A(7%(c)z*cNrmpN(!x-iwL7Y{tAa|yDiiZVNxC*ax7_HW zDd^cL4oaSy&eyOjv!)R#Moh~WCFSBOyGN9ydxU7APxHF+u1Z&4*1mEXs!5df+v+Cf1qa zeT(*$P080!GQNqmx-C1MyXw;Ob`AKdmha$^ZSaZ!{O@OiC8jy_wy|K~H`tws4J7)0 zJ7IgT#BCZ?V4IhpvNh8Q@`0jPfuegUq^D=E(_sn$wrX$>fo%C(XjTG|XX@GaOY9zaKn=kOZa>Z7^Q?Yux){_($J zF|3KoaphVLHh3M_(aq=M9lnZ_!8DNYh1B}ae#7@|ey$qj78!ju5k-B9S(z!96sXKTs6v?R=2qxOhK8oUTylI0=2RLI+`+T*&8Co zJzw6(flbgHzJ?cm$TW`oq@ON^w#uieXtiHdBt4To;*A0O%O%ABS!rs8J1C~t_>CQ= zV&~QAYF$RLMn8m?#a&(O^rX9xLO+%^xzJQAxWP1y1ZTJki-P%TB%41MOVJ{yCtIyc z*XV!2%TLSF2AS%r8%?RMUYod|Q?71sQ91fwuC%Ql=P+gYPp~B@-Y9a`)%Zm;>3=uX zHdSO>!!IzYgV#(GeybJUE3U#zgFoH_( za3fK>hfBoTJkC>Uf7P3*J&SjL1cE5y$yI%kE9`;1*L`^%Zr;L5&`(@#)xE+qRQC{3 zrdvIl*1A0zI1hYnZOOnBEmv6ne!ERdI2rD(>w9Aq70o?!~wj zE;(W&Rk5O%QAb@->Uvv{ED`sipuXodqEM8SBI^H=K2f6QZKYZ}w34r#{9)~@;MY=c zW|?$ko;P>!{o>R!-6lh0KcZGt+nu-DYDcSLsQ$CJt3DbHo~6fI+1^RU5@im!@r&r_}LSWA7@P_r6w**#7!TKnPP^A8Drwz2;?pYpvX zv6h5ZwkVs{Z}3464s)}+zgK+RJJh`y7E^EJXJ)nHyn?sHLACKS1M?{_KMQD zh&SMCWyh3@4r!2VmnT5cO~!(2?s3kSkU)2(W66{Q*OqD(zW5bZ@nxlQ?V)hLIh2p9 z<7D`bFVxnL(kgKtz@k5VJq#BIm02AJl@S)z@@`{n$wxiVtHS;1p`YQSgQmns{K*a1 zL*mL0D4`@>zcQIpl8z*+epyPA6-in8gw(1^vSeM)urq16-x9hKbuCNQCGk64KDe?E z%a5sSZ+R+YtAyOrI|-MY6gKXKu_lTBZ;yfaz<|%w<>x#?T^(Nc+<;IC!cR7FA@m4l+PtrSP5sGXJ`se|BI| z4|y){U(OL`930q3Q+_1ML+M7l^R-&lBiv)*e&zCu+pGwlsQLw>9=2NbE4IgCji1$> zf;#Z`US7TQRrekYxDAX^Jhv<>aOh+hbpGn3*J&I)EorwrZ1aR zZCW8xDJ@s6aM@K$XG)d}-diHAv89eaz0&3pEzPP(V_`yCeLaMUv&^CR%N#1rdcIg^ zh}t`?RPWs~5VZ&PW)M#0(J42iGpVPP4%$$jQifeJk9Jp;Hl-R{AKG2>wJE`fHx^yC z!6g4#rer;GcuAJ%b}mCt)t;q_73e^H@fJw>WzRD!aFTdczj_9^eUN*9Egyj!bUyG{ z|9%8J_Eo|6=XEodDN4h`#xD;1&~M|{ETT&61u<7)O;zyvq8EXsavy?piNgct4dwVufXv0e}ddI4h{zn}dWe2W<02Y8f3rq-w;`yzdmc|g?z+t75) zpsJth*Y9-1n>r zvfXxu`}A?x&8NpS<-*Q8GY=}W+k0uUD5I78gchtUl5XP!+tz~`c z`6y$Q95G^$i#PQnEzqcF==aHo9Q|WFL^8%sfh*jQL+$3E6&9wK)*wH6g4349df=J> z;+tay5NO;Mvf+%^T|;rIpT5eO+m2Wu5R^8|B6hwroaPu_WCilNaQpW%u#vQSaGpIt$|21nw+9;E3g+-7v>gcV zudKILx{FQtYnxYs5Q4|2EgsTgfU?>q5_eX@SB<(ip>;SVbq zw&!+Xv})yczgE@F)^xZ_)@%q=eBo8r=_>TQ3p&}JzUT*`3t_JvHHLj57nZ`{<95NP zu>%ICt#(eoO^q+Adoh?6=5sMDxo;~(u{*igtV>?!-?>NV`3qR2#xkI|8H#fH=(m9l zLcJ%kxvQIT9#LGTisCZG5yhs?TA8+pK##cHrE0~bBRtI;2rxtytNI;t6_c{=`CQ!u zTiJzd6f1;1@3!jdkKgt~RCI6UoJyJQMcGFLpH?3eHs4 zNwb(o`3mG=n9j8Y7weyX zfrspCxAt=ZT^;nOQK9r9Me{U2e6 zW@b4bF}96*Wb`CkgMyjzCuODt<_#@yBsy7t_N8QNRP6#)yOmh)R$H9*e(_{(3;j}8!-$9h ztTceEVxHZd_io<2a-wX=O^U%vAauh^1J#f$Ah--R1Xe?U;4&0U#c|mxp#KEV0Tl}X zFE~tFgGzfo;g43V1*nr=;)XxNaG&1>xLXXkvb2PbvL4YspaSrfm{yLXX>Q9dwPKGN zxwu&s53k~{cIj`3sNljr`s>H+K#4`9 zb~POGh{JB>p$@m`2=`$}15FVYv78_BT0PD_CGs$1_jE2hJD>MbZjQvRAs0SwFIY zF7qsP!$QB4<620Y=&U#J$sYZ~89a4xOc$F!w~TUt)V2dkS*yN$Rwgn7rdWp>-fG1c zaRY0hKYY|(`=~)Lp0lWBp=?o-9_}~SWu@3-`@p$PX6d65j#`C9l6QH}QMf1ZD)LE= zDo?yA$w&`z!a5|i6^A50#Es#5E?xR}KxCGy9K2qW2g3>f;gd$PN4t#1z=wQtc_XC| zGsFKQ?rMPJs;=`&yEq$I@>ZY}H6=kqMMof}RWTh**O}~Ft)%y)l@x;r5;l#e3yx{r z!4x}VK*oec!OHVGPUD217BC@6>7>O_h=CcV)sKH9*~ap}!G;P)loiOCHQK>zSbKZE zbMO1xUCGeWl)-Pc_nmj{J?H!Gxj*mTyNmdJN+%7|=?PROd~TAT&&mfnF&ueKR5|)Y z6-+%G&*y1Wv=lqc^27O^6x6_M4(-=r7|3NY4)TuObZXub65o&WGnLwXsjF_l)M3YB zynd-?Qv~m6e6w~h7dv?2&o1I-_shQuf-&2j`<0ZSN9i0`LjA(KFAkkvpH9{M^NiMw@vgbb?TyBun)uk)qp8V=c!e4@hUNThw65Rm|CiIq zznc1)tFeCMnAVXAL_+@s_*Q_;|V zRf)Z+Ub$v5tmdMm{%iq4X@@^`%NBP_P)VyPa%q?tshQ3A8=DjTLWzBmzjGbJ1LqI2WA0)Np4Sq=HC{n)*%ldwUZuB~4O{zzJ0q0V8@)soS=q@Ey!_wP^#bX9fC_y&6YO-;m<6WFRr{nDiGZ{aE3I1ux0 zR-VTuf^s^qqrX>-BBNo-k3V=2b?LdBCG(h@tW&~%W@NMA=vyct_` zl4|xTO5Tp>($_pC0?Z;{h{?F-tjMkBm*^65XYiZc`>W?yrPX}Yis|F-;@wrMG0;Z;qtAgo*BhGV1-w|w+R~*Pd)0ZBer4mJH@Y#X=lk12 zLp|e#KPWBc8?jUTjgVTka(U7h#z1AB7Qd_NF@BYUmjn6!(Dt4dOa$_dLCv^>hbt73 z@8XF->K-<1$>)1NGN%Hu!j`G>FV6^4ul+Yrg^xN}X3oOnM7>u*?$p_zLuw3zw{OuH zt}o)p20{8qzKl?yiPX|R>PJWB(LeO~HPP#T5X_^GP2%HO@$tO)ctw2ld&D&17*F~& zkk-oKyx06jhg^@b_*1OMxW?>a{^|wTAbPTozaU4|KNf%ZQ)~H;J*j1z z#EOlVOP+R!{BKe_sR-eyQPDVef|o1tY9-Z}6o(fz8e5gx(~Z6R?!QjMz}hIM*b}az zA=|*cf4K4ze8F7C;JtyB=SQ#CYL$mDnIq-~{EeZ(p50L#TXL5;wUS^aKHb1jFLgr= zgqNFhzN^eRUxK>pr2?qMtna|nV%GPG=f$k=su&+khfOOmcIm72aLvU}TTovZ>#L^V z<3|9(%D4kFB1FybDyrxe%d7jA*7E8bUVKCD3#*H6b)Oe`6Hmw1i-QKRl7&JIb%ENJ z#f-*zI12Cj4)EeuVq#;kaqdUa>+6;EbGQq4Tg_trxg$Q77ar+qG|q|zM0S6^k<@mf zk9HZ}-p3nO#Ejdv&0E{txD;uc9NJxX`+FKb3yRpK7u;V(Kp4A;g=x%P)%cI{8DV%ILZrr5Q$pU$=XpP0`!)TM?$ zak@UlQK-KSzbTdSH>bCf-GV{qUBx-v(i^0l{enTNV#-o1LFKdAPF)BJ`0 z$e4d*%|EE4vUBDB#?W3R`R}}O<)}XJ+w#V`QPmhR%60GlHk=?pa+pT@9VVFkLzKJH zn{$*W8X8g7Z9*`axkv^k*utc#--tlrRwLr4k6|Mc5GC1Vl+$%g+&v)f9YRM7M3@5x{ zI>D=mHQ5eOlyyIx-3xZSV1LxREf&Q+!nqz3$>Ub?1Sh9N@|2aF=H!e>&RWTg>p!r) z|K*w0-hfb-6S^FRj+=&-i=E9b_T4cn`=ZjmYKd8)1%;?t>=ZWm95%d6Hmv@W0$x(F zCBzaLrssR2z-IlyREAsxuJK`~>QdcEN5zs5qgKTj3sV_$_x0gStj*gfc05Ya;|B&W z4^h4SUa?uh*h4pCaUA_ro{Ao(5eIe4eKBJwip9m7PpAoMu|3NAZGH^U9;$)<$4*fP z?_d<2i%}eFl{iCn7(4J1SsF+s`g3}Gx8*ymNNr43KImFs;Z^&}3~$UkQsR@Yn2b1z z#{Lr01U2+PepK9}G6Y{-*LvuUIJ_HpYVuiQKlNoZ^ z<-}if)hX+--jVyiLOP+49?g%?!#;7lcVx{8Ri0z`n0l(G#z*<}_A6`u`U>hM^}_+J z#u%6SeRhB`Xq)fYFXQ2SJ;LJRKco*1ld;O$FI<5M750O85Hk7Edp_iIe8j5pg+qxm z6u9cLgsx3-BJQF30;$0!+GqUKj-jLWl!dyFi**Ul-Id;5&W7HM+$IArAzCB~` ze4vP51!S4^t1Rb#fJ0v^%^^viNkhTy3Dx;A) zAC*I+YVO1A!;VfIj)t|3=vubL&%})3_GAsV40-fZ{~4>>qYu1C-M;~UoAEZEsw#y1mm%S7d5hsh|sv(W*#M;suo0lBPtu zu=JEEnSo?RNTyB6EF`l4>zP>Sjnz1@ZVm{n7ebo%6JMC4KZcnknlGF4R54Abx&jOQDyB|5F9$8)$NGMjndkwxA@g2QGY|5aft0* zfdkZpy_00`Kzp(>$@WtA;dzkSw-!1o-X+z9VGoBW-n~csf|x)RC3P zb#GqtZc}MY*w;)}PG%JfXy_UKY>tE47nL*009C%-b9K_?ga0V^)1$_yj{UyB&WKZCb^ zp^??!!C)5UCXz9&B1(63ZO&1u2=N68GB;T)Ho%sZ1>@`}l^-xmM%nZ{fpCyVmH7A! zb|zV2;7TV!!Y+O!nI8*?A62nB48Y0j2%r8Fm4&Q z1jW;U7?c#>WXO~DcMR?lLBeEM9cu(|)91RS>ZOK}KB5z@LmvH%5bi7Wx7vY6B?$^Zmkv|5eZ&bnHSt!1C0{{O{i$Ipz&Hh|2>?l5~1 z2u2P#Qi~xp6}T|8Lb?k?OMyg@QvIc16fKyjy*7@TL)HbPTGX@U+A2%ng3>C11IrI2 zmYoIlv;>%i_0%qgtDf3$KFn9z!^c7vze@fB_t?VW0cQoBXb?NDmBCu+L5W38u4bgWe?K-vwRZU;#C zTefqp81d0K>N*hz2ifg#-iDmxam2w5xq|2Ev7Qkt;_Y)sybgE7bJY*&&$m9MKRuQ^ zi7;x)?NHSb?`$G757nt6ms&h@`P2+SE~i?ewpWGLOp#kHQHNg}q+hR>9G=0kHitRc z;n^J=eEib8Tb;q@>$Y$IC;oKsQ!VPz>yCKiVyG#4E`JIqrQQA%9Wp&##8Ol1@4=t4 z@{i(7zGXE_bz>c`&eY=@c~Ls=wdc96Q4i1K#Eelb@iF-oZ#Ua8on!3PlFdA$qtzXr zVLl5p7&(oG0j6nTxCR&JEQSWx;DXr^OA?;Jg(S01M@(kJIQ-Xq3@4l3*L0~C(coTrW?D<7N|RcuFC6A_EC zYwjmCxHzjq$5u+Di-@qM_lqeD>^H8$&$lIZh}JAmq}mY_KW8NM$fCJ(w2S7*v9N3b zyKKGt);u-&T)7-HV3#U$_lgpLJL9nle!UBPiIf}sLZs4eq->l4RP(U{oPkuwxcxLs z0;%Q+H>3`rY)A{ek#%{4e-(<^-wbEq;_@Yc!bJ*lAF>%hH4C6lNucg5D+DUw0t%(T z#ibmj=t$c|%h|;sOkSG&N}23uRG66T_LRcJjYqW$4@q-39yZNw*B3f3Q-bAA-?_ak zS?+RZA<2COBuD=NYY%Oo`CUGn<#}??h>9~R5rVN+6GukkR|yB+p#Xal0eX`M&ZC(8 zB1h;!1mvFYwIwwXjGK76S*tt5GtSpqGtNN~fkhX{9e~AK0(bnCaxmWtzfumx*Lb%1 zpW3juV*^Lu*D3mLX{+0g=v&6oSE?|B@9@fr$=l7~yH^I^MXtKoFM_WUBn8{e*b601 z{iFmJN7t@>E2ZHgx_~_HY#N5#uqB6J(2lr^OVDd_q6w9`i7Ru)Qg;Aibit&kDR%^N zbitIUq)t1kGA=?LNYVr@;u37Nh|>-#;v&_t9H@wkRL62a0v8ZW8VewB0YA*r0f_dD zDJF~s5KUQ2j*W%4+u?1c_a#|{`2fkpc0c?IHf}dVt=Cm1M`rFaiOdQL6|f6Moc+b5 zVTRee%_?0{0$LtFNPO#^_}YNj_*#HC@U;N3u>>BtII#pExQI@_cocx(;=s+eJzH$M z12@Zd8zY#Gi_>ku0~e>;fJc+S!L#$a1b=-6{OuHB^jgbL zey5*iewci+ORTGQzR4|IPg-z3MW=b94Hn16;@yj*#tU$lF;A@OebZRrqmjd-#`m#9 zPuYA}H`021QrSEhi}$O^hB7RPi^Yfax+94^1?Ml7;V}7+l=Xkkn*qY=|=)god znuUv0{>f|&8?c9{{1>-{b}H*}7K5Ht^BS*|_yK>r;}bo3Z$KM3QLg2;#gdo)E1q-B zuW*Z%iU3{y`?Qk>kNY*O=K3qT%i;r+<4PjAzHR z{O*-cQYU-$6`Vm%Po#X}ZE+U{Q_~GJ+IXCmkWkN2HUBzc@CUm0nC?9V`+xK$yjZ+? z4z~TRs0k+W6#VZgm%a(kF@2+4Ilso~pUZhyIr%1L993$kl-i6^3!LK=ce?B7-`ya> zeg0TzR9XK?nbU0#@wa=(ZGRJR{9qUKEivQIO(4##?6Zb6)`Dq?Z5W+&h1nOa89g!7 zkMA1ApYB02k2??z^XS_s%TWyKI>~N4#uAj)I-k;bxYbZ?$)Qf&1h>9JNkgo>#!^?y zSxm4X@Y%^Srs657uB-KGmKFs}3%TH}8CD8~m1YUFjHSBDDnZs#n6pZHsaaC5Ddw@X z`D8)6m>@!%pEHFvzoji;%5hte6~*d$N6YU~dLN^vN2ihLZF(~7*ORT>eXRWZX`Y+F zC|OHP2GJkU@^CJfQ5Fy7LAK0D%8H~>j~Y>EZbf@e05 zxYyedU=f>FK}&PiDnX@Hf}B+XpC#wx%q6dOn!GwGX>D>z@`%&MnJ<%)FE{#MAiE$AoJ$YQ1r`Gd9Gi2XWR!EAXczd}seiK2! z4!EI?xy#Mm=i9FGcpVKGfZ;kADpGf^^r^K3T1LBcSGgShZwILIjRgc2UCoEE`e zgm@tW7h|Bq4S;}@D=h{(BJi`EEAR^`Si<4IMT7tnU{>&9Y1n#>1|j4wcSein>A^6B6e08^x{=-XCHf#I~r!`6@xj z`5|b_u|14ia^uI?KgoN<)Wp4)mZ3fW{un3q;2g;=zZU03?t1(doDmg{8OPg_*X~q$ zd*^@`)Rf~ap|;T5N@DW`*s9Z0v$!pOT1?_T06yr(-F`hzHG@2{FgW*wa`V1evhqni zIsYLo@d**&5rmRtYmN_OIV^@}uZs~H#%nFft9g`W@=K}Rsnib1(OS$8^rLzN!NrYQ=!4bQ;AEh>Lt5Qgt!}rL z^gSnX=P5%PHcpGW-W{FC%{;ajyiMV$ip;GDwt08JH4kRx2K4`C?Ruc2DzE$`Gm#O3 zZ=!OgNO4o$&A3_4*KU5G<-xSc0APF#J_Wthoy*F=W60AMTIpodz{@m|=_ulV* z_xtnit%$xn7-XYa91fM?h7F@U-KuKj{U)q{-mH^DJD5(N>ky*kl}e< z$??!k>HEiAl3Cw#xuh06OXyckF3F@15gb9gH*t{5+?Fx<%XQPuVVH?t?Hh znafWCdbiMVWIO;gNInUFdIcw7D}>9BF?1dSr+^JRBnrbmAUwbz6)Jsduc)`t0*S#_ zc9t=)n?yRKKut6v3Ij~JHPTM0*o%lGK$yR~ZW^g7+)fMSZ-nF-*>3}Jo`PXi6RRg@ zpytF_f)Hq1SRoFC&~VuW*~UrSt9%cV@Xt^LIWJ&J%eluAj~{q~?pBtM;e-Z%KomfWPYo;U(Yzd%OA5$eR3F6DK21bjsG9EZ5MNTupW@s2Z zywkwjJY^vLApr@Mv9JwKjLF24yw5jF^5RjL0dRTc`6KayTE<7fmIe*7232Dc!2T=XtEIA3CbV;h;n+2+~TTN^JAzFjxrGIq32&wn0+ zL({i|zI?Bm2M4jCpYxd@ghlMz`J`a-NEeGmr1B(&O53xCY0n-(_ZIHzLs%nD^vH?heM>Jq=0WE!i75lqt&}h7FXjw{ z0jACtHl@xKX|qH(OWW8OO%YzL*`$SQ(>Uqtg60P*IElLAn;Ij&@eE;)nE>VjEqyKs zU@p-1K_qBGuoUxoAyvLfkfK1l00Eh_W`Y1zOZb>9%1RpTUP!<_VacD>o)lRYUgreB zo8S^`*cPf&D8!p5ce8A^)QyEKvNioLD!y-Tc61JKwG{o%BVb}ezx!L}H(yh~w=oB2 zLs(a4O3nU^#lgBv$-y$_pjdwk{*5R8otFHYa?aN3+iX@%OlOrXuL*t?B=KwFA*Q@! z4s;wdBSpamptv=VI()j@pM-!`BR1ow9yOZl8l?qkSX$MKnH)og&?tjKKYr+bUkrw!78L_*)U_ z$6qY1g7&KV5l!z5=I_zgN0y0y9QLFM*!BEHbMIA~FAq}njcT*`mX4B51KdKigoqm+%ZAnYjlhDz6BW}30|WqLnZSR-X%NL*W^!kr=~Zn zJyEj%ax{IX*4#UYW-_2b%?8~~luIp80oA=H86nNz9@Mwg-KfEHQkywU`k)+hhRD!? z$hU4OAcV@!L?oW75qfmla>I zN_}aSy67m?BTMyKr7l^eE;~wHk)>i*sjF70K1ZoI-;uhK9O`jG+Da#Pxz0I@O~5`GQ2;WP&TW>S?rDd_N_$- zvE|xYl+F8r#?arGH<3>Ea$pe?hh6^;Wyu+PDv6Ma)QovWsu3;{_dSg#n^b>Sje;P699&|zS>Dzcr}PuF@;*WJ zYqDjY`4}?%S88sw3o}A_qWnlIKQgJjLK%v0Y>~RSr4uMD-Xb1b@lbM>mJu}+pI(7S z&Psmx>Z|!}DL;JU7b!Ut77>g_CFk+RE=pL9ur;gov1=lauThP$g#2cu;X9W4ml}VI z@D5D#;LOzh#QL*j3;KpmZW`g@O{6!J8cn%%U&*@o(;@J!j z+5u(iHUXbXY=PZUgrY7kQa<#=hx}}VEmHswlU?k5FPzmu8Qlcy4SF(W_WV9S*H@z7 z$UfQ-!hk=9?QmhPL3BUg&}XPuG)q-BI{hQwUP{cmC4lS3O;y^HlX{7k~xWElc)maj5D z_rR5J_}i6#8o@4Yvo>!S0evBYW^O@r%%M9d$=vMW=$P$r<@o+6#KrtV$wQpYL%eo_ z*C}gk@rAkD>*anB;jaX^;&B`!DN~!3sfdQwCcMs;Dq+$Ve6l)$1fd)P9==4S5NL8E zigK}lGW|+`V`@?fQ3s(XMZI2x&D;pcc?V^UOVXz;*E*D3iwbX2@;*atE(#DaDtZ~= z3<(N#>Ua{43{ROJV=$=2pa@J0Z)$%7H$#ptP|?%)PK32i?IdrWwAsB2$OxlXsHMXK z7&;5`HXL2J9^w4ffsOEgj&PNrqoz;uB_iw65d4;=&xMD*0``s0p>`3uay5chI;W5# zD>@RNKtcPmTes>(^Jcq(v&OK4-5`8K24~Io1oUVKv+!kj6t2+pLje+HN{H&urZ5H6-b=t+Uln+D-h3WUok5U!*^h^0ZengXFO1wz~j zK~P(1IE#CFMDbsG1jXyOGSSrf7F6kD(mQxNwl@Wp7*M$e9)eZxM*TvlXfg6sh7c-c z`32WCdBygh;8*t7q;?u@dQ)m#N~v)(&}eVrbXX(|7!Yrzd{zjnmS)Cjp^e*MNU-P9Tm}MNM@P_ z$h>xSBE$aZz6{~ea*POyrueFh5DN|Jto9K$8Q1W#`ZMcd1p&9ghPRmaU+;1Wb%Rzk z_c4NcELxLc>6uqtxTZm1ejvfHYk||5;G?9cW84wIV_wXOf{$@$MvKgdrC{)uNJkGd zoasOFO3XZ{BG^_;iQqu?9)>2(-WC#eHy3|I(k%glxCH8t&TE@UmUQP z{q?VZ^u9)_?8C3P4=-nYMIR*cCnfTvvVWe0{EV-b4+$>?nQOjE96w|nKXna+qeL#s z$cf8MvyN~b?5fE-%Ma(Ov)~=u82u-V0k!8iEsJsTgU!0q!lQfyJT8bMV52P6<5IFd z(n|(kpcNOb&dwrgDi&!agU@1>Rx-GgmT4^SLI2UZZv^#@@y5-oLirs!94LuZ8nQd7 z13~u|)!hcn7pXd-$HAg>V2^${?PC$Y5%H^3{qP(w98S+G$#NAosawYmAB5f@K=D{# zWyEbhU4m1MmURE)svh>K4M%J47eT5B$`JFx0iba0=*<9?=1rXRL&Nr(Y%9c}8n5v6 z>;K(qZx{j?eRl{plXeQY8^$KXmF11Bn_lp_IOK1}#f=#?S?15iruBu}Prkp#?pmif zgRJ68n%=J3CltZ_y&>Jy7B~55rq=Xbp?(i!HrhuhRfjquZ0=*K-eIo5*C56_ND2B+ z&CRcDRE-aOyg7!QxUf!=KpeT9+ek?I5_WCm4nfWmu$Iv zN9E?w(zh?DcSF)N|JAuAPJsE&rtZa7oZR*EZ>>>OV}-!xpn1w`?*tNzIU7R$3okyQ z8Nai!Z51F$*7n=L?^PF{5y1XjGel&Vuj7Kz;?FsG@i{y~{!bZR?V|))S@Kh^(1Qvb zTNihfWT0$oLsD)}GB&10`O#cZUqB@wwcnBr2mRfE(*Zy4qqqm6VS=R}FcsAN3$DAO zr8YA@$c7s2z+EjwjpQ)2YGk+wKpUy{Vld6NFF?-VV@vxV_A1xDHG)>JCzJI;#*AhrW2CKxpoDt5v1~?6&onvlBaUTvoYF$rFYZwDcbmK6Miib zueUmUmy7$VV$)q-RgJ#Efc803jI5++sn{=gDly!R=W?6W#b*)C2B!gI#A(34=dMD6 zp5-$}xzxfcxh#9*lUf(6$dMZj5?7H`wUC{gRrWQs!pLZzH_Do9(2NViCuXC+lva-@Wb^(%rD`WP z?ru|!S1{HC@qJ60YTRmkr&`q^vJR?MyJaEsVXCg`-PD^InLHLhn!kbm)aGhcV(c2f zV2wc{lc+R^Drv@xajaBEBCu0Y2q7GKOnyKdYELFxM-(wQ6R^~NNZfo z6XT*cVvUQDA)SQ$WKfT)#_yTi{w`(7OIVZ|??Dd8Hq!e5LlvB$@mgug_-rew0!d}W z(PbiK#v&wCQ^FdVu(~obqtTY=b>??|0tOurVF%xQo+X;)yMX7Vno%L+r>uJP1GHo^ zdq6s4a&7@$enQ31jAwmwz)|I1%byh=p?&{(i1`(3dZR?UWbH8q#rFlM6s*6xH9|BS z%{%-onn`$5{xT_a)n@D=E|AhwlFQk$NSS%~AtAh}^r1qkEL32=i$c-@und609u#o4Q>@6q)0e0#%;A0Unlk&S4Q19~eb-zk2Z z4{|a}B$d96lcx_5UYGU%fbv}-P=Pnj{gf0gGy!B3!!&2@Vmi zB~hql5&oVK;kiG~vgOMBl<6osaD;x_64uHY4guRR#wlO|YLbBca*R{JEIg6~Y~Gk8 z0kg4B60j#xNJ`Q_jS-Smk&q-yf;iqT_&M?^`6&pq(%@}iL$^tUL+ z-GG8fPBM1;d}=>&K3R2@g_*{tyU(&)l_gQmI?8h9{z&y7cbs`M)kd$wnfDZ035-uZ z^S(`F6j4S|Qbwl8sGy9Bq>Si)-phZ*~o7?KYUA9i@en$Z=J|nC-Ry^ z9v)<+t!(FKj*h3k6yL{0>hV`KN@=A2*LbnQhUA# z8l!JXwygqs>;q|b)M-LrTlULt+kQEiYQG#%tJ-8CbAFXj>`wc|VZ6L*8!vW^aaAy0 z7R1>XH5)IM)a^F=Vz~O@FkbHXcEWhE>EX0pVxtqbOM-$)#>?T+4&%j1_$2G)ozXl# z*VR)rsPa0qxTAWub}s8daqV|Vl3wH z$fTjggOP?7k4^pm*!vdvsH$u4Gs#SH2npx#k|3`Uq7FteZMZh+sW6jF;2byuK|oTU zC`$2BOUaDJs)$aaOwTthR&D)Sz1n(h?X9+cwkp_H!XpzwAz)P=t>V4*dg2HMPz2P> zxBhFNc_aZuZTqwLSAGg-_Bng+wbx#Iz4zWxIQztXyoR<{X_@S#p!gj*kj_KtqY1I- zV!i?8Mb@i(`3ue2$tK?k4-;U(i_l`yWL8 zL_i)S6|TVLl_XuPjj2^WqQ=G1Dk(CI_>szObPA8hfBv#3WkfqtPCj?4b#YDfD}E{R z9zM)`)l6UYYCn~da@(&sX8SWvsQt3O?JwvJzyFx+zxDWuw7>rGJw@|=(H~!V*T>tbXL#;GScE^ zMVn+-gi1z&&ObQABT-?Y)nVJ^U`dJ|y-}9J!*t7#?X&({mT+f$!Y@m_S~l6+LDHw(bjmT^shM(Qgl^?SrBmq_-#5>{>N)(O>qpD4BY1J6Jf{F;jd;!jxVCI* zD1EPeWs1$K>~+hKh;TwyK9?Ha^HW7a9yA&2%|B!~iNAHEhQCVXVEe=p2&K3{eRFDf z8x>kM4dLoQY?A)|hLj>nt0k3KQ}B@W!fmhPcieq;euueeAN*3k_W~`4pd*=9N4A|C z(N2f1y$~5`2v68|Pl3CmorTLl+w}$1+hV^o75`ENKSQ}LC(WMo>T|Et&d7hqkbA5Q zn?*&D)<{yTV;E1Eh{_D@d`R|oj!QO12|K(JQ zaD5N4$KRtBc^O$0;>%rUd8FoDO7oAX;ZW?fP;9Ym--%8k^^Djc?%c4>mroGrfK@S6*e+@>2-lY|@?0ysi-Y#c^)IF+O4@khVbrV$^1r4=a#9KYzKYhHk zGKk6FL?~Fv;xzQAy$uzk>)iBdWXBpJAIZLRl7|yd2RIi|;u6aB%7WGd%B^)Pu~g%s zmG-kWq(B9tFQoM7a#d2A5!+ZC{lonjt-=@BLR(m>$G?NgP7Tld4^Ry|qMDz@Y|->A z6^$*le-8!5v?2=w@z7wq@HqXi7FAZ;Uq=53O12yfj{)6YyZ}Bx!M_@``|GJLDaiM% zf_CdBVP(hXuV#?Hrm#pnUVb(EGn z2S^ea+d`~-vc~j3oIRlVp87#Y^avPW5P$SB#2VjCDkCI*0p<7e* z*exr_E>@aPL3zC8A&E($Nso_tWZh74-hdgub#!1gbsz<-5!~1hiw98S-FVimyD&$} zAC0T6^St)Lkpm?aJ9V2RbL zi27hm_=wtSd6Y-q@&qq9vT5Teuv@QzYcC$R@#F53=?4xTXj#HuS~m?uZ!)cKHsP|D zhM;xTwLxN$^+D^#B|+l3Vdd$&ZU+IAx_U<*|J!mJ+`-gD^B51(680#~!}uYkG!LYQ z_zbrlWEr%*jx2Q=j3*eY01>~c$1W~SU<(S(lSf{QEbcm6U}Okt5IUBi!Z0%)Dy_2; z0TuxEFBf5qWPdn|pj#}0Zu_rSV`zkvGbehaI_rNJhPQb57k7hQG;r{K@hXP$K`c9~ z3w~=BLkk1S({T7tr^9E{4IKZ5iP@q?B9^o z#hsw34MFXoa{CR0ilDVONI-_2G=oCShrTGVRDhq~0nyqJNUg8a-VETdBuTk_5{nL^ zdW#l7e13O&rtkPtDg|$2?19}9mQJ{AaxnJP8$9eQ%9;e(2AVAYj{EpFu(u$nY z)tOR%PH9J`v?`~xHBLm{8{Xbd`mD@=8Enyf&vuwS1JE$xx|LQ7{Uex@GgiMIp z@~VK9XtVQcl&9SlD{;d(k#6~$f#`>FP?`RE;HecvcS80$`5uAP^TB32+(;&?pwLv) z*MizjYU5=s+nO%c<_>FYAgDU+-z*lr2d&1@7J(F0ezjlFXd;;3%{01HZaf`u574qS zT0=D2PD&6{>3#MfLI!FpPZMl`&OL!t0sysKpTdb3#3lkH%H<&O+}p){!Ax9&m4I~3 z{BGtZskK0hHjlW-?MK+7!t}a5O|LIcJ{G#7DcIX!mjpG3E_(R-4 z3;rP?i~TKq3sorctDzJV(Y7|XMs5tkeGs%Zu{6}J`B3P*P}71e3JIYkt{tS_R*4-V zwWZ2n#thl*K4oycgCA?Fs8qPU=GIe%Zd4#05bQP_K6ruZ{B}J&^ z;6cO_Ncnl3>_NkN-hS^CC~*-Vv8PaMN+`Bmwtw;k^wvwsC*7Xtj+FdqGK7&14>)iz zDF+AR2?wh(nq*LEyQVmhdVx`}%0Yo?)jb-rIzkp9V15HD-yYsWN)Okb!X_vb{u~RU z<|y{VvNQ2Z*bmc&NWy+7xderq?Nd)Vy8XZpQo2B8kGJsO9q@WMj%USTe!+|9I)%M> zu+*|~nhSe}8y)-Kv|LVzV22o(J$VcO87PeTA5hyL^Syg)&i7yI`#ro0(Kg+_WH7#R zQg2SVSdv8iCO2vmU5k?{bTQ#2%t)y#Pj3hfcKK?Gu7|U zRKG5#`uU>zR8;xaNUmOq=j%{CUNQo&qw9TLKOO1m?M~0Zhh?bfVyIm`&XZPyW3{F9 zzZX(%!pIzio-{7qP7wY@>^Vey6(+g$HZ_PyQFl7(gms2siM7N3w9Aa28!H`8=H)Gi z46^+n7@2XFeEVdgRKdS?6U>eDl|5(#lksj{D_KOpmFCBoWN#C8cD-y`twAePwc=Y~ zplpu>t7k9+J&zbD&NH@#;APl0wbpP^ou-rBSGT*-O$&H8cVrFGwazeUvo$nLy3?S4 z#f{Y9XsrKWwZZKf++Le*4Zyo&v`7D2l3#iHAekCkjZdlDmmSZ;BWOHRP6FKctmJO` zt!r(OTS#}>4POl?50Be!b&TxgfA`kHsT`43ebz8ICtH|o*DuEr8-^yR09O7=vV zCId$m#fDGA`xxr`Wiv+AOU|T{kToC_52y|xCj*f8Djh)Ls|7Bh9aFXK*8D0S{8)!S zR?o={pNT{apXAZ@ut%HgZ6r}sSB24=Jo+uR)?XZP`NKjOQI9iyROYv9R1|DC;^&iu z)n$A9nW;Tt-YD`_L1^b%HMo2T#)iiKWRLY%I!-> zWPEhNQY;ujbVRH5;54~84H^HRKN~WNabgr_NrlUn1gygWNZz+}Yac9WV8MQA0h@ZW zbo&>@^n`M#5rod)4kvWJd{PF0bt62S)IjWr##!DJZ}n*pAX`K5u9*0q4~+lqBVc% z{>wi8x@*g9{kFGDIbv7W>3Hf^E=dRM$ToQ0M8NJaX$Gy}Enc#8p``ij^Umifn62Bs zfno}LVhTJ}!$9@0AUbSwc!r@=6O5~n-yJVm4Dbgt!F6DmUVD8BQy-yE_+P2cqO>y> zYU25#;#sJ;UCF6vITcwkoGsheOiXKq{pCSgUf9#371>L?7Q#JOndhPvUQ*w@507A8q@VQfM8R zxyB(hb7KeP%-q(2&dd>`qk;zeiPJH41SdF-qMBt*;5dp}w-O8o%!XYHvD2{xW;>N` z%2t}5t~A@Jgc+YLD$P4R<&5HpoSyd9d5rdwm4gYiUku4Crd2~R^9dS&3_WSb2-cHI zT}RWCdgu2&R)%fsw4zpt6?I=)=Gx5EJ(I4?_`oG_nnSeQ=Ya(_RUQ<1jgb}f|4O^= zbe@kD)~g6`kOqvSUfK@jfu#J_%Q^X4@#4Fbr#(LzEPTE+)+cC`E9^I@fz&!wUi4ya zeXVoZ^BDp(tsbyg(h#XzYixkevkgR_XWQ2=Hq>jcD$PI1%h=~;{F>2qR*2n|^I$YJ zaoGLej=(yGxFu~{EZ^ZUl=)X*Gf%lEh~#$9(qFP;f`t5)rJMx|@2 zTu>Y-$}}Z2Pz;_(ScrRyoL1=ZLGjp14R(IY23Oo%RzdQh%7rxIy-M`oB~AcV?nG|A zS^kdE_EBC)dp~l6VI_?6cE)M+kgM@)X8HR@TTh<;Y)br@s#|OE0ZwwceG24Cs@*J4 z8EvUN?7Q09g&ex_HbYA^ddMnC=9~G4Lt0Nrsp;Vb1HOr8g>TH%HE1m19J| zoAlC0!nPZ#YYlAIZO^sqwiES*$91jzh-Kd4!Xc9Ve2<%yt9Z%V`0+>l0KL|cAj^Yw zQ=V{EiPAioc#}9^54!Flte*+bA`=7bYVM%Sn!jIhlx&&wY`D? z-dZXz^B9%_NwX!uDIFoLgQlP@M0LxE&3^Y`GH##ATU_mmC}afX@fj{;lO~e|bxO_K z$^5#?J;tI9buD`$!;I+R!bVTPTAv(H*@_>^y{$mY-JtB2=agpbqk+m&#hM`vYhKXW zj67MeRWagmZ}3SYoC7@$A*QQVnWQcTty(V<9k6bWh7n_voDIu2}p@=bQV| zUW?qv9qx);Wm-3o4s|fVX0nF%&R2zyJdZ8Va}3zWr(v%a?BhMNz*aZgo*~fs4x$$9 zW3(E(mF?pO$3AX=eGHv*A=p}S35K_1F$|u+CH=_G>eTkOjRd!(+E zx-#j_bUF&6Z_Lekec*7mq#>aIo;A{q^z8qY@%_uYdZ2$RA(e>|uK6 zr_>#Edslh`)cHt?fKE^m`NA1bzlX}PLXq_?d@IhICVu1U^@d%-o=coJ(M*D@ zlb;)QfHK5!3Dyof--8h$7Wj&dAgZpl=cISN3|u_%!=AKvC!Fnxw5xhGo1x(sRt=x& zv82?n_HkPL5!2dNxhvMtfxIfA{9d50JUQX-5H?Kxc1|bhVSN?a3K0qELT%x3IaDX<` zH_76K63ODq_uW!1eN~v&030T01&Dv|5S%n<_OIAzDaeH5rNpR=ZNvWRM{Bx%J|tVV>?i9pO4jVsOqjW7|6 z&sKq%ydlg*QH44gPT`%nIC@LYa^@Hq72=S8{}b?d{>PzCyw&wQG$Pg%psqc zYEsK^SUavc``^Z=7rsaM<1XSXXg||?_m784cI~?vdKdJ??rHmeGK3DUbA@HB{96Y& zhGdomGW$p8{usPByMJ^pf7?HQbAfQ*=E#aAA~#NDnSk6lrMZ)EDTKyviZViDVMb^? zlP`ouTBr3nI<3z>cQnh31-znt9Mu9TpU-|?vy5XU)VW`0sJ38E<)-qcW#!h0bqi zZH*V0(%CtIOz{5y*#m zMUOV2xL#dGzsO{GF=VYHt6?o!4G~fW*BOgianfuNy;(NETE})k*hiF}yl3$$<(Z$zFHR1;MFo40p)6|f*)3CNNo?5m=CR<5; z(FU?TsHdIF1}XQhBPLDkr5+wMv28QX+LC0%+-1o!ael=!uEo`b=s%IiCQWK%@~MDQ zvnTm$BR09Lk3-WS=^pL1Q8p7Vv4=>4L0|!Oc?z6>h<`3C0z|ctq^4ED>c5MlWscrt zYF`L{UF@nK`o^_HQJ(9X%5otsA zau2vBau&mLb!(^y`D`)E*Mcl6>^D6^`LV7cFuO#8;KTU{<+;D)oVu)Wd@k-j8xvfS z*3TTJ)ZVry%`h0A>?SxzGa;>HFvwHOiv&zH7@1*7=<)jW>`n_ag)2=CU( zP-7L4kygM+D-cL4$eN2Xw#UW>F)x84PACg6XMXfa@l}6JeAV~ESG}XUwqgJW3I)FE zfv<+houOC(99U_HGV-nu{qA!1ND}>)>8mr|J+1SGrFy)W4*;>B$P+pMQS*f)B*fa= zl%{4Qy8A-Ww|$f+sQLwosruIrRgcqS(?Qk05LC@HmN{VD{_w4g7|i_9 zqu+usnn5det!ZstmTy{lmD}_+r%o8({KozJH<82(k28MzYbee1|EhrUv>O-2>6IOZ z@~cf`g)Dp9u+H-#8MMvz>XmK!gtbO>O~nl*`qsB}GOQ49&2LL1$k`8gEYaHyoosax zP(7PK`V!Cr(R*ea*i8N|!y3JV463#|FjH_Y!cap<+Z*xFWWYj^*x1{yG(X1zczG!i z(se4BECldL5Wp|vv=b`6(Gic@N2ayGRB93sz@C7WNP6t~KOnr`M>9eyj`q>AA}SSf zxQL0EdQQgl=uJLq<{Hut=W#b{d%DEB4;UTeNNLjtRp4@hHmY8tD<+6bkX3?J|siWj$;v_uvf z(KZ?DzKPaHNP7jiO(cohU1{9nYEuJaHLU9$+#0~G(I2-xrq!NCfxEIbsn|#Eg`A~s zOwt{jGDz-OR)kz>Ml#LRsALOgX@{)ErPz;0^SlK7@hI?wFY7-O0L+Mf$bbz3V4HRA zJuw^YX;6ynZ=^xVK=IzPVe}V6fi$gA3}f=!NF?-P0+wLcT9FaEg(l`=IVp$eiT)@4 zv;niiR;-wkONCXC)fZ}tbM%GbA2~}=uvVTfAM-MhfgdD5L+|ET?!L$c2HD?il22f6 zB%GTn@R9u;eiv=kC(kk*kEX-l{LJ52rnhFCoi=`;kkA9cuQS&poGw?BqYY~s_l9{m zoGdY{CN-qBD=iO8A}!3YE|DW{HYKbAvwEoQ|aK<=SEN1260=4V=ED4Ccr5niB7sv@8 z&|@>yZf3)?K-ZdNrTH3{kmoCI#jA^5V(zuW zO3PXv$4qs_jipj#UVEU_gy+U_rP5fBnM(>G3mdv~U)JY7qR z?!}dXQUc4xwyU)nAKH7oxLO8t1L#i@(7%Yc1iyVY*B{8jbwsA4327)!7X1`pJzE#b zjHs4fq#`H%nNLJ#y`Z|$%dPeW%9Vy`4ZUxlUh3k=!t-yXQXE;h`y3Hj_{Cv2wK9zz z*x-W8RW@-9zmgexBc);Ia zee!8KC%8!e{ZlQ{)3b|oWX>WjS@o~=`8isjTgH6c`V5UZ-unFRn7_yR+%fw2>vQB7 zXMNJQV-9|%)%bVz4=DSQhAf^N-*XH9z($|&4_r4pKkfv>(grX5(yYU zY;kny)=n}@#gRcU!CtVpa`0{xCn!JiSA^(^Obt1Pl%xY#v|S&Z;&M&eGluZe4mjvw#MmgJ^6g&PdnbVC;+OHl{KDf>5^!gvpVLOk8H5_aGWJYu8j{}IJ;_t|FL zov?lUVh|XbNCP5hY+>*HWxpHt-fKo|ih*2(xcePszjukvJ@-4^wsRzFl<>3)tRVAb zM*J%;NZkJxpnWOgM8BJe-?Ld8N8N6?3w04hy~gifc})e|PyAlBZxZi) z&U@-%6MdrEi%@R8rfX9oj~|ae5N}?ylIq$!_qln$%4wW17~}l=d<2u@x|)7ooFD<= zVqd*|$xdLL>w8iEho7+iSW!O{-&vzFpFc#5$)4r3bt*09h=^kz63v!6O;zUvee4%^ z^okca?bS<}_IkQMQG3yBd;X*3PKQ89h(?*%j9ep!tc`&ugpM&OU=8hcABt&pX!WB5 z%J*99n%Ph$?I)vP{g+|2)!{g#RT6TMiXvxWqukP!!7`so9eJr$_W#;Hm@or~ckaG_;!Rf$TKj&RbluoY7A`*J$A6dU#Gr zLoKvqvOeP9k{y+1i+%g)>3sHvKQjPKCG~x%BpZ*-tha@{O@Ysn+es=KA4d}L;@T0G z8ZnTjHGtNNeKz*Q(c;M*5c`@R>)g3*WOA_GOT);o#NT`nTPec76A+1*|V2wuwAPJHwLiV!EdmNk4qVO z>E?nO#>p{usRJp_+82YiJx&qs90b(SA2{zAHa%k`k2N#)WaNv&f0eZ_lirMJJk->5 zHBur*qT_=f`Qe-;yQ2nG^Xj0}|_K zG7dEm#I!KID?H3gpf<<&9dUkR{BRcR?Dfc$YaS1If@HHh_2-*E~3coR1)Ba#1eRJ88(5yEYSDcQL?)@X4N~TeD?ODg)yj z$$2&qir6GYyp}Cte1NwLWKx4wBmYmjm1k%LkwJRw%fkG>*)1o}B%K^~^p}(4#eQF^ zF@yA*E#V=kHp2>zXZAcJW{#HuRg9sU3aDr`CQRWszZPQVBEAaLn?3|>-HFcU%m4Gg zXFiYYKjwT+{anuH#7{Dxz2!|`AqRf|O{sknD;tMcKTivt1}}#&@s|%aAK4KFByh6ZZoEtPTk!tXOh zW*FHFMeHec!uM_gs4n;eyt4uJug+orDizc6AU-k}{#B|U%hO}^{Jrpc_U#ebxp{^K zPiztXN%t{_-p!B=a4z&QMXsBd^#L%<)abq1S#!7g?ZKLkO#%j0^p7LguPfE!b-aB!0CYm8THxwHLFfs`dFnKO-B9rHZjeSfW=Ff9;J$=4( z?Ef$aJP+Gz-h!~5O;C>`Bg1Ih?S^f)aJF@(Y-&lCxU%d>+$Ee!U}%3)n(t@IyG~6@ zSbAv82?!%xof{3_D+1FS($Qd#ec25;G5@^?NADFig@oh(QT9YH!Bf>in#LAn5fG*5N} zX`T$=y4?WoD*`wd5(tDB{#xcazKk=h*L^5tehq_9qriZ1j>}SITubmoW1Ra^!2UI|(r2i- zKS|PXi?-5{&2P^=N_;;g5$71?k-mjkgbpH48MI(HG>|?C1jk`Gae<$)p)Z~<{0ls= zvsC*@6~`29wr8L~_`<@%7nW-Rqkpg1+Q9kjU#&QxsKZ~?$MPu@7Oq-9qm_ntBW^cc zi>o@QU=!&dT(I!~?(aA|P^H}Q1C}5+;|TQ+aFAdlS;M2*6-{e5?dw*E!W#3D)M2?y zh}CGDD)MAFsV`nUig$~#|B+MsZm}^dQ}lQ(sVdWadhC)4y?Scchm0;Kem7R2g4PVu zAvT$DQiKlfr)t`3k=H^03o}m2OV<5u@O|fYKqa1&yBvJiC<5O*cYShvUpM`8g71^`ho8D+6pPxLA`TFj)OW;>y=nW zZ)&eqCHoI}*NdYZogOZ!`<&3jM{j&8dU*QKvFPC__haqb#vGUN(slp#-WclreKjyF zxOn6CqjB+D-V|JX{`Q-@(B0zeq*O5Q>XXKt$1AOZ-Hyfdsk zQ|pK*W~_mqW2N+WayAD;t-wD(y5UJ7Y?w4Y2NWr`Uk`dG(ZGbK81V))?WvzOXWwIkk54De=lRBo~F zc?n{rnG?nl%600S{*-;NU(d}REM7xJLPNv5jR40lCbCYj- z=Djl_U9FN-ja4uhqun5sSo9G6V?U6`&s-#eW_s^<+41|IbmIO0`h%nO|MeYc>Nx#p z{1f(mFxa?%w1@}d2q%v-b8Jwc&s&?|Jaa|4-Yy07g+=jpMsJlVpYHED|*;Le#BAL)&Oj zlMdQUG8<-K7K8Y}T9tnKrBrQ=$!_uO;OJ@?*o&vEx#Gxa44#>zlC z+h;%3mqt-l3Pm&VPZ6SM!Iz=tb;QnXSCM(c`2||L;-*x1N_2~OO+m_KSOulyD09Vz ziS);Cp5$9y7i<>)SNev3ekQGNII0g#>fai>J9QtBF2h}yx(v6+VC{xf-dcQsP8~oJ z%CZMjX4$l6REsd(J=BC{~yK zWEN>YBW)Coa}S$AAKZQm8njN^Z+WFvOmWGgG(Atus!3f3$H`(mLT5wd0}Q~<%>?^2 z7wnk`_7sD40`j@%jlUf^KKKKo3qCPxuBZ~>x}ffThilz2@!RYFAMAPcTz@=!Ud`7Z z&z{$Bu0O_}7cB5V-W}a9r}w;Z@A>KX#vUoou%Z0iVMQ<>J%bgbOamx>h4qoOF1adD zcXi|LSSz13$ zKqB8sv^GYiUBrRh~C>Ue^7_yA5+3j&BF`<7&SqAJqN8e-OMsfnssGwb~J zV^kTo#r}8)a?P<&j@4iu)z=><%V^eJelpaH7l6?B3R!k~2v=jAdF-NH{31pBob*Mi?qvpcoc?!cA-5O(l6U;?|&7cB#}o0C}C9zOF34VXIA9F&@e0VVGP0S zg4z0xwG;L4h+IB5blQEr6U_}oa~T|Fye+4Rg(l7qre&P3{d0Ztu2;n4=#$r9Gl4$& zUDB88uc!GZI(9?L8oMK39p##*eJR(3(*NTnL_Tql_6Y`XS!&n@(5_@T7ff9bl<8_p zzOphutM0fvxRi|6uIDhVU`K2bBaGiEdzAI3FF0cDr zSoeJs)t!y%XgJ`6viR*K4zG(>eft9nq#bA~56Ob{;e+Ix2Kg3fOf^P!|{7{EXpXQue4)RbF-dJaw^ZUh`nZms?3 z%h>z)`VV+>P@j*Fp6Dc$^tRfl?PoAfa*H^|A<>qVdvnTq-YfG*e8j^_bgSHp0>PL{ z=(c1VVQZsdY6YrUmQUJO#MaEE{lFyqG*;_3%$hE~LG*=TF7Ghd-ca#J)oa6Sc2H*@ z$NrHMy;!qu^lI`=fqFobWLR^~)Y(qE^9_-Vi`O7hPBzT@10LfRaOO7p~$jbI%7RL-m_=mW=Jq(UP{H;ss)* z*H+k8#c5Sy{a&TFU$=B1g~<>X61p_Gv$g}P^`p=fP*}^D^%lzSS7$1}vpc5&wu&9q znsZ6>I9c4FTuO#|8WL>b2$V zVv%z{GW#-7b2djmfo7qW{BpF5{ud9*gDSrOTtn@f=Nd&S?omqf{9$XFzy7{3yCvvf zV9oKW)(?*w!rn}ICB&o<6N3udT)4&AjCfcH7?9tR9zdZ8P?fN97b|SqL%Nmw(5gcS zO7sjED2kkn=BVbB;@yKMI_+$aC0=fN2YrQaJ1vSlwf0HeYOg`FFH01sMU`KdR{tAJ zZRigXz3D~HEl%+L=JHi@sC`jCwv;$VECDUu9{opg0#((Qk3&xLrI2RuADQDnpE_ae z{b%e2U;$`2IG0wEDm$dI{q~cu;c&Yn|G7n2RbxVB@1lgURF%}diWTVcnJj_@ zeI996-bWtJ1MRgME%ASNw#1lhgRi;SeoNVg+-yhP zY~+IPM>HmH4=#b#;~5&eH-Hisd!31;nx%`1BR+s?gF{N}h`09ZkXL7&I(tnobjIG_ zWuk=X1?8}iFd>YphEU>cUZN3P%0wBUJ4s=AYs|dK@CHS%AwRj!j_5msla&`2r656_ z$3z?7r)`EOz==E8+wB}!y$uQqDnNdR*0lwh7lF5B{!`QYeW~t2Mq{u6Ak;=qfP2Xl z$QSmBui}&s10xi`ff2AO7x5)CFPN5o%hA{4?RanlOLMjr?eR}zz15lR|GASi#h^WXEKPkHB{HKgw#OF3l!vKOoD(9xX&U#D(H4~SmYsBX71tDnj=|mi_Ni(3m7rOMZlIVjq1X1xbHsY+m`v!>-O!if}d~YnrQDz*sKljg*MulT^?#7YXEJPk`><|ZTcRiXvvhXwW%BSayhktGrwd(r za?qy__i4%Zv$W)US-R7@z?%JQL`(JB{Ze3F|Ne3*p!)iyZzSt0p@robF~#upYplF$ z9y5Gh^Gwy(1 z0VXxY>@-d23KzakXoE(IQ&Zshu!*@-$0809hKS2R8Xyc2H;ObD zWLt~16zDLjpBQ-H2zTl_bDW?Lyn0k($`Aux2YRs&wNSA`gYlrkhC|4owgT-)=hrj? zychr5nbSS4dHFuWT+(HjOFI;n4Fhe3!uCklZbrpWXeBCwcI?-s3z8snk~V1De(6S_ zlqrS`J#)M4*PKm;6(pu?$hXLW`g1gvD;w6VkN6ON&Hl>{K7>yLkw=DMC(0VkSTOu# zzhXwj!v=eh*q!3E!+?&piSo0=F{RbFqBiNw2(o$H)PVtB!fh?!j73{d8h6b$jv=XO z)dyOcXU<&LYO6lP!i$|S8-W>2#a-+b!4fu%k200LA8vG_Q?0pG+NzD1&_(o(t*jHi zL@qOcpEu(`MF+%JHF_F*BH6%*457tIGW11LYh#l2l;lxLijb7hU3}J#WlYC?uuOXf zPC_wPSRRZSJ;j*?bFQVBXs}DECCU?07c*r zF*S%+AwOP3nc%xY&I?=&hFCjHreXG(Jq5-Cx^dZo)3eInvx{Jc!Wk7^&wmRzXzayc z2juXwJ?&~Rh)t`zMP>blbq!2pfTtd*;T*agwll+CO7fj7AcT3PD=zZagT&c6kBJv4 zPJ-pe6<7fPwmas@#zp?x_Z26ppj6URyLDi%Y@!HI$+uzF@iNM}3;{_}UTu z5GXfx$SbYEWiAevD&=KtJhutf-)~tTB9FD!R8i}#Qq-5BMv*zcLd}5 z2eaq{xza`|{Ti|xki!m4*k8B2kkMZ|u)lEYaRJ0)-m^9K7TWI_O+R}yz0T8bw+kQ+ zogQU1r^NOe62uUMrQ`X~wqy5`Qp+XHDnG2FcHI}{u{m*AMv8IVL7Aey zYplc*`2-gR=5^BySE4Y#pN}_}aOI!1ndEo6_J{^sL4F^+Ak2^3I_!7f$A#B+gSDcA zEx_)N0r!y1Pxg!OJ`77MSTKGqm{t{EzTcy*E2m+C_DVY5w|5Nz6^|f0 z{;WB*r;3P~aQk*b{9-9JZC{FCfU-Hu<8IyWf6CJCu`izh_)-LZ4E~P;zh@NwGt%(S z{uklTn7YSq3RLN=6mJu+M`B<$NE&En04KgOsi_lpgJOGgK-#X9n({m#1i^q%dOuKN z?|5OYq2n#X%!K8bs`mr_HDrlb@)YO?^ zQck<@>DY9*g@p-m_a@elWu*XxWE@s3Dpe7D1Zb<=j~Nw#;6|rk<3Pp~{CEVn%y_k# z)Y6V|IRfCYQ*M6iGm$H4daz|=CA!JoA8W4e`Q9;N$E1rnEI6GI8!ljis=nmO0I2vO!E**6y+&yVn5p=dT10IY{>pYi^#Vc z4oD5Bi>?e75OF~4P^_zhCqsj)Gx_5QhN%O8)QP{r6ZoSJ{80z~r~`l0Ie$}Oe&szn zQk-zPfGWHm`K}5BRt>SFAs5!GIG@R=b&?#wK0Du~8E7?5eH=gKR$e(^L}lV5A-T1- zG*s9M&$=vKK2nRNgwFiC65BYLHqCAn(0}L4$W%R2<0O20u?)fkA^I>PEh~`Q>P}=G zP9kKA4-GT}3uhgLJLvV{fj{~vRX}R|Gjas^h!lI;hj){uhF_7OM}T6_o-Z{`9yh}H z=o;S+>k2P6!<=j_@M2FZv4kKe>rSvVM`3dw8k|JcZ-(&0APv&u>Rg0EZmBy5K=rc@ z#e`&jOa`HcofeSr<*wSd2M&9&bthu$_IU~JDH(8o=KUw|niJwZlO+FHgYwWxl&9R9 z;{(WX(QvDm1AaCKJY?p&fJ2A?mv`3g8BhuClMwDw4)@7YW7zA$J?H-!?k`W^GTkpJ zp?fp|kpB2Iz`j(Wq5k40KTA@eYI*eZe7*mO69M@vL=O}kG$^*yr=lSnDDWzdQu-TkQ?&`9|=%^?dX159@IYO}s@sYHtQN0%?tn5WysEdvK>~2#taEywOv+SIU>s01YXmU{1`Irg%aA_!RD^7HC*81ml-35g9nptXn@`g+ zL^EHcE-=g|Xq&u$%|cT5$yTJM4xJ_3 z^D2}&0_4z>h!0jyR_?dMW;UA^SLC;9rz?eT;qgsu3c@9~)xNCDLuc-ewN4&55n@&y z!UMNuH-jLg%lG?hHNy(ti<^gG`Fnx-OLQj9w`K*=YU!mfxqH)3c}E+TYN&4B5zx&X zXu{#YA9BLx_h2cW6Q7o&(ZQW};1Zafte67}rP#asM1F%T3A3%V|qaP(S_Z^p$b8XiIUE`FndgunvAIeo)|2K$>f%)-sE0Co?R%(zx!38A5b{;sE|~Ijh8tv3?ezrryzE2 z1ss#}CWRf=gq^y4jlXs(t^ePq6>1JGtp_jHEpeJIZ>rB}J`LZ$4iZRYn#N9riVJ~< z#KlR}F;1&yW@}C-tk2yG?!^h+oPoy+Rk#ni_*l@#tY2;)wWmh9Q!ow?X-jnS;|UA0 z1=bwmbeM|N)s|-P58YCHy4)_sx;=D!iznT>gSN1Rl_W@)Kt#_6_>Nz3&MjH_ju*Zu zJvJnSh)>;YcoOX9gAbS$kAumvNzVt62jpKXPm6saM80cS2#Tc!m&5w4u_r2#@2lH` z1$Hi8Cz(QqC{s}<;I>;IAojdaNAf2-h>~AyydvK3n+2^z+oMWFsk<)%atjUPq6 zso`hdAMm|&^!pC_en!Uk>T*-O&`H2&pS-Dd9~w4tch<)4PBCts*40cH9l^!~=Lfh6 zF?xL9GW-xs@@!z$K~DinNUcDT(oYfw`=DAy^*= z_$%&Vn?h{s@IJN+a@J;r*t>)CbZf4lG^6yd$?dh-25S!&w!@MW)oRWM;V^9FUFzmX zd;BK@G4=MN9YwVm=E1Jo570@F7LqpX4YM0OsF%~O4}ThFSNrvwH-;@Srm`(_&ESue zScwxkQD@ya~!!WOqbr6!+JA_k&<^sykn9{r@STPb`^-dTSt`y#~l$&ZqpUN>vi7l^M&FcY0r z8MO9|2%@AH5c|eJ59#935eG+J?8V>^Rn#zuZ@@l0(Pc45kXGLba;dx`SR_4wbJ;2f zE0AJ1^`WLLGIL-yKH+0D7w?ZJFZ3BsOS_$&cC9fg>lo~Gb;S2)< zUuR;_{7(Gv;JGT)HH#g>GdMDIvwbiyzF=x|qZjQlK1=XP54;U;@{4@=v-(0WrHP)X ztUBrm;O7}M@Y~o<0Kygyg0Ss)r8PrG`Jo8nL4~rhDC;HwH0lqts3(Ogw||{Y#hX?3 zmdZ98@}Al(l_g>2XoZd$?yVZ@#^L@I80+82kT)hC??A&z9OkY1@MrqXiLjNsMrA#f zruZ`@RysPwy*R`da`IKoDUk{^(t0^Cgl~YX^)206>!UR*4DT)&z<5potF5pK!N_ zuR?u4PDX4KWG;fti0Hd1f21m%cRcY?S*xL}=7kh{%W;lma3S1$4ZIBQhG}LemomE) zlAJTsY|H#-us6eIMZRt>3b@KtOF?Q5Tk)eH(Q3`!l^*&pRQ!=XychM$w!pep;`^Gw z>rul=YREzYHLv&U=54la*7fV=J$*X6574?fY~I`zHt*>Ov-@cBDjK&w)#RjR-Q-oI zM>p#7p8B(Nc8O-qI+M&Ry=ME?@#DTJ20NmogU3rWc1VriGTp)Rx3$P!i|v9nt6_c5`x1UA91P3v*XPf-@`5M|uKzPH@#HJ4IYC||EUL=m-#O30EMw9( zxM@!rO`9C_r;;Ps2=W=QVw><12kK=lB_EQSb@9Ge4>@b` zqCb08WpjQ312T|Ser35{c=xMJr1QRd7(>b`2N$K%n$e|6|9av>C+qfL z7YKeuBrg0O`&DBvt)++cxF@x(wO_hF)PaBe@F#4e!WTOnX59*VU14tkP9N6pa9DAk(432~%=$dke1)S>a!x>IV6eB>T;51b4lzCuf-VK0df)o+WY> zJk(8?XXTOlUGZjn_)qTsQ6VM$DUJgm2l`Amb;3_-W(Znx@8i0BxGp~>zr%cTn&z~d z>hp&ozV?&nhx}CDAO3{r7X4IYpC9Qj1l+CT`6(WcXUuuUg@$>jAAat6#hrktJNw~h z!*2+F{JbI~9sB^1cY@S@C$#gL4tlg=xx0P3>qkw3I zJAfQR*4%ePtW#-k2;y-DiZ>{Z&=Kg|{uJKd%|Q^Z3f3quV*RRB=7aqH5Zjhcd`3EP z6C`Hgzq3$Kmpc_{Zl^A946~yU+K6;o0}WY=x~%m&ds}1sUH!^%pTgP~Si%3nLlq{j zG8>Va4Ef#q^Pqb_@>BoquuuCVXIZCfY=}{kdDb-gsspbw)!B!2r`-Vgt)})VjX_1` zuZiLR7?Z)ctO=kUq!(|#p2v%4=TKnHn^kiVt3fry;otmY<{E?`AABujC z>vp4-ISV$cCb0oJzdFT>+l@zj((1_=g3Pfala@scYtG+9LOL+6`U03JKIbjmiY@&0 zAKYn(RAcc_-f2_X)ftCzD2&Y-9GCUq{@@Nuyn>p_u2`WXgHcr;fW(wnmF5l@@-4jT zIivY^+UJZ`y&|LPX@^ffrt0xfzyIIkpoVHc$LuCRPG%StE9_{(!GR+jDIg919zxAe z{pnAC0-P$t|6nai+h;anuUTT5kO29?5~)g)IvD7ACeDM@?lExRnyQ>EFNJ1u@SQf* zye0oIYvgpmABdeb9=eo z=P?iP=Etx|x&kUSY@w5yBEzf!c3uPQyaw2L4Y2bX=;s=YFM(f~YSw5#Ab5lLUnr-B(c+4JRN&A&u$XYogLI!)a4@H}MMLZu` zu0Ts~Z0Bo>OY!6eriF{iu(iR$BZieV<=!bCT3Bb^*HD-U6V;WX!g5!c^ME;ZqWXu{l5TMDq}G;E9pR z&Su5gj&TtX3-4X7v8!v8=d!4-PJ2rSN@7>nge*1aj7I;}jaHr$37eZR@;3;E6%qmF zl{Vj(9wNVY2$PFv>3!aGEr~RMLu+^bHwh||Gt_D>$ zSU`RfLS2wj88DQ|Nw8n2M)=EBEH~^!v*l-72GdgHNV2yhIst zA%kGB3bYlrnQpXVj&~IQRUXKrjLTyln@3@vN5^T((j9r`$>!rf6rj;t{kng z*IhXp8nj_lmfk>@j9BOnh;Anefxs(v`v9&>Y#@(mKuDheA$0;FZ6J3U+c+WJLK>3c z4fZ!4!QQxckH(@qaWLL8cn=i#J$yCHXKAkp#?KwP+*Ws)VZKP)bHI;tFpp7)cQA5z zxiADCfT6I)9@qr!weI(#PH8{xN?{hXng|&fFHvO=BbBOb4L*2&`9;Y;OJ8<99N2#FR@W7O>x<_)870|4ylxpAIDxH<7BkD0#;e3SzJRojJ)GJ(B;p- zd^dP;>umMsN2*^zfyv-H(a zJL#x5wPj;ibB}7Q0tAF>d?-Mj7G@m=YoV*3uTyV3U94m9LUMMSqY;&uWcSkGBvNEQ zy%(sV0|kU49q(ZSSJKUFSoEER)-uyBbD+DaiLx{Gch@K2G!4r%hC`ZF|Z*0%r@c`rouxw`XFVxFgkw05=zKCA##pCB4P3LPaUSY0Ig@}Wd9U971{@M z7d&ZvBY*tZ_(rPnTQ23Y31F}`>1uRvU5(Fv1gWiiL@Xswv+}SM`wF*+Y@Q#OvKqg= z*h$*?akUr){-hm%&=CsxA#@avcpj(WU4%hmD`q~@?0OIGl>-SaIqrSn;?0_M%5dG; zY5nzNw|yY#jbvS15NrPENpIwYZkvLGzHa;fzgH(|`m|V!$oFZa)luM)?OF1jXVb<@ zrhXa>6ErF3Bv#Jxp&5(Vh!_zrO0-H%x+uNulRKgppz+Zx>E&`SyqtwE+3tn@-62nbTGh!N5bMKN9u(Z5g8ra|PRt@Tot}Kx zKe-PRrUC*5Vwe4}=4@C@X4wyr7_W%Hc~#aGVq2lVzeV<5H0$D9YtPQ$&*dg)y<2V%m{k^_FVI2o3=)V@iU7nI>HMeZX@FpBikR)w3QJH}oLwWmf@a$kUpDuqPtw!4g8m_~+;a`A$r+u;u{Um~ZU==b}GY6fk!*m1RPo*i91zPD%{z&z6C~MopxcWjXxPa!<;X@!Y@%@{*0WH~2Qo`59 z+9N}ingxEYK`1zJb+VIAEcfB~NR?DPkwG@*EA>VMXeBEbOBFHtIaBiG^8DyWxW&rK zr8(p^;a(N)yzQ7V`-A$Sz23nXWY;+rio3-IxFu&pX z@d+i~=&y0-#S$msp6OuoC=;I0{tQd7@ccZq5e}`eMHcliU1y=j#Ysgi=zFOK> zh$@JGrYJ~SV)5p|Gib|WaO!iYXgiooyBUL7Br7YdOqA9o6=_`y{2xn@3hP*Xz!W`Y z_%Ec(+50r>F%}4Ki*=Seov+)> z3LDXtg?ELkiW7RNIKBQWndyz`Hed!86bWFpeh1Am>9RPz_8+jqh_(7-j!^rjG?vJE z*QjMd-UsiFYfpfb9Qooj*fr0hs0k$@x~$n9=@Nc8VlQYDqH(`>Rfu&Le>$M*#fR|V z4dI)=cwQQfL-rH2Fdflw_5ElHg=`E8>i~swcEEZ95NKWFMb+75Blc|%xs5N2!?I{@ z2J&7{Bd_?cnaG=yLLTKWJSM-Jj=h#b-e-TIDd-eL#)J3seUOIxU8H=87Uglr!;<>y z)Oc8$ru~cVPmPC~blmiG-12nXq*PpNB~|Z6@4qi&=q#yyA~kfD+Hc%PR9jaF0xwHp#0^1Xm!wCW^&o+~BxA(ET6V;a9vctEj@UOG z6YsXtw#y$R+gxN4fqVpD;3^8hu$}L9X|CK$G`ECGF>iy$-BY7mb2@>4nD;=F3G3F? zM1FUS*dMYq`OI|5Zz*QY9J|l1C-PfDU7JaMkpJmp^VjgSXbwG9LhWb?%g2{+>#-#) zPnEDVT|!a11Wq>N3i--0g^VV}Bk9yo7+8mVq)nHjOQhA)j;8p?@-f^4)`fTg@ZA-B zs9ZQaQ5D!Uyi}fm2Bq*fp zZ9?_A>FRexKam0Pl~(z-5%)-FnKzvAHb^_I}NNqE64F=`w&(Nb0qNiB!(01y|j-% z+5Xxx=w6V#k-FX)OI^pT7o?^LsxWsKCse6v7XZ|U>!#|={e%wI8)B`!A1J*x-a3!< zdn+xmob9CRbCp(ZIeVRgc#TfGxjW4AdeAw>xlSTB;$QI!hEG%2YN9OO9;_T1mESt< zJ=Wp0emVW)tu5S=K3KdP)^#CR-ofvn)U=horm(hN8vyCYyR=qbmBQKq;C>$5$b({) zc5??vzMWd^a!>TD+y!zIEQ`o)G+xWX9vmr7?AM-ZCy41P2)o>AjUDo@_&KWRj3X8E z0p76V5zN^2ev!gpzUijxMQDK*&y8^X8-it?0_cjKfeXwfad8Tt6U(p;*C7dBM2}AA z-_?cQxVZ4xG=Lu?xa2t`N}{t17Klpk0MKGjKhXct4yh@jp4(wxdL%XJW@g6Au6HW2 z<)S}YMAZOeUkIRJcxhan;>AD>1boNlg{AqGkX+&5Dc-o3=TZdP#KC+@R$LJ$s#S>I zjVYEB@HHxBl$x$WX>Lm#&o;FqIJECNrTI#ihQ>6RRdUpw5*KGofDt_0AhXxyhbL~d z7+r#^Y%Jnj7yAnd9>nrQ83Iz{FKJ{@PdoxW@raxL5dnS^U?(<`9lez>OPQiYZkDB( z-Nou7zH}kS77$mvp_*3X2WST9fABc$uXw=Brl zlY*cm6`O;xqMIMX+2c0gM%Pnm`;5R_$OWd3x?f+Qn?1G<2PP@svH4=`pg(%461ykg zgO@?7@OVZmmzr_|O57ix6hBF7_>m9EA*sj})1*ecF0HhAJp<)1-Nz0Fq7{^vve8j0 z;8T;DL`{i%;yLkbST|617@XyJAyw#5z`!dwobl=(^qtcCeh7`(SPgVJamuliD1nlLO zQ8iew=EF)fF@;h!o}KQ>{9#=MUL2cgkj1j&_s`5@ z`)3Gp*KRYowYMF*JU>u-fm(_zWD3@=NIy*|R@v9d$0%Tznx73II|FzPD$FYUdx;Rw^ma8qdMBkPW+H5Dg(iKZzZ@2>K}UkJ(Dxd&~x_YwNjn%=|iDUbs3n zs44l)>_n*D-xd3u}t^)-{ z&QMCP&yV0l=S31`t&yx|96a&4K0FZ<4x(+%Ed#2^$Nu*;yafq`7K?O(ONEZn?}L^v zOjXc$AaWj+pHI>72RL%F9|)4QA_0%qg?EjF5i}O~@<1Q(8RaG94+h(>^!`I}wo^M2 z5WhCW?h)Bw*qZBv<@UPSs6Ww`L4R$!)0Uz?f6oUx>(HH!6#WS{ zumYf`5}IN3hm1n>rWnQd39R!4T=ur(ads@}19+69&~$j}PF#Y= zl=!t?D8G=(Kg(qm(LByy3!;-by9kcKd@Ly-I-ufp1Dk!gzQ*=rAlB|fYkg1?KM!>4 zJIebNt5tyHuxA%gg=Gi`epQ?_--s3}cs7ZLlxe0BMJx3RG7{ZKk<>%MG)$TsmGXTMrZF2=@uuKOgVa=jz*FbJrp14FYVJITk8^6NK-+cVd z2l-CoF#?Z4E8n_>;RNI5^x`Li;5{w61HXH40hAKaM@tZo?LXzPTi(%Q%k%N_{HgLd z_nV2_uW0o2B(+)6dc6H}J*_3D`~0)`nobp+R)}gu?cDiDX?WcP?3vBn`#G*%JbL`1Z+DE$I}(IB?V?M zI@twrGeAaaefUurRsWl&Z~>;DZl8bifBH z{Di?faIX9J2}**Txg>d{GVqedl!4*~lnhZ~MiihN_}jefaW!R;td5irKuX9*N+>`| zn0btcW>>yVkpfq$%Dip1S6lVrkOy@&uf9WNH!L&QI|`W%L3;zRGVKVngHZdSFtb&* zpLCe))83>+y#mYTO+83Z7%0?re@sgWsgsL0>fAy3RK^^#y)>`2s(_>s`th#9r9lRy<{O*jNR)Io)2KNO^~9Z^$H7% z+%1iD@58RPoB3v2@gr)LOfUnp?5?`(#!qen3w3vYB2O&RQ0|(~TjMAdo3>2By z3`E+DFM?);AEs62>QCr+OOub*ZqZou3Oa>RV)u)%-rG!E;$95COg(W(18%BGYo0)9 zHdCLRGE_q+l;Iz>+Pq;I{O*X}PimQl6~4o;Ld#H}Oy!!T2pqpXcOhwZ4WUqi=Fg-J zp*vJu+?0hGj0Yevh*^flg;BRt+Mq%SY)3U||DN}0I_t?^nqD;-pqEzv0QoV_NXpAd zLIa;sr-W$2S%Nsuj?QGE`@?J--{xA5eTc)lktyJSy8P)llRn`L{3p4v>P67CZb|8!gC64 z4E*s!zGM3N&7!-+pv|)m@+=m`jU~h48p%4lzC>qrKw9@`I>?hQ8_rZ=JN|j*3rHTY znuy&EWc1TSo8kjW;M2I`9rhi9USh4%qlx%+V*I+?Mqv8;AW2*iO23^Sz3_lfjLy>7 zl>xRDXP2|kv$YmW2;{H2#HkISZUlNok+;--!dih{U{^LK%o_tQVPm0S&AKn2ZI4%; zNF#+bN7~o?!oxSX?7!BC@QR9hWI@zi^Ei>oNvs=2YGLdHUu1@}C2|h@0Ix(NW#6F^27IJUa}N9hr1bz$p3%%pXyzp}^AZSj zY28T7@kX<(x!%E3VvY|(zQM`FUt^Alo;C>D_;1iXW&4`-9*=9f{G|Uaf2tJSl?4u$ zb+jW{6dUnkU#xkS2qlu%R>1zPh6=7C8LwLIh|Gflnryyn`SRt;u$}xuNU8U3nWD^dN5Aba@%7PaA7N-k}H1+BDUMNloN@J26{Hgr}e z2mEEX2YWX&QbXv7s zHz|5*Ln1n(twQuxoA+c_o45I^&ALg0SaR-|lB0!KT=Xj|?-4zb8C1;aRLoQ=W?Y6B z@ZpJ`2ko>!KjJuY43SWuZPGLL0{->a=A@Hj>pT*_#b(XVhq-45{5F+IO*_>%OyG8n zP5YX)q`}P-AUhqKXb=*yMS)dcAcfa`)nKv5p+GAS73e*I8Njk{;i$jVtmk_`hZA?oa2HTIUTzqGIixWUQgsix4BZ|G9O)y4a*-& zvD%JpKgjK}1Gk^4 z#<`JpHGX@r4F9P3N8<#jf0#*tAL7*5^dcv~CLj!uFClr!Z9??4vTq)ZW|e*O$T%WG zIW(w2k`txIUqghl@~9K}cBtV%6r|DlVgoQHD5bqxuE>sF0--ht!BhvKO%R$CJ*Q!F zv=CEplB&q2G-idLQkWIvNegR=UW&CuFNCldDNGlCcDne}(#4O@{1iT;Uxn|Twsq*A z(HW$F+B1&Mw!^P&l!W~6jiFA{?kEj_TdN1 zNEAfv{+EE+Vuq8;pi?T!;?XnVHx*x$khE^ty*RKvL>4OS&Vwm)t|}WbL-*tOxCyr! zpoHtoN>&67sqqSYm$O+X`2dpC9p+^GqDl?8DZ%E8C`ne*#NGQ&dqqA5oGs_Jpl5CP zqG6~2L-Q~c9B?3kc~3r;Q5N~GYThhTMUm6-QBITEb9j0yg_5Q)(Cy_1CFKYD&fFZ^ z>q}SOOcE~C>{gkoE>#&;^{5vc2K`+M>?4}*8U$G;RaoM;Tx)%DTdkn7J=8X;Ta}M4 z%d)g1gL$evvP@(<1}D>TSV%rBRd(R9QaP?ggJc}Bp(i?7;dhc6dLmFzr^-U7g&KE9 zZw@tXjxKGl5dH4QDb%Qj9^R}2gz|guKd|e}#JO#z;5G_%JTeXU~2)G((VP?zJxRmq`Dq>nsO zyC=3HINO7!lyK}sPQv!F|{zMvOd;U*s2!qQVVxIrm`-eJFi;YqZal&R@_q9Qmx3X_nr=aTkf4I zHH|;a=I_YvDXxqx&O>~4NbZ%4Wa}~fCPUSpG}+$J@yZ-sF|*buIHshA658F|Ej4_D zb~i`Psyjt#Ux~*vXW|gRKLcna4Ev$#E#4o^Z#vFO*_0Ylrw(TKDyi`;3i%dDjlC2S z=E5SELLy9(uTUs!lGOM&3T2-mH9ke59EkfJg>rSnx;|HGTupB$YEt8J3Z0}%jX$K2 zbfwgI3yuGZDKO8{sasicuODx7RGgd&Or?N=TOk#vK(f5lhf`C5)7%s%K{(&6%!9}2 zW@P{#XW-sZ#hGTMC^g+S&HSN1cK=M62_K`OS1}z1`l7S=m6CV->f|nnn=u+JaD%bS zzIWN#bf0A9R=fhgS+mZn|5ob$2rNExC#SEwq_2Y!3&)@m@^XFcCMow-HdiYiqwHfvJXbCdKi$@6LT^28j0PX^{ z)p)-aEv4#0QWLgna^JEnUGAt`pj!&WwYU*m>MlbgwQRG&T4Vi^!FGfTTeLzvJqs6Z z*{?`<7Wwsd$2B>0Y1WD0uk+uaSO$y|+|D`|}I%w4!joQP_)j4$BO>(^vS3Va>igY|Z)R zTA(p;Iuw#OU22+a{{}DfS=W0NpE?6rm+ZLqmmw31Fl8x?=`?0GM`oavO0HF#0z)Lw{j-|Cc=eDy|A0$_q*`Z-3`bycuX~}6&3b$x%XS#qco1@?aD#J#zyGwQXpcKR7X$?{Kx?zczBNhwy7=@kb@gd?V zh#xQ92+79^Te?Roe5%hWkE;S8b93~q2^xJtW~0aMpQXT=p#9zn+MmW3fuF*_z(g3p zBT>9Bv=r$O-s`Zu*hrxE2b>Ny2d{a%bg0QY>aM2v3_4VGU<7!@b}P~0+dzIPI^5;X zheVFTgyiVu7uTl8Ed!J|y z+LqcLX07Bt4MiYbT6aJbKII#k_6YYpl}Gy1cxZG4`dX3q)V6Tgm%47W_;u)_F{-O& zi_*&OxOGD_an{@i3p`r!M$K#p)xZBk=AX&95Vp|Oo)(3>$Y18-FU(;xQ@gx>pA>VBTi{(!J-3_#*X-<)z>4o ztw&vVZ?EZWBV8=llOG7UlaP=2L|{VfuxbW_Kw2UWBHYYlPgARKi5bwXpCtf^VQY=& z8GJm1_}7FkLr54xN7!mAfM`P)!oo|?5Ll5rH5kE}YZdk;UIpMveP@T*9#vX*Mo54~ z_d4ucVYZB^LLFkk?FEny+#3G;2<&g!-EK<3nh9Zn0-ZAp1t zJb`TiPE>0^ ztFne%#3Z{acPWTXDwGj`uLaQ6Cb|*dh=t-oYo!;LP)4vIZ2g9#`(+Q|^$kM+iT5`g z>2GM3iRi{Nd|`(Hm1*2Q6q+$W8!QmB1j-lF_9Kw9Cp}p9xe7Z|XOpCLeSrLbD8dYW zu|Bz1U>?lBSY@B`UST5up3q13i`eTb+iD2ijUPpHgT1Aox&hm+oU;=8kk8^Ip;MUK3%Y-r(f}lMIbQZD0_u$W~jpFitr{HZ~85w9xx9JDZmW0fN+4P zvNK6th4wd)$t-aaLN_7{Tc^lLY4zE3xMlDTE`h#<&inPMLyk_JmxRvSj5Js>+8a{i z56IppA0ucW1lf;Pyv;u4o3LVBwGsJK`ohIH|Hap!CwcY;R;aT9I!yjlFSHfb0z>{@ zQh{a%*TPyPax+Yb8S_sM=_jmwC+C7K=o14m_5nHXxkzg2QhIFqd`|ZTTWHgv=NOD38l2_!vG#FdnioJTB?IW-bvBZ1(f`fK1-m;>S~t?@ME%y>8MH5| zna>87yKJ?_%eQ@&!n5?-{^-BO9DkjnupwXw){Qx_cSq#?kqgN_R41LLeLO;jyc&mT zuxus6q&v|=Df&rRhyxQng}QN=;U%7-0o{cTB(Zm2$RWPg3&c`${~<>~Glm)W#Z&Xk zT-I<=f@TtQ9(|=aI?pIV`|!Tv9))#O6h27Pi^@8zkRv2f?;RMZ+RA4bRh87Om8Ow* z3tlYvZ=~cBG=LMpet_p%4}W$MKwAxTXWCoNu7WwlolLaUWYQi>DgP8{)V|BB_P64_6Ie<3B9oh^r^{?t+&#dPrKSpR@*Tg>Rh%#v2F-;9=E7+_ z4fih<8_9;8=O3H1+$%Lr;wopRJ`J@bezkp$fk;_|2I>Upte2$KE5=UAI63Dtk|5M`1;V z%n!HdSsP!UmX*v7L{4y8Su0u&*k@HZv5^JR1HZ!YZPj@d5cmJKFl9M7I*Gg^4aBg3 z-m>^?AIxsk4YYIBVH74(`YL0VOA2e#`c9KoHc!|@dSyy_I`s3w}JX|{%MjzC#lD)we^nEj!^}=-?lCtb272KWL;tEtw zNZpv@_NmglN}2xJN9XTRBi(p!-`&FjWbI`(*?w}36rmluK3o<~rS)COEKdqw$=ZE@ zBOl7xD`{Y~Vcet_<|B@91)IX=dldGfA(#=nx{7W;B0Bxn;za{H2$^l7&jZLj+W>UA z$iy-yz~{<2mwFgch*uktiK=AZ|U(#9rv%$v^(bSVtWl3;cFA8IO??&Hf?}dFC zz4zn-WbvVX+H9VMCq%t!Jc#4qyo|0Z^Bi}-CL}e@xzwugsU^XpR5uQJsT)zg+5vr8 zH-$bs&rcu?R(lStQRiKjX(xY-017b)>FNA9it zKyjeQ_G9^NZWSqe;S<)>8XmP3u2D^GqJZRiI@I)KHKYc6u|tDBgco~BW0Zw8bO8^v ziALo$ZZquaAv6#>N}B7R;iM@w?%{bx(A+4xsIeA%HL1KqGa*WTqka||=uDC7j|AjKD6Ul3hO{%t~1<1LP)!i zQItHupw2EAgwmjtaPYm#Sh{_d^|J+z=W+p?`pLtz7O~ zjt>$v4f!~4X21Q*%aMz1w|`8}ZT62YM`*$}0>H`HUUoS-h2xGOX_#D(n?vJVB`vx- za|WnEVW^8LdC_&6^miS#U_h*CG0d|=7dc_qrTFX6cs2eaIeI}stVpqL4|+*G%U=GT zkW7E$nzIa-R3*9vBC{d#Z;t~zo z;GoVVGvRs23r>P1t+uwsYAbDRO|2rnb;%-`0LtbD zZlGO!Vnk7tO=14$d+sw^7NNiP^ZBEbXS?gU=bn4cx#yg_@*u6VE0nw6hYi1I4~kEd z1v-)R%`x&YsFic@kkT=Y_FEZf(NkF#0 zeHi4YE~ob!l<)l)Wxn5WKBcjdtIN!L_P)%#?Kxo6BL&5=WreorI9LU_k-zH+DK~vP z2fMckrRn}0IU+P5A*m=~7deSF)<#oBPV&Zqn|2(au2jBF zArUvnlZ@AMK(=aYr_2}4%GYybpnN|hT~8X3M;!x;aPlEh=6 zi;_>9PEb>ro6|+e&Tn$`Se3kU=&?ESE?19L%R8qYyGGs((PK5BuWdc5toMAY-gT{9 zZ-nX{M)l4>y=QQ}*AGxHYE0fZtd`VSbt!9R#65S*dx%61QY)1RxL}Fh> zZhqvN*s@Za|9Lx;141CB@frF=Vy$ZYxW$e+(nZwL7~7%7+Rq~aXrnp$i8SU#D|_z2 zc~JbwMDJpGkFCGnbLD*y_ovBwAMTHr_m|;*xV(qBkRmDD=^_}}Q)koSraF03g_{?k zd!RMG5UPm@R+O@lGL+P|-V?+d1KMPYzrJd-+0sW!$&-luLQx+7)UP}qCF%IHSl3X5 z!BrifMow0Zvo9)Hj{tPDrb|vKAdhj;;owIAtFl_nhh#-B4T&pAOe}ZNssN^}3QU;_ zJjeO~ZRRL{Vq5R141m30KJM(qB@?qsWBw$zGGdLakP<#RRy>Z}{M%$y!R+o?r0* zo!}RF1tEh|o1-{FQnz_SfLRSqAEL@#lucT1_^I-4)UHx?T15QR@;BqnlU$r2y1vEa;K)ovJ{gcW_;N$`f)#Y8fbd? zr{D^P#9yd`h4Z_UF-GEkACN8X$5G{UQEe_XgsLM~QI(cyS(g@mltga zd(tK!4#*4Yri)8nq@r%6M_%&frBGgq<)u_!e0G$j^55&_tEKYNATQ1G(jqVS%gZV| z8i=t$m(%iUMm!ar`^XBZ+9|oV5`<2XOmYL3k`t-#cl4zry`D}G37GCOS7U(5{~hzzKBr60fVdFTvbN~ zM^~UUp{rtFFpxjIjo#{R?acWoPskWPt{;~w)+RoGjp&!j|`q?`e1qL2hTHd zusqWS&og|mJg&j=3{9LkSe{pXgXS4->HJawE{{Q9RLq*9l7unORkA)P-V2HYCHqR= zGQVe4Gs0Nn`dcoe%mJ}3WGu?{HQzK*MmnDOl@;iC;$bV!@x&t`@4m$+R?Bcd-+k)j;*9c6}~f*E=vxTY;SW`dq?vA0>?B*WQvAJsK&Jr+6snh-gj`c z-xPTO-|MD!sRiG#_?QD>_Xe7;FG*;KluDRu87Dr$QSkXhN9y#*wdnMf)ai9NQwHV? z<}X*v!{drWGIBmOH3@?XfGFKxIu5zQmX zPmO(;E6p|baU3(=kDutXC84CO3A8$zlcyEFlRT|(Gt81FTq1!r&O!#H35$;iXwoE# zB-won*I;9#g}(H>X5(dh{?yw&N+U!_@y!WFRZhwJ_Fk8{WtuF@?SC#uPEGc7Z-$5b zk_l)DYWEOxhuY1Drde`sgG@|y`kEu&MDHS~+Ha;RBHt00Phg#4`-d*`xtauAaOcT4 z=AZE>=H;ip|I+#{-b41j3^BKlr7?8g2E4@Hz zEU?R+M}Q^E-U{|xXX5u>w?Ofvj)oBeR1Es zasnpe$R6!xlNyx92>5Z#IY?x)oq$~VwlG3QKE@n!z$sBUF1=eEAKo~pVYgxaW z{VogMndf&)$fp2bha)g!FY{TP4buv3(S6`1ab6W9C$T3$%gXjXn)iU%Q<|eR{>pAk z+nZuMmf4$S0aCt(TNgok2t7d?o0uXC-`Y4Qfla$b?@B#QLGkPJ;_N}V73 zs7kdYZh3|UP7FxK!Pk|rjVfk&Ahb&+f z&QGqw4}U{~=LC!JB0;4w<)Y+DOtXd1<2+mR8O@k(p~nvF9we9kS;n-Bn25h&&a=u= zG_ij`HX$Qzk(GA5OdETaNj?|=1gOd4Su%2canZmv(BvtwMSOBT5Is1%V4&PjUz8#U z`;#2cP3Yo_oIlz%P^P;EsS=72U@()SK<54i)qh?_Nd*^KYg}o%`p>hfx9HJ8wdW2} zdlFts?@dZMza8B6=vmP|TMmqNwjgo?#!{^92d>#(S~L@Ps6 zDgENgtoc>SOeyA9-xhxB!u~)dHqx43zJ=|45N0T|E#~uQ=GwS@I1aPv4yvQKqJb`v zO8`fz=7s@rX8)AIszT;yoNJPPT{M|{{+vCTv5e0Cb+V&8oB2Fj$wU@Wll)>`YSvm4 zDr0XUHEBcQZSYcaX_8iJ`i(A3!jiXC@u9ff9o83lNMg|RWotEkQMaaF-L}62+7PAj zQahaD!-cT)rN=inc=YQ-_#YCsEW)2azA7KueP1*eI zAG^$+5{u1w-r{oDy(!R)7#cTB8xa3X283Tg+~GrVfBPq{zBt=h(jRA+Qx>YiH&7LG z2CX76SQV!ZT!pgcdjX5%kv;D{Cj%S|fe$Vi1Ok*d1%Q;i@r;#vgf)*a_Xth?@K}F2 zWAZP-Z9OT?k1SrLzua-)bc-9P#-ZwIlI{a`fP|NdCnQzANiOL1yqA8k152oQ6zflw%Xcm+iB(`+xU%M{R-0VK>iK{l zlyBaAehQQ*nTk3EpuGE!0OdRaWn3d+5Nb(t=Pv+C>M5_GF319!P7)B6vi3BrlPt4b zmkGZtdjyVypotwJu^x^kb!>lh2sXH(TyC5VV~Sx)*QNwPc(Ux zk7w_>fcNs|6x4wFpT!4%t=Gi1a8Y}i##iqBmuCqD?c6+~Y%HXSj&#&TOxXeM+Q136Ad>nqaSz$=&76A-n8< zk32wi8%zVzz0UGa$m*{P$Uk^ca%abT^{O)Z|)Uoou~0wK@~jGR({m#1le>xe^tJ;g>I_K z#i0Mv?Zo9z9w*MI42m&9aS&20dp1bJXf-G{1ZlJeIlkuW&7u9`id?J!)nbG4c(-2! zO9RT|?Eym@>Nl1S)!KU;A(|cSpEw{^*Z8MiJ0&vGPux_*89U@!lp{Ku)<<22e`3!` zIM<#8Bi9g+$VopbsByB==tefd`TG#b*s7W_-wtM_s53+hBX3sriNDqrC@8eC5Kjwh z2wKjKUAZ2cIS1j=Q3TlTny`3LbG#dJd;m-4mrB}t?iqskM|SBN8xpI%HP zh35y&aRkE4wIw>rngi$CMF*@jpi>L1>`B zCYgRNv*1MHZ1jn=czU$N%h7+(ICkV(G3#!HWr#9wn;ghAe7<%(Cx+yBPR_|5&kw=+ zPkORol@r%z3tF6vrHus*n0C}|s;O;nNSWM5Z|^Or$J?g1+lK88DAmpjA~c5sL?rBs zPPPFVs+c_pi;q}-5_>}iFy%{0KddpIQXmgOhh+yb-mf8sN1?=ndvE}N5v<~v<}EmR zQLlE<4~q*)j@8@gw~Kxz{r1rB0MxwO5n3t{IZYLv+4u(=xI}v*&{SpNOIadtNtJ?= z#=}+rXS1}z8St|!^Y-mkmC1W(4V#Y`Tu$nH?IMBB7jJlD?{b?}J9s4AeDDwS)%s8JGgvoNX; zK8;G^lSHOZEPP_$ttzGIJ}Q|imm@?sasZV=IigCT9N{#w@%fu+e0%bQe)x7dVTwHa zPR)^_2NyBMoDT-fSZog&-?oQ}_OUn}7W>&}B1=C@G7205h)Z!Wd1?+76gKA#k*AXK z=$j9GF5y8`D;{zX|NA-IEn&UYK`nrf3v2#6>{wmhLHr53f%mEr-J*;N6x93W84uwG z*{yhhJr1ZZ*ER>m7s{w0q0zN17XHCSQq@nv`E)p^&K#~0zQwvcsPH}R9Cp%Eh+Ie1 zGAv$A@wZ|xRl6!gFihifSe(V^tcjNxowsG6^WXM@FbAn2vs_&5HGFicDqe@sG6vd@ zdQ0O-1DV*;OM(qfs+Ym_P{ISc^qcaTV~)?Y0o9zLspl>l84~9P#lP74r`H)EflAUX z#<#c!-Wd|#u1civ?V1z?o8DY7p7G63ZOK46&B&86mKop14@|%6QuK?E?n4~DDQOo0 zB@>^nAJ-S3Xj!dhB9~kV3*}0v3Ihu|d_laqx$p(Sf}h$lyZYJzKN$z4P6uaWsElWiHhlZs#8DI64O#iM|v_xmpziaZb`ggfg{$1{*e-{|G zv*Aa!hG<<|vIeB06se+QZe)0aR%WHChMjgInI2*N_6PZVVfv8amMi^foUK*)NzX7? zsXdQMgC)CzVh{Yk@^C~0To;4lHQq}Oh<8N&hLo zXtNxsPD?sab@})2NxSHt*3U(Eophj@6QtV;x``zHbK9(Kn^iV>&9|O++4w;3uvixs zuZ6_B@S<8uOxlTXfvRpI?u=b>9bK6ox$EHfgq)lx>5+>USsuBZDeXc9Q3B~ub+$t; zbe8yn#<2_4V#^^H79Q-7i&*b)$mQn4kbWHiTAXyqb%TGRrUb>|fPQw$AJ;*-#7((N zIm&6+Xe_ZCQx+y@JG@vH8TV|&e$TwxW#47xpvDRmr&1@ z^vQiL(zZ~)t_+En;cqH7 z`A&Piue0fik{Hn!v1u?;vX7*9nCI@$Fprfi_G0-8FTg zOKI9_!`Q+W^>btXP@-2xrJWvL)^wLSc0w+W4OWve8A{cuIT7nf;WJ=3AN$I+=$3#{ z@D4EC@BKXTEz0_i*l50a5}((HoFk0tD^$_lvl|*HXgdO869V#!?f`q!{{4Uy0DbI; zsbLwWc^ecj!*_rc$q(&GBs8%}Z14F!o1L?F5ET@}wr4lTlCb;y{QN#Z(N_BH34veiqUO+Y;cO;~HX#|oVT|Y?h`pHYb=xJn`Sq(a9HDW0 z@EvOg``d;_?%}MII=ymirED`CfpM#6=z)=~Mwzux1jZHOMKRX2@5|v6VS?0fbJ~d* zooF2mk9hZmE0~0BqJdTdJI(wPr85vV$uWF+uvQr=cJ{y?vFRSdRq27?v4oH9 zP#(+Wu&p4$`3UesVKY;s!cKE?UF(dZ(1oq$v*XhaM=#m1E-t^MnOj&Uu9;Rh!!hT= zVzHSGa+Swl3eeIQ5bOQ1T?b(0`qzDy!eE97UARYexGdz^Xc_6U*d8YW?#6+A%!t-} z3

    vY&Y*2ftoElk?P*5>4Ij6ITyAjOREr}X>}DMK&|3Jjp=U9VHGy!V>W7dD|#aH ztGNic7CSOjx$8KZ@x4xV#o?_w^W+h{wISq;BjDGAri?k{0G|lLka_4L+s_4IAGb9q zcKF4PAjy4%D%V^4)#0Y~(SnN7&`Jlbge#-8fUa@Vui8$(92rYbi*+Y@&n|0NzS5D1 zUdScCQ9nQBo-tCc5TB0rF?O6D*pX$nRU)$_kd}U3T zd^#^NvTs6@IZMhH#yl5vOe81GzKcDzr}B~4`gAwka+NhBl3~V@-XG-|-XGhEt=EdW zRPVZlYx?^c^ZbgXLIYd$m$wro@l_@9T`P&Nzapu8YhkMJ99XN8eIy>M`uVDUfvV4K zs8v=3_u!8ke`-`c+^iWtYh!90UKKt3xE}zh#-AF${xmNcdbFEhpAb#-E-a4zY1WhE{It4NrpKd(}*=BvDLHH36Pr ze(|#hnM~h@4w&y`rznHs(U{w+8S?YTcS#%izte-*NFvQZi{qxRKk)kt>5}m|{q`mO z7sMu0fiTEU#g^;6)hEpJl6^ETc!(}g#oQK1v|-tzkP&QUvPg@QT<6~Ubw&@OC7Lna z2Qz{i2+Y;eI>`vG3QBheVqW3_ww!rnKQ`M5P}jC%F0CJuYwJBP#4IT#mnBFVMa2Zc ziCP(NOlPF=K(*A3JJzbwjscYm&ep z|0;;@+-eSo9>NL0oNMQoS)=n2!IiK!dK`vGrg-@^N)dYjIBbh}jB?A-JtM^*DFrf- zNIAC+UHy=wLG|YCM?~60bZqR7Zd)WH!*^e&40mjo?^elozuSp-fvk5=aCFSMHOV$F zm9LAk+gu8NKQXK)Db}4JZXE)<;kZ^IcnnRZ<&8mYgrOj%t zvL-ld) zs$vYRt=P;e#}?hM#tzI{awT3_`qYdM_JzfS8!hN&NaUWvO^6I9Iolkv9c!w29}P9k zePf+2&3k0w!@VAB5|(2ECud|Cw<2m%S@$xYU5nG&jB(n%1PhwE7l%Z6Pm=$u6l2>< z)@SKkhpUNp|HXmf2_nommFlD33A{jdE!;+e*9eq?mXWw)9(fG{LzMc@M!Jv5nn^gh zAwML(M<{%)D^&EaP|?Q(3EAI}a9Ev}^-=%*4Mb6+`xr9cvVfI-XJ6o6TAgsfA(c}Bp$F-@UPBP{ycJ()NQ zw`D@dd`8F6GT;T#6AX7#BI08EpB!c^iQ&EBfEo|3<&MUKZG5E>I7bslH1W1p^i>cC zs^?8K587eGboNAei|pq6qT~s=JK?pp!!8|{x6&0Wv3dPn(6V1!?N2$Gtl>{ryEN%! zLS)c<7_UUQnVGqez>;m3GfadV=-yiHU=-78w+xk-S1J+NF?Ho z>=DcCLu0|)Ht9=5w^+@sw`1+{ZOL0C#I^FUS>~*TqOkz3Qa}SuY%o6|9+~=Na-Z&H zt(A1%xyJ_0=7aJLT}_)z0ggzfsIyY=8@jSL5)?pmHQxX+NItyTfQJVQ0Hf4kOtQ(r zV2>Z{>D-xbAyM#Pn8S>yaLzuUG=6TARE((4Rc-{* z!47{Bc1M)hzqtP6Rg$FX4e>|x@~$IziBOSm^6U~EO0)(BZd*T89h=pn4%OSa$mtjF z_BvF@o2qw*s+8@3M)Y(w_GLo3djprc(foj#F2z};aSgv?d(`9MUQqO5NUSr%dypb7 zPx3A_FXhJy7lfK>dNVXs)L~8nPKo1Gyr)Jw4oHZw1*5k6$(UaWdIM22hLEmR_AsA|8{)!U{TBP-u?+ssq8 zJ8UnRuf9QlGvR&Zys+335*xtW7Of8zZB@bOeikNC7}7(gJtkc42?7sj`wu`}(X=hP zTl0RV7{8TMTlv9**66U!WInV~#Ki1pqoae`{&&^=Z)y8?hK#YtNqSgmz2m|~)SmTf(dH2BKwefI z?O{h;^L9kLw8RFGk6%Fy=Wu-aDJ6ArT4$5tdKQ~%WBDcOgBFiO4b${i+dxwB zPdiK68sAcaU93tD=+j;1pC{+qtkBcN8O~4_v<=`Hm8>r${q2gGhBA53ud#f3{lIf- z!Vca$G?(ti*luCtFqpFEsCt=;P!!<<9I9UK0!|_>bPEyQ3D_7KVV=$OW&~jec4)*f z^KVp0iz*#?)MPB=;*9uA1Gk5pVzpz>N5{~P)2()#B-`=Gkz_kcwxJn~lX5efk#2!c zy4hydEoCYeB>gU)YdG{Qw$x=;e((t0$wpnxjoL1GC2ARomES<)xItp3%dB{t63`=k z%Mb7zJRW+3KT@0|YzVU1{NNzQ zS2`~N7&&^eg+5EM{nmiju@`HOeSX~}MV)H2I-yThjSE|O{k_#?%*r?OK9n#YrN(_8 z$tN#$*XpG}kGN`_a}%e%(TxKWu6!PanX_VkX$HRx?Hw&5WsZt37e_b&F|z_siy(g3tFh^F@L82%VA3`2*W__cawDA zLWJ|D%g|PA@>rC<7^@fDqs$NQr6wAc5+%%M_exS<+K1Ga_9ykFnWR36z>?lVSNW#3 zP=t;g64ngo9J>NXlBMD-NnalErig05omO-JqM9MQ=98 zUnpVjQ`sOqdw^y8_WA4WG=hmc5DjJr4PPXW7-Z|__x?AokS&xNAl$Xj&75~kb z4?cOR)?Kj$^+%|ni%<}j-bzB~t7|aW=UPk6c!rW2BXV3w*mxt5M#i6TrQ29Wg2PyC&>N4AF4?U-y$-X=|-tW8I7*JHlSbZSDub1D<*N4!y^-4oGT9Zp1`#%C{XlpKVN`O1{7*O`%Hg;eRVa-aX3QF*~^Iyo=09JhD=HxtYmGxktuK5&2k+ z$A&m))vF+BO-S36h+ZKFeNi1sP_YCPl(rs}ch!sqo_*!@x$;FRty~DkQeLHQJ)#%$ zDLe8@Rh(l^^gPO=UtXsby{K+Ipc=Uq#IDsz*t@i%mr%Abb|wKipYSF#l^uz=6(q^= za8;|0O_W}Dp#i`%g0XA{)o!&zFYf&YG7{$T2jR*{maY%}16*d67HiAVwjK!RHY(K~ zaY5;z?&2v?9jmOjW4F0F;gVRuiqlb+Y>^zGK`_IdzX4JgAz-PW&(fnNVcz=TvKjK) z7MIorNOT)n>-Sb2i436`niD;PzE#1`(@(O5?Fc70j-P}Jr}OHgNF?c`T2jZ^5WhCN zG(>Wn7!J{GZb)2Jr7a-YX{?4L1)P-D-s#`xtIv&2)r1dF$0R*R^R8bqBs^8ETYQ>E ze;4Iyx>`pGXrOXv2>iN(9%QxlPM&|ANqQ1O+z`#j5nk;ed(^4n+SGC`q`XdU4?@cF z?`yLwjj!0CV8u`rv(B*7hK+)QIngon)}slcAVn@3mXKp>?_~O5k9sI$PV@wPhUr`C zYaY%Q7#b4e)Wyfa89`}2BFm;^Zo1S#u-|$hS$B#c2uD>ZnMFxr;_?&XUBt%R9jIV2#2PR!d=+NRS9P#qV(_?)?C2%nJ6Q3i4Zv@Yn6;}(>K12;T*m=x#;r2Xy%XJ zAxUhX+**p{{l#wnb3M42p~$BEo2t7t(zxU1?$w&AKdL8J6}*Fl#*uGq%~R+2OGH_H{8bZ!|C8 z;jj&gCaHg!YXSZx^$i5n9f_)9Ug>JR-O*vRNJ$MV0F4Rg1oyMC5lS(Vk8a0AtF05P=Dr7(xXms<0Rzh>Wf!K_}Lg1OMy9W&-4j zA2NnW%O0^V+l#5+3pqYt)1O}q(w`GTgY{>oPxgmZd%JdUf2uS3P$zd@>c^dj@ zf1=96eNwVJ)bek3D5XyVnq77)*na!J$?hL~JwwZsrl+cLn~8}vR5fOKLJNFE5S;H) z1)3gknZ)#%*1JP5yKO;3HG_J{^$)7ue652BNRk9U__8%Vx|K|IY!tIW2-MhZL=_y8 zB$yrZiOQH&?G9TbM^@Qrw$3@6ELs*twGOeygGEi>)t$a%{EDB z$06}1KaDCiA@27mAlLf;xK(3Z#d?B$Nn4=#RP&YV4<~v$p!v`rW0!JR;OkGazK*@A zH1Sbvmm{h)EI%=ENrZTe&%@%Y-jig^PZE7{mgLc=BbP*-c<%^{BN|TQA{iY7FZTDZ z0Cb_t>MF>hC@@93|E!s zH)zVk8y32;Gc-a?wDoo;{VC@RwOiRstn5Wr_S20SukC9;9671s(0P&L8xCDZ;t*xe zL-x33zlHoc|6zWImH%uje}R>MLcit@NB*UpA9pv?hrCiYYL2aQ1Vyf(7onkt{q4Jk z1V>m;33|#)Jst6jvBJM{7h$b!<@J?lMeH(3%5st&4Eb? zs!6%)e`&UmG>R=%U<8Rd%JaEiDlA4f0k54(@sAiAYkxmabhIC!f^sK?X`woizvi?b za`{DGto^+q?FU`MH=u00buy2IZ1D;UFKgX_<}>9A8$0M;bP8-XO0`5=WP+u>-(;?R z6*PfT^t!P7TL|?PQmOh(kIFH>x;TI+b|;r_W8zeu4E4nGpD4-g9ybR!!;(s9nbgTF zBqnV%4%POVzxgU*X>^J+G&-tyF@2D6-9vB%<>m+DlAWlg7St0xbv``Nnv22nn7{Z` z)x$3!FspvUqeQH7zr&=~Pe`6`UiXUB6OT^ni9>pgn*`4MUIz}{GDbdMhtxA&thUon zrP=F(zWBb|pl*%_KailiVP{uxGxc_JqQPs!G<>mlB(@b3ZDkG9956q?Zb*2u`9Td$ zvUqT)l`YW~{Dc4+{(vDqAtZu30q}{cF?Tbi|HPb*_R;s=JXHjVNeg~Lxi-`NPP(T~ zhlloSgfaIM%Bq;xeCKciTdc<1$Eooy^P`UdRgdOMn!sh`qzO_Xffn)rn5%?mt@9DPE{+lqS9>l9u4)KEpyg~?P+sP?%TO;?gEypS6 zncwEomAe2dw>sFMX3))ukvnVC!<(@k(7J>-f?kv61f%N!2UE@hfbyYU2BqqKhxoxX zD8IWo4N4qfT&sJTGv8>oR7j4q_-jCEX_#9;gR5N&M@UDn<2NT^7ox5b@XkOb!h%HX z#ro9AgBCwwI8U#YyoBMj^PQg>ca;YYF(*9ohA=Jf!x#1^j56f+}W7!Ij97k1h^Tn6JpAWJh#WDnzSHK-AbU#7fPA^L3 zK=_Mmb$>oRS6k0j^h_P`FSVZQYZ2%+*3(e3EnxVrF;B~bvCAuHI?jS^Q3urVAANs} z553q9uv`Qb|WfkgdEU)G09%5SamTbulb%V+d)3tvZZ#AtChER^&Z{`MCQW$ZQdFC?6|tjo8_oi=0S z0=f^2?y#_#r7$xUBWKea^P>$Q3@4w1lr+s|vGza}mlWWIcW2}z5TdhSOt7+Z4{G%8 zjDAEJzIu_q)2GKcKk~$#pVK@1lY2bQ9Y|t~+<*%U9^E9-`>eLvtsTG}R+}EdUM7h! zoN(TTlz|M^?<gI5tfUTdw}`61)NTd3%eUhjd-wwDSglI07+n2DgFHN9;C>{s_XPb4GKI zFLdDI{UUN|(jR@3={gMXbV=}h0q|V-PA8?(FMO9SY<>R*0b)Hpm=lH}&xPyoU7WlI z7w@}DBcp^YkCyzAcyIoYL2^L#Iv=IS2=V__`2hI?uN_V_wcQrL%GO|mU1B3&Dc_yQ zw__OIsrgovv^YEvo8|ZU_&#Yk%6-;)H_Hb?@z1X^M)+N&Dauk3cr-z5n$2R@d@hy= zY>au>fb$+i1XW@@X1UFrucYC?&%1#UUs?%vM0c9a-LS%PZtVatMt0Bz=jjrov)|Ml zTl$Q^PdhQ1=XCOD4yDl?O#{m|J`YM;1R2F_zO{m-^+Sajv^}+FXFiLuF)j&qU_6#f z{ZMyD3RRx!#6oF|JEudU^Eo!A+?&nEI#LbzVW%TG(fV)Lrs%mZZEh&{L=UlfMuurd zNR+ukMLFu)6cP^5e^b137$-xFfuX9HN0d!5w_}Ht?L<1WH#=X-*e}j!ozJIWFfd+r zIa+?+r&PV;BWLjn-U3`UD&6LsLl~`%=0{!V+)mYdY4jg*6^CWqHPU!$e$UHYX;Zay zed!>eX-YbZx*PK5MExP}hUhee)itGOwu4)Oi}m2fC0;IDCV1`El~kSAb%wp|O5+_i z8Ck*Kuyj04;Ts$v)(BcH>z$JaYq6RL~9pG4nr z)LnEmpKuw1ca6rMA|}6K8pMV?8_m6#No=R;C22f*H#aDx50#s^+4|Xes+h{h>CJNa zQJm8BTh9GWcZTJJSm=qpoX`wEEmB8Z3!TKPfq#5OjV<-KLev?^F1E1um9XdxD`g$w zrnYDSEgjl|wjkY(q%R9gOWNq7{Isp9ZRy!;h&imcPSZ2_fhUGLw*LUYTeHQvrsIU+6Z+!j}o>JN{iMP3UT*m6@-9OC2BK8?=TgwKul z(X$v*HohO5j?a>O7x^4zRrQ`j8C;x5!r#a64;G$b3| z>F%ANiVChaLV!EiJ5m!%-63z6(u9K-8dgv<#e7#Z7jXhKF+`nO?}`o~F5T68oI156 z>Qr?vV$&~kYvOoy>IKoWkOf6;>>Upkm)OiL9N7Zf!eskZeK;py=vJD3XH|oZ`Hian zO?S^v7+n$VP39eK(QC>t0TkJ*>NDKEw}hB?9-`^g`3iT`N!(oTsVGYm)mD>L@Fo>* zjVD6|%_m>F7kKC$&DNcY5qf(+cQV zs0i;;m)u>p^c4*&@by}|TwT2fm8K5vN2R;rHjgbjr_1lbmb$yE+#{(5c3$kKG+#CkC-@L1ZvFAH^{?P7wck`Y{|KJ^ zC!{JmJ=uyAWj#Z9b-LQcuxfgXNOrF;l|*H0k*ro-Wpb%~8)Z+n=>huQHJx4&pKX5i zInB1%ouw=i<+E}Z?CZ>Y^R9Nb_={Ia1{NDD6~x0<iydZ*R+F zv~Q#(VPma+W4_te#%qPI^p^3Fr`e9zVvizn(}s1uL`I%Luypg{4yhzLQ#Di!X|&sIw)DYgyuydU$8950z=yW6aZLx-2b#QE zqD}L*N53HA?oKbR^0=NN1#F%%VU*hbZta1(9cJvE zi*ifeB2w+xLCFx;Qz_eSKC&4qm@Mlby1Mxa8JVQ|B{S9UytRj6ywRN2E_**+r6mMM z#yUFTb16gi2o9z~!@3n-0#lhKWK%pQgp`=M4C2?0|Et?(_WT}3>;l$I!z;fRuk*Z^&7y? zD!PNeW#tVO)KhL5bH{AYk!9HF8uGS9%Tz&_6lI}}~W6HtHtP!ozRKtv!0%j@R%*2|7PnoO;U9n2R*0~*sux;v5kAlLPC)Ay0jd#MP&T*}7~@pq#m z+fz&UZajETiHuW?EAl}n?Xnk_S@rk_?aD~>V=p%~-g^=C3tjlT^?YV#+Wat)NsgpW zKmxa5W}gE#)|lafnW5b1k<@L5JM)nkdsd5?JAcb%C(HA@;Dhu`*=-~L zdErmquz_ZK+ZUc9`FjxMzkX~rUAb#1VQkNLf%W{A$emv13e#e%iJXwPJF0|ep~k&V zl5kG%X+e@7++lq@e|ANWr}w?1!unNiexbUf#7|Vi{DLxdVj)$UzObj{PZbuE^u?`u zHz-Y?+Q3(U^QQIoRIImMWmx@)q>I@uy0^)DzpLkAAR*Z8O8VqxoFC4dfyJ)pN~Ize zgBeu*a7xSk#BAm#=rv6h;wMIdpP>A(-mK#Ea+U8}<7{eYjs_9{woP>>>zGa7sC;5m zxQ^MxDT5=^^eT7HS3K%8X5QIue(mPh|HSOj?R*dWieu>P8f$KcS@NN-(y+qQpC>r!e z_YuTnAhbD2*3rpTTSfvjTehqnWVV=V=nM4VRika@jE6HPjdeat=D9;88T+~|tqt|E z-V+w@@rf*x!eTBp`wQRG_F&1rVCll~O4Di^Ou&GuS9!3$$2L)%ZSDz|`^6xRmyCHYXDJU|~beIkmnX_8Ve&2Sm< zWu0V{qOVx7%;$TU=p|LUv({J$Xeo8e-L<+Sdz&HiJd)JW6ItqYDAS>lvGjG`4Uvna zwE#loss(dJ-%+bi zHOHI_2C|R#y05mouXa4nQCsAzzsZpht86&Befl*e+iLZ{0jB2ay(tA%A8j|a&v0Hf zn|F5l?Dv$##?h=HH)`h4k6PVgF9pc|uxC)VTT_Pv7^u`zYT%NBN%LPrk|i zUU-!J#Yf5S>z6;tN)NC{RUW9IOPp@Ymye?HQQT0VGa0P@& z53WxnfO*pHW)|0diE6346IE4Kve!BwQ$lUtl)&EBEZ*CKUIKetvv_ZdpRgu$ruMdK zvi7!Q`w8JK`=)F)Xf=oG_ltvmv4>3w&DM{PBwBEy2Ks~G`Fgp>Z_La!?|V}A%Nfv% zK~C|dkgfC*9I3;+d4L4PnF+!JBq-HO1NtIgNMEGVuZn)v(oG~EiNW1T8&}b7b`jKM zHe=*>HK1!Hwp8ju`uQRKR>0Qm{3bO%AT|d?m)srw%$Al~syQS+W@o>6)?erE$<{=- zRr45F7J5!|!-sYo+xz`RZb#X8BsZGB;Y~fmxj{wy$_Y7^)g$LAJbIq2(Hou`y%sjK z14C%8{0nc&Ru;?0h1O%Cd|V(OH(Fb4Nk7q^A{w-e{`jo1uFC4pQq?-!%8!^u2LiA? z?2#k$*C#Nq;dKyk@rc=ab4vE1`}O)M@F&uw6MV7U{BC?gj!hvljD<~4eL%$he15n& zv6sdm>A_QKdGM5))t_PC+X(X}ZmD_j1?j@WqUIUw!ZT5dwwar^c``}TWNVZ8tyYKS zT55YjBGYk%4Fw^~AU>z^F;LHv`546qRxF}0N{aL&$_aj=T3 zWIL@9=~o!!8&nAu%dha}zeuQ5$=Oe!cmQHRoxidt0~Ez6XQuF{42q;T)5p(ecr#6o zbtm>H?S5CH`)EE*vWwOIX8VBluvON6`lqz~Ouel-T4v00na{Rj*tg5@2GGJhQwaIx zx2>`xYHI4e^)I_k+BN77Tz9Jae5&})Y8x>@S)1y-@p1J1>kNuRfP7n%mKBJiVxHBS zfn1}~leycxkp0BcdmQRuo6KK3pQXvI;rzC&ln*nd89EBndGD8Ud+N(S@s5wPdgXwp|}!0jZtUdg4l&$C-TBg!cZ?Z-h3 z2?*5_fG?HbCDaLi-6i9fW&4}vTZg*(;rt7-Bt9e*qasd9QYkl2Hc{@<>pXm^pCFlu zbgZu=Tj9Gx8rab5tEkW(_EQHIi_f@FrSUzcm(no9jTc+^MbO2^zhLdDCvl^S&!bc= z4?ZFtG(p97X_><|+Vl?8CqE$k69VE^4~JOt8+jK|ngZ_*uzmDYsww4Lz3oU@BQ8K1 zgi)=*Tc(4jg}pB>n&KDl2E6+g74Uvh7)QFmPQzb}N<)GW(dAEEo}cLSzPoUznuu%O zuNJ<7c-YQc+uUNeD@o*{UY@+nHbV+{9M6w~7+iDmS2zlu;AXct1~Ho^b53mS0T65D`|J5VkuTj9EJ*|iY@sfiz;;ws zFPZP<1$DLfP+c3C>Ww;s#Ji8u_>46uM{6slPAj*J$q9M7@k z1@&x;g(R>4!C@Pyd=4EaRJz)`8W0l2E?ev`6$GDK={*TE4RAG^>WR#k3(y6RVP17x z+(9Xp`OWZkPNvj7=C@IuIEC154tD~hrptLw-ucv##6UZUA$^%k?v9ofqUMFwvaYT_ z4qlf_*7fD@9SmmS_Yfup#8nfdHd$Kf&Z04&T}`62_#wb=RN5UIyxogkMIDK5CZ&cI zAF7x`iXnIhaL)%5!~knkDX%&7?=T&RN#V&Yfx6UO$u-|Acd<)eGJnX=7MiSl5$Kb# zv7MqfY5C$HcT&7*?)*clo9Q)uJvxfvsVde_Ov?g2!+)P8pAS^teP3T*VODwnw|cPh zu*$l`A+wr82$Ux=MQ2P_#rV|tZnTEj{MBCv9^dr#a9@#z>2GF?*KEbKv=Io14Mdtm z#{-BHQqmD9>R9`9&4@Mr{iffsrTvggY-sP9nCNh92z;l#j#?CSwD(ES(QZz3Z23+H zz6Ofgci= z()1pi;mlAa5j3h3&lCWMbAB%wHeH@yhzLzIE+i|m2WJS3P~7LX?mclIiyFNnH1S0; zQZ_rI2lR8}6}bcyA{jSRmI@ieB3>~TfYs+uh*wA<#c&puNoJ>1hQC<38mqKCS`$^T zko5T~YUsw0*h@o1Qw0$K#(>6O?ol33-(!i9w=OIU^45*`>TrTcTuyM?LX)Nt5(uyV zotP1*$-LlmyDfxFPs&bMhu^_6{jhA9`KS#4qg#p$YTL!u+MxpEs`#cVSC4evMC{wT zAddz3OgHGMd-kCsQxicNs49;bqUVT;T)iw8VM)q3EJ<0OsBr6LZc#B-FB>Z=JbIZ& zR7}vzCWwlBy)0iYXLVKJTmSG|hplIvBV#PxG?o^ABnNk?HMnOy%7c51gG%J<3m(k) z5DX*@9wsc|-_3dP3b!@3WA!^dS;KjiFKalT_+3A!U3M%`!#6;VX47VxtSUhF=P&-N zpu6P}0^OVTKA@A3`trB`t!V(T;Ui4}3yN+)QJ+t&)6E%hJN2?GxZVEStZAS$HZoRb z1CHkdwcC@P5AOfcd^qjXqs@oykNj8W!;ZcG)j|FFZyYul`j^o+;;%}s>ScVQOyS&D2kqga-j-kwW z4nOg((E5iQHuI*zGbOSzC1j?bJS101)`wTQ(>9DXgtn_vz6Tues${obcfTq&n94gx zGL%QmYE?0M)v<;b%!yPa`B{^cMyNmro(1T=;e2GOL}s56&NmYq(h1{w> z@_to+dA}+p?;oRCcUOkddQE@sD04qeHAbHI4d^uAR7oN-X1GeW@y-f%PJHz=K6M#! zQKFxs&HclFKwmn{YYB0zIaHd~|JsrEu*~3h4Cl^^S%)ePrISaT<^#Wm8)w`SE5)x< zVr4(&tX1Eo1LQWk$Zpu)O%t&$u*pW<|B=@13t&G za+j+|nz}ltPqDN*U>J|H4Q*g?4Khy2TP(%b(w|bZ`e{2SBl&3Lvz#R)vk*yWVDE(P z#E*(|u$SZ^xjD8mp(Z+OW7Dc_(S2;~Yw5-6$HO>$+^zpN(I$hMeef<3g-j9P2fvge zKpUQ=2+#*V2)+Zs)+OVAId^~92fm*Xe3hmq+2463aNjI%NOo6?m#>z+r6N|z&fd5t z-Pz40|L>iRdAPHU&m=p0=p9yQVvKKd!<2k9EYM){^*W|@tkc!olL?Ev9+dt)=&B~J zc57l$z9#-Y5IkZZ)l*kmEm&Bw(46n}Oia4>)FD=-Ub&iJu;5~AHm4gh-tv`A>-?%p zxjpZzVkTqO81vO%$oOm(F7{Bjn3ZR*BWtDnTu%r(tl~)BUSKz=Cv#MoGvL`{dZe9r-ZB^=EQM zBLP%TRwKWrz8{){)i*X-pU2y!OqW%DkWuB+KOeM8s*m;8{VUX$Vh|@}RT>bfdQJiZ_N?CbD(u=-{XT3>3udIp%Uw+~*~G0dO0|8eyBb3*3)N%#048IAbje+QpJ z#|rP+|2S&@3kT|d|Ee?ke=PH9``?c;pDsK580OREkEiF;nzR42`BXcK=hL^JNY1Bs zULSlu<@cRW=MFTVJaRq-MOS*-Ff3m_%5*yMr(ZXnnE$L#ZzK!nJ@02OtL>J{?8rqI z@Wz~8Q@qNJYcwOP~c%wBr9^uz`Jgjwn|BoFIIO>Vf zW_Z*P7-H|Gz(A~$^Q%dt30nXrZnBPHq$f4mZXeoRY>q^`jggBd%O>X|12DO zKjQ}O&-V+Dy+1$tBlqXa!vCN@d8z*Vc|kkNea1r(}OF+BQgkqVEpapMRZs?EU%d_uQYW&-xGgGd9(q zK+6FA`D6t5XU}8F{?u+Aq(8rXC*2<_t~&a2{J+tk(`0|dna9$f3kK-VDYPD_a0%$< ztthKwH{Lfu$BvgBJ0aCEV~f=>-xVo6lW=Z+JF{1xg?JT=)=|eUIpdhf*UZ)2r>D<2 z7V@0iA1{7z^ZAo02 z59>oI)F#WYKvMk!M@k=bbrxKX3}d(?{*Z)AbaP+-MLFJ2y*1!?pILD1<9)%S44YpR z{5QrsO*oes1B~~XvR`MV`t{3A1C962HwPQ<@ae}i-t&LQeTtv{|HF6}4m#d-_YOAR z$GI3T%I}kKX?nTOc>AC|0Vja&rUHVkPJr?t>N3di)pWo3!(EEUw z9R$Y8Pa1gQNE?KV2q4nvR7YfV#(sNQY+AVu{z$Kw-y6z%>nn<3*UPNOvN_!3X{%+E zede~8nDvPBCNa8un~+K&Zsf`r(f9%57sPHWb+MN*M_9-=PZe3_+DXp_!?~Kd07qIU zx&NL)b&}Tn`04fm=f{v!k9~fOeuQyp*{R1eKh7Uuew>`1A8B%U%{>E5kD)^trmjbm zXmIDoB%RNiA1}O-*{ee#9PTXV$2s}OG(RqVnEUi-{;|xDC4J_{w|T@;GsL(xKRHEU z(S8wg_!kqmF879bhQLf46J#?@ka@*}PLS#PU=w6_E<@(y-zFh*{f6ubk{vJ5)6^Cj zDazf-N?lBQ0iAuMYA_hialjjd$@5%KrCN z#n**R3j6IC$n9!VTl5C-f2T-f>VtU6@!@eZA9#odY4pU5w9;!XV~`51L0Y7WcQeN5 z`jD7jj1x1uXBxS1RQ(LQ~7!A*HO$jeu0_h%g$P3M0afHq5Kdx;3w? zae4f1iH1wFPfW-hppb(H=$uEA1Jv1_H9%SW4JQ=z-*3oJVlGY3@Nst!GQ(5*ZTWqk zYdn3P^ZPs(%IDZeg>dhIkB}-lw4ye({eT1KWG%WjBt~h7pN)SL!$lpMXxHc?(%>Ae zGOcJEkw>-tkOOW}Tg^~WH-aLMF4?Aew`fY)7HVl>&t$;Ku_g1>2@-ULaEWx>?zWk) z*C&CLjbHgCZ>6ODNI@zv>O|GMWl6niA5$<8&>*n62#4qZt3Sv_I37y zC3H8{n3ZeV&^~HhZtCQTa#yCY^{(&t`|g(CRehN!J5)tq{qqD$meN0e(uiJW>7P^k zPa99S^yW0qu~J)PXew;$RW9t@U8PC`KB_Rwd|Esw&8L5ivg73*nWxe%gG+FdrCe>L zwO#gIezIayUfal&EKNjUo}YE3^GyYxruIXEZzLD=JvKf*IVen!bsSRv%m$2wO6PjI7`)oPlrTwNirg7#-=^e zzo6d{59r_9s0Wwm*Dj+BODMx;{f?i}%U^_y;C-qQeso`Og)35^N0*4;EqXAS>es3< zcc+Oc&6Ms1O1BdpZ~S_{iQ}7u>e9nM6KWnjfAB>Q|Dt4{+HU4IwcR-*Aa3||$y>pu zf81FLeuI&h{-3Hr?bF51@QJFzfatC;a?cfW=Q&=n`kI)RpXl^^-(J2k(dCUky!`*b zWB_m(#%F!E=dnNems2zMC+A)%$AYQ3;rt0ciqAA0Rh&aS5n`&9x!9jAbzTOw*c}u% zyUUH-v!@0MiWS4lZ-Zkw?rKonIhH;RrB727V}u=tqtADVxp~0dYH_VAkmT49)-vG5 zv1=`OH00({$hxYAwZpB1+x=o@o+$Nh(0{_O^z0P+oi2?MRTz0W1f;0};pPCW@)(p)N@gRodL^SB%oiJCu~J=4oV;Nb|<&q4NDqT99X@aXLHuetmh2+lA6C?PR!mvcC3^uLZ20y z&&$I}BhC$+;UEuV7$mDyuM+aED*a&J!NL zcN@*w`~dxtp8%Mk!|!&?atDMbD73L$K)|s<%o~d${f=#ZZ#Sn6$zXY*f>J(gow9b| zKz5zbfq*(cuZZw>tE?VY_ZA#G=}iILw(~6rW}Iu6g2%)8+3?uAVqkdmAvU{+*znnV zM6GL*)TV|_mYnr3TbxYLjpmjH5J(mdMO7iulc{gsJWi@O>!^@=$-4wwSl>*=-O*eN zFM9L+`=R0t-cM`X^y4Le$?5xRI7=gA5H!*{zcWs}%Tm^F#x4EkQgh#-ufSF8|Api# z>df!8VduGNee^^=z4801)PM4KdY;LjNrGwN^FZyk=zdr{;hc9gae0A{O^(I>(1KlJ zCqgIxfZdTlZSgD5A1^ky;)LIMRYVrQy)|(XpEM?K_l27qM6~jVVR` zhD*qT=4rZfXzlr@AA z(ub26V)F{P3L4JOPr(-VP=t?9a2r8VeBq{q(%42RdxS07nBwROpqG8yQ=DwiJuCjB z_H>%up05UP&l{X_s33%<42c#tO0bM#H1P%rIY>&CDF%GadmcK%CH`p4Ajp$Ook#yS zg*p?)W}ptI&SZG8ke>kD$vFRXApBW#fbr*N4-_dG1WE-i1kxRKp;Z)MTEgUDYyJ6t=gki31>XtiDiNzSj zeJ=2t=665Op~Q~3k8L$oL3eqnJKiPf&4IbebuPHRY&Jn7T2jFxISxpMR|xZOS@Gpv z)Sw@nlpSB*je>rNigEtXGVrL*?~byh{-lG89q*48P(HL^TS%<;#|{lq?v_?FBd2y8 zN>qr(AJ$yzw1ph){=_bgc`0|iEZ506?WZNW%GD`fyW;*_`@pYr2Y#J1@N37wuWgyH zTU2V)YnM1}C(`vJx}Hy02mSCK{b{vlcQ7TtY9wI08`~m85XW6Me6)={bvK&Ne(_bJ z)pCNrU;uem#_zV)hx9qKb=GFtweg9`tw)@<3diIcECxFJy3sNZiux9U&o@27&~^S* z!7#}KX5)=~-m9EHjRmFlr0?&81)vDE);X}|(?7Cv9-o~D$m2#4_huIHZy4{~E6eQs zoafYwKb^>|4azdV@qaY8HQl35t#;#Rp=vh=FXO;vwYn#G!9UPUS4J~!Rx|ftkYbw> zwXutBQ72W^J1Q)?()zJ7=*OrUq%&2jx&=`R_b^D{jsBFI^=8j<;jV=vRbi!_wiIH; z*HkKkuGmu75T)q?J{^w_2fvp$J5Bc{h$aWXJJhS*c*KhefaI2oM!os&5?MN4Dpu(Y zbnU|F-yFpesXSO+DQh=p<+gG8tE}8+M($n6-B_>%SSuF`0`d~9@6;;1HHWi`FfKXA zWVTf@TZ_y#L}m+E+3?nUWe8;pS%rj>tZ!C-Td`^Qwf+5g@v-!`@ZiAxZMAZDXXI{^ z4aavI@~lqh;bt$l@(k8l>n7e)zN<+t_9J5AFg{M4xTSeSM%|;cc=41kIX3W=Z{*0v?U9W;V1pBx zCDC3f(#2#CL{3j!n>cy}qrU%(h&gOlv0+tmf#W&tJC z7Q7TPrfkw+Rk%02AVHksotLW%;>fM~#aGJXR2%+GvEo-Octdr}f%>{lZXaAtP{R2O zHsx3C4eiC67}A_K#DOLzx-{>8K5l*adV1~e${lKxko|SUVY3cA^7Mi1Bh1F};YVL4 zhXZQr77H1g9>Wdsxh}bEsdCM!%2>AQGe~otMVhMtcH6yj*;*=>ty_o5Wvg!ySsL0> z@T(g$`PKgG7Z>jMnAfj={6LN~3N@Gf)nQ9+=EwkGnmEoJ|CyBH&?Q2D8^3-z;r1t9 zlmSp97&n4=j~^U3P3W4CK8fJf)OP16Rph;EcHZScLsak1<)6Ui;ji@Uf6|^N10y6E zxbIftOa0247kT+YuZchXIlZ*bUr+O;>GQydv%&gBAikBB^~nFn+SP|eRjvDh0l@$_ zcr-oLz0zqax=_vyJ7IW|Ekn-KOi>RiX(}BNHPjFxDNV5fan5#%wD|v{a7Er_hYRU1s`hR zgZf;J)w1t9m7N7enwat2du^l9@6#Kg>hEAbB+^NL7 zlB6yr-jxW($|sC5$mCcW?U)}6Znk6T5bPx9@e;Yp6|7U79>83cK1+EnI@D60`BBVU zQU4&o_{QD~jx*%JXUO2^S1}*OC_6r)>T0SaqcR?2ky=TXXpstGa4byYR|W)~=gLwO z>$hoB6IiNVS_opr54fu2(9I6YJN#w9)g*_OvV@m5-&F{vPdy-R!Nsg|L42jlB)KFp zHcK$MQx9}57$V|Pw@sBU+zJvU3Z|o`^mpc#;w)*r_VLI0mT%9Vmc$PN-@zZNiho|uR<|G#cE=bhP+8T z-o4MNePJ?uml`WuONRnRSELl@>q)vP^{K6udrI!H)c*S!pB@H8l;-?Pp(eb*E+-b) zyY5?5FVwg!!keyzTVX8Q>%!BI7PsNa3!L7$c?vzPw*IS~wDsy=6m1RO)Z2bo@G-i4 z@xo^<6?j#Mb7;$N2|9k6*aV>BzqnrOh6Tr;eg!837d6$%fSC&?H!w-ZRwe$_X_I91 zHPR@n`Sw~Jx*qwMrZvF`#jyv|U~U+GN`g;D`ov;7RNg13i9D=z?g4QQyVtD#(GHGT6vO8I?Q#D|6V0GZRCE26y}S^;0o@Ce+_|x zy~&3W0MR~X8F&nA^*S++ZF>u`dfgR^xL^Rng7YLX9ygF}tNexHUOVLOQ3M8dtfUw3 zkSF4c8C7W>n+lzgZ^VFTmA|0FGYyDO1LD)*MFVKMd9Kqt-ltmU&W8J z!V7BAW|{v$r_KKST3u;A*k>$v^8~DeKqoKLK4v_a%z|JSn&+Ro?6Uw)iPx3<-hw$h z{4$)5aEqWL+;)OPX?A8+S<~A}e&@gGVnP*O0DI)S%f2lcDCGBrdRjaXkChm#Kp9wA zA8i#fZB_2m5za{?NTCgK#Bp4@n^EM0?6?Fx92_SuCi2gBlgOX0;38Y!r^RD{S!eXK&Oo&%UH?W!dBdsFQ_Z-8ED^U@oXO} z?uL^zY~QFZ*f1HH>Kx-^(~mwAk$e;bWzfxzs6~0HP+2h5_7xB`s8K{Aa z^W$}9_lXFzzCnSd2QyYKft95Ew9l7O;lmypmosp%F6i--rx_Y04dl#X9j;nOOL`G5 z>5;QwfuZ#{O<9kPp%7SEIjzShehcmj)JKB)LrPE;%T3JmCL@iX|FkQ8A?7`b16%Q& zeOf4szoXu=(BGo{U1;IQ6RDpB;t8z6dG~U{)!>QRWyJr@od3RoR(=rwIYB6*J_toz znyEn%u9Ely`+dt6eaittOL2z=AT;}%Y5~G?CrIwaFDL-v+&db8pyC6I)It~SEgl|i zb!5il1p#ybQ+lYG~0OgH9J_C<#3?0Gk3qRxq;fKv1Yw$xG;)f){ z4;$Cg1kwXKU}0QZAap2Q0%q&Dn9wI|h+gW44f8G~^aUGwnS1~;7}`jyw=U<9;nlZ8 zK!y#yL52@!_6iv;>HCHZjVaX8SC#XH;+D7lkRf-b0vYD(`-Ti@VeD#NKh;u3^^XeG z{ci<9hEbP%K7b4<02w5o2ESUR-2fJb807O|94wf9O{MJ!7Lv3$;b*$vgU`HZS(~z) ziEMr2=e@1T?==+g*KkcJfXP5596m0?N692Z@iH#Mz_Kip||2GnO*-|d@^=}etU?=~nsNqOY)KKxHA2p0JD5zoelUGCyV24Nb zgG22<2j@blIaYwYZMjwHI7j45T|VEI3GluBMxg4<^wF9%oDS9COIpn--)4K=up&O&x(ehUp^putGB!7J1tvAtG@DZ5J}fd$ReGGyTqWMLh9eqZS@ z?ekoGJ{i7y7dta|0rkj5L$$9@BkD2Usm{!|dp^B^o_2W0Iy2XkY(uvst4}X?;?p+o z&Cbk95-i|vkJHmbUcFG$sGJC|Orz~?c!+o`FvF7pbBe`d&w#m;=XjpoI6}$s;Jjt^ zZ!^1ScC0a!)5i)!GsQVs2pCT{md@H7f5%gbcodiBnOx{(d13HiID0_hHva*OqI8^c zk>sNNw~p{$#RbHB_7-UGsi4RgLw$A~Foy#Vh;_lkf-J}1W%yr~$}s8CfUJ~L+%2;G zLIQD?&EjrIgU!WZzG|9?O{0w^LoN1wte$x%=4BsOFJ>{f zY>LBefFWVS+rMFAHo+1GlXEss&h8jY3GMUQq|2K5%;NK~^To!|eBHrjrS9o$xE9g8 zWOWq55?K_FSAD@6V(CWyqrK5|%qTQcG^#nRg$00DB16~RPGh$5ImRUYHf_D0heFrz zH5+?c(b}!AH}@iPG9yLO4Exq0RN+~&g6?m$T{XZ4hX+Vw5T z_m78`1d$xq>na`7>oxQB(!;=4e*gHgh2*P5Z*q(^+dUENN;c}c>7Ipo{8PuGiKt8? zSEgp1q+b#$_u-9h0U`+YTKp}zdkFR^bopCcvke4z)1>d8_%GvM&ouQ*{D*UU6Mv*C z71sC7_G<(BU5?Myj>naJn4V&yME-cT;|``9n&`yD~g?<)_kDqZ-p?#*F%0jCZ8`9a{$(Ws@AXj;gGIIrXK zwlm|l>Bum$PBpGltAwi5DaP$UPS4I|#*Jsjo&EzeZZM6YjQF75j7l^wenCcUeVQ2+ zY02}~V7Jw?gWRw~f1=5LA5=TJUqQu#5PYJB&8~Nf%%dGd%@Hu$qa2 z8G$>Az%cKNEFK(2Y}n<2j&M$Z6(1>7K7W)`f%lCp9nAh7T4IpA{XtmnonkYP8OX^P zdm&S*A#VpPh^01rTtVlKH1?{mtDTMmlq6q)GzJZJqV3&e~kz+|C&9y zi=Iqsx6>2mTWkO3&+T)lUKt~vx8FeSP}w{s1bX%*B?KB&KbeO;#lyN2cdu`F-S1v! zbN6~3aefSgF}c|JI>@&M&ySsO13kBFH=An0w7zogDK;dF*j!nrnQzyHDK#oE5^zYu z|5O_E#2hvvH?R@8?Gzi48WKI@mPV|{|3az9-(6rIQ$)c_Wmpp78I3e7^XIZ*i3H^% z)fB`uDnU#m`pN5Jl^e7%%>}ZVE%qkxnt$Z+v0XUy3t{M6@qQ1FiQI1R5q~Gze+zrY zDAYU@?i|PZ*w6xdJ7y^cE{dVS0xC=K-T-r+Tp7#1#p1U`{F~D}3pZrYjK@}Ar;TBu z4CpsWxa}+45rZoz9^kYDZ!*jWpEbvjNU<+5{g7ZkuE*>Q~sEB(U4(Ri~MK)(jhA7lb&?zh?_*sl17QF^MyCy|G83Uh(Q+KsGQ$+fa{!rcvPtxI=P_ZJ6 zu`O<&sl#KMJMf(bkxs^g2cqJ89j|COZ_+!6RXnnAU z3i(hHD%Pv!UBk@VKmI!I2mb2s=@)+=SbF2nZ)Q+?qOT57abA1;WuLFMsqqi@cb<^k z$#q}K`Z~8fpwKldnG8bPtZ6@(c9bOsjIzY57-be^=k8dGM1I<>swT} zIrJ!dT{XjhT!k5W|+p`3&Vc@)_`&Qgj&JB$GvM{f42F_ZYO;tU)Ku8g$aY(Fwvgd3zp1CoK$}j6BZJ zNiYemzhD}jR1#!4fk}o*V&4+qVlN3|<+RvofmW zJ8YHCVU7<(WSW^gUJV5VX=eKO$TVg1kMrL3gdvYY0o?f8TA5~a%yQ8h<0om1pU91m z{-Nxi#x!GO#=rY(rkP+8L6Lw#sF88Bh3-OtN{Hru7pdgKCz(o+mMpGd5dfFQM77*R z7%sF)O_a}Af*1La_m98IcW>j~KepACF2Kt3T;}@2OL6~?N8SIU@&4(Lvycz+{;xNK z_itw2zgeQexbLryWAy!%L2Ooh|7sog{aIi^9m+o*W!6k%rpVA(Gf!j9Ty9Ma<;drsVAhbKPuD-RHHoHgJ6W@BIM)+naHWEv$9maM;2jOG9kB@Seg`aiF|RlZuiDmm<5F8idsnzg z$gCHo7OCFvLVqdhLzMq4-bOZ9GEMP)e|jOHKG=Q+=99>KR;!h1HmTWuv5@3_=STv{ zRivrnQVY0fce%fc>*L8J^o^jRzydBT=?WIw65@QNd%!#6(b5Bys5BQg3<4%bgU4Xj zH^}E)ntHR786<33y|%<__2(@AJ5?$18h{%kV8ty`<#lN4>&L#RsrjPwNR-O2jfWFL z9qf}6aIlZ-agz9sBMF)lrGgLkQ6$bHGgoWmO*Kp55+3Q;NM-VRx<9Iss^_^yePfaR z-sDAbEv8<^5Upa1fm}JDx|1S1c>_mBog)ELst?N7^7VRRJ9pUEY|*! z4pX(Q;ubwUYvBFeRWSOdaiyL1uISR|>3)^HLQR4aekc@b>O`Ll?}!Fpm8ET3YH^RT znCv!54KVVfikokNVy$n#LIeDaszm^;|2khbhog^<=651 ze^O=%O_AX%{vQ>E%b8n9+os8iwzn=tZS(VZrAWQx*Kb~Gs||q%({J%X(plhr22?jf z2mIq7B*~Q%Nxx@#TSdP~ylVz@C86RHS8l-m6uKoH9S|ew`Jk$2jgF&O@D23L@t9C^ z9gldj43<#iCVkhb`fd)^cO%#LcRlpISF7&=yW3cRoup(4^M`cxJwY=DFbAe;(2Kn_I1Ql5TjpFnNu&E83hN`qo=wV-fvE>H2<}(ty zb`lD0tCmMDVa1lB{nr6P)lG3I3y)Y5vh`!!H29PehJzeCi4@lj7}ep#aIH`icLBZ> zIGjJ@D6Tc?@E@{X*#bZOB*aG^h37vB36*WsJn{fFuaxmyeB?g(2G6igqBBXJk+aFS%To#?8{~D2>f;L4j{hg_YT%-(w*4?LI3X~gsAw8vVV5$y zl-dO`V~o)m8w^X!%8$w}nw9x6fEwQDq0hnbBxNP0UMV%PFYWb#rYVX6eq?B+bi2Re z-HbNTE7DRVW8PkC?{nsSj%eNY`u*(3?6c24>%aEe`|SPSYpt`8w(1a^=i&IED|bb^ zD%KPXOC-Os*Bp8f9RwVkxYk*tIQ=t7tw#&_WeER>-mr}u90Nz z2n3|qk%PSONgMOyeH2L40dr`JrO;l1qP_C!9wvAAVc(==yG$Os8FvM0T*V#M!o!ZY z!g%pmDyAC9y)k?>c|wXv;X9}Iv~|{1;e;?$Vb2L%g>NiizNHo1+{>xC zmr5U4_rg2kIGXC~+n9rCxz#HVOX=?B?*om0X(>7IHtaqA#`Ydl=-%URZ0~{IyEV+c zwA7W+Dt9j}g)^^A`YcEB|3ugp$8>=`<43l|kA(9-X417|(FgNkiu69pb|%-Pvzp$ z^@D)f6|UlQR+sJ8eYQ#%NicTsDwbrLX;HhfD1sK9R~ALmq7G$|l@^)86-80B$gC`i zrbUp#gJB<(Cc}QYM-V_58R!YG8iHPLLC|f;O9XIY3fz$-6|F3wpsC@a-}4FbdRH!m zt_m8pD)^UH1t+yCXflgPru{{Qq)|fB7m)b37$C{BQ;~fj^85}&k<1N~C@r99EudHhpl5Fi4e0#}!>*}Ad$hD3#J5sit+SrLm0I~QC3KiJ5bIcc zE77?$X3-&hD@j%5+gnKeV-x_;K(5+`N{blBXM{C*Fsa%qyW~>YT?|U?P#Kio@L^UL z1JVV6{IuDqXJF1Tk^er=*7rI11QSWmQ};>G%$%1Qb_*C)gVw12p*5<1N_`MJRMiI! z%09R$r08knY9{)(x1;E3 zAItr(RKGFzl#Il^K)mwgg%V4lAFsTB--Y9q8=PS#Mr8^y!>bvmdnxhCt(#FnKe^c6 zJ(WyZRT=4fp+vu~hLG_%APTNVWM3g+yE z^S8a7CyOB#1o)r5ogs^FX52uL2^tFWiC4q=?IQ?8J%F1}Qva%qAg;bPTuTtodIfvn z@zG)rVEn$EAm;c6%-7;uUDbJfn{GvXvA+vnmJi(*V#*IANYc7RhVScZbnrdB3GuBM zCE~Lf;Byve@$J~td3+y^M10p*{T_U@fdhwR{TC<47p{lz&5ej}t5d``V5SORkpIn> z5UTj!-JRio9gP3o^GEQ%cxb2Pe`79<|Bb#F{x?y}|NbdlhyRrdgZ%FX#{Xt9Rolt? zGnD*qo}^zD|NB8__}@%6{y+F5`Cn1bG95?%e*QQ5-@*UBq~w3E4%gv-r9uV&`x4`S zN3w27Ay-Wg$^X_f{x_BJzeOVd>*M_IJl=^*?2P{f>URdCeyce3o5}No7Mk#dxpF5i zC49BcQofYf#+MQmbSY6rUK@c+iS2OyxeJ#PQ1v3-l-XsZwj4p$IdCQ6Be&!-zE>o2 zft_7b8)Rqwmgng&#?8XD75rK~UMsBQT5jWzF zLq$clSHp?~lF-m5u{B7YG&_6AN!*uKkpnEz*s@I2P8I3@SBWIPYXDnC2$n~yLzBc4 zk>Sh{8O|y)kF`2PZ1vDXIwWz&*+3vj%GS390~;fNTw`_x z=y1y0A<9oB-p!VG9${$f!|eeh{`rWKf6jYZcAjM6fB2DqE<^r#1lv4qxsq+3 zGDZH`hdep(&px(?nhJZUgUA%}1iI<=&Lun#)!gCrU=?(*kL-|NriEE1xMpK|b{DrL+Lq6v(=$`f^8PaAz|In8 zC7D*n{)`K|9nBotRzDJIS`V z5lAQnTg@3JpNyq(npZLx)$`Y z@ma-AI}LZ*sp3u>y^)^z7Ikq)2I>Nfnx?8)j#RFd&wf^FMaB~VKT)p~HI5b?QxtG1Nm5bE z6b1cZ(xNhJQAKD`MQTx5wWy*LsJ31a8r6wXqt1lMu#MDygK&K5I2pE)q$vj77<<~V z8>6*=W3_1i+|bhRLZkwmy^(KN(y~{ECP_uZ?p5-&X028uv|5eSYSpUMYLr5&aeYE-HO&YE zYPAf69l+#o8iMj;(ZYKSEa%}L3@s;Gi!oM#heX@PVGg?9aJu~>m9-+tK;iZP_e15iLeiaFss#<3qCu9iU6E@O4VLj4&^Ye6PQtNyi-be>j4DAdU$+d+^rzW-{d$h(t2^0Am7SkdE$s#} za+d6={i(VqRh&;3EaTo)o>x5}|BYOt{&`h}cwXi5Ti%^2~rk24NuxmPe~HP77U4n;ZtLpxj7z1gAfe7e0Q!=-M(B{pEIjN3`!n{qQg z$+P-vusX)%e|(9HsvbjIvcG%!PcU z(YYD*c~|6S(f?biSa$#3mbnnKZ>JZJkzN!_%UHY`jitl_CBwy2n3h~e@pq~8f9;nQ ze6^h#fT<;wKjwhcdW65Gr4PHi_D~?81_)2h*lSz7F^nl)FDbxy+tz(yaQp#r_R)d$1kOk`-AnT4wcCtwt<~BNa42i(oA|1PP!GJ*`l?lVR#{>u(L#|R7@_*?Wa*5VV7U-MF z>JFQUJo?KenaPC9E@&ov_OdO0H)zZ+ipJb|DNp}KrL6h+lBC>f?W~lB2JHy!2b-SQ zys14@W`tBcY^6Pug8fv%`zZzc=|$d8DZze%Ja-E8f7M6-%Xx~v?(`+0f2)f!=YTl5 zlm`1_3G0u%1uAJC)|X~FNHgrxq`68fjq3e|(*}44h#3%=F4rk^xk5*mkEx`etS|kR zU#awkrz)}&`zOykndNX#6<=EPIT>foi>%Hw^!Qf~}V;}}cL(T(O zGNL=@@g%lnY-CHu(d*cfQQd?x34omiHNg%fD?NE)-Wiwwba2s#?SA! z9=T(*nCrmT1>=Z3!l1uzg45h8IL!^J!Bdi=m+Rn72D4=igE^ncSR{j4E`wRdVWQXn zk5@356%6M6YZ**+6Ka@=D*qlGwAg%W5u!cXpP_|j$wQ;UO>TccmhWI@bs#`zv0%P~ z+4}hoW=2ZZp;ZetiyCP|MQxiNZ9Pm@suXeh$%B1SAXh_+L*3m18P< zo;_kjAs2VrV4tUx!9Eq%0Z9 zA{=!Cl0a8rh65((E(F0c96*WVkx#`82WRqu)o6fz`mz%l4%YGv2Vbxh*8~(*&GMHm zPGZW#vR;rC7f6XuI3*>^EpS4aTL494xdl)qUNhzv2taOuk4df>HpY{ZuahMhfV)g# z($`-J>f6kE%Oo?MHr`u=E1}9H-2<;#5@qI_?&Y{qM*kl(I9#qx#@)65zErn=o{N7M z4mk(q_j>wolIJU!z!KQ;&ue@x`@DvoC$PKccD^%r_R6N?1-{dK&UxcW_~!GybXU8O zo$i~VGxp_{B)Ur`Qj3_+vR$G0R(4{#OYJ5oi%vMrc$ozl$AwRR8+%giK9V9km60jMQl2dZi zdn>}}FdtnNUCQ=#z<4{#Jfs%jpb+4b3PSc-@?9B@5jj~>U{a7JV)HIx!dZO&^t-|^ zpi^+3b!XJTCukPg;*ifeOEU0Yr;UB&baIy(=ULi^$MI25{s(wcEUIL6*ApAmEnd{c zWc$y(ND4yxK*Z#uOtsD*xh}t@x;)|7j$=XSF@8fl=-~v}`UF2)7S1R@jtf5tG@uDADBPYnO9oUFI@>wr)=kr$dGDpumSZQ~ikTd{VMpfiXRq@3QF@S=JE72* zYu~uMBvo0-kT|FgP2nxvrO`dD%9XKq?ry9N9yO#5EnuG(&F+QyPw8*@H$))$%H(SBKTbgw$LT*x zHmB}muHyYEbUBex=S>o+nVz{0NYLnj42@Ap z&0r-btK57uz4x&EKgl2X&M^|hivGX{MSsseR639RM`ah*;o2G zs?*-X4z2g_W51eB8t>tWQlaEMY$?DQJTfuK#Jq*b!~QQxrby!-Z)hOeX#o zz=7(5PeiA9Anf4~x%!hp!1f+~|B9~1meHw%n!O`m^P(8rt{Bx`7}Z`it9}iwBxlvr z>2Fy$g%nD`-``4q-EGWYH;4J_mWlql70h4v>Cs$8OESTq&HoeRYnbgRah9?VZ8nC3 zYa_Db{B-E#3VZ{X*E%cs`?`)#TJ)_xc^f(34Nq0*dpG8RQan|Gs(S9ahVScbq*osH zc4AL_Uzd{=!<7EIe#??I;Dc*rp0tH)(33Wr``I2{!~AT)CCqO*gf&GU+z$0 zsnc@Rr%uZu%i8yk(VOW^mI$ZevRiDGnSFBEh{h`s+5Y5Y@Q_XJON*nz#q;g`XV?Il zD4uUyB|p{#*a?0=1NJDbV9GilrfVSoWa-P+#dA|0auXgr2lt7kxHW`L-|?Uyg2(So zp0A$-WbhfY$-oCY?Kz25(j8VgOqO_2mWrWN7OKmf;D|EIyR`8I+NBv@slOE$55dJN zyxI{p;GPWmh&rsfnUHzXh=N<(!aK<@j$Cvcm13G>%`H;%Sw*;jBA zVTh}^DO~R^2Z+0UE-WaU9K|QiaM(BzTcC4LYkGUY+g%|%swG~N--ga8T09TT)tB@$ zkTi>4EN%*;#+-vv8b8M)L==q?qMe4%IX4H~DfDc4`e{R3e)Jh5TP~zmk1WMiL0qjf zk*^BU_>_}MryTqLQgy)@r`K2>?} zxSgwF!uJFEsO|^!QQi-r*B?9R^}+D-C+vQJ0N+xp{QS5&c0Zs_c0ZsGyC0A(yB{FE z&W_vv4qRv(9_ zrfRe#GB#AFN(ROyPBKj|L6f5}A|Cls?P7-M<lg7s+u_bW{aD zjx2+}vcwSnorwhhiuok}AouyA{Ld2Qe+I~Zk+36{Q8-iBHWOm*>lGze;hg8pqkz{sJ zL}n|Q%woiq@VK31wwB54IcgkKHCBUp8M995#`6WK*TvHa(z1AxSL{ycaJ7NFw$&TT zYoZqVPFm=lTIiFt(5Gmj@2Y@)S*tnpyY4iEzBgU&iH)ly==&3T84>97BhdR8^ys@1 zI2%D<#Gs!?jf1MjQO1M@sl#4V3H4Acp^iNX&kkVMQrKn#rvFAyf0|Q+am3TTLcx2ZAuzX zOf(elzcbC!Zw`rfC2eSnBD*2_(M0h^9R%WCivwm@NW7O*`C~bpUDk}b!$YJWumXR8?)k&nd~2&UGqF(*9cVkpc zwQHFgr)8=`%hUt~Q-A%*oT)vGXduDG2yLMQoB!4rnm-lYb)|vej#^_VxQSXCJ85Zj zYH3W?(wL&4(RmRXGm8xQ#Daff|LYMF+*Krd^%2267!h3N)L%l*=ZDT?Q8n|?C$&)H zpsI1y=Zhe9SyfCRPqh%p*q6|rW+J-w)jFapznpXS2Q$&_TWH4i<;dgYw`fLtLcJ{E zqUo9$wcHmzUmNTmrKZz(X}sAq95^QbPnw3GO@oRKUSYg@99d~7fPd(QQSrU`hVj}s zUCMQq)EN~;(tfCOIp+^Mx-a?8oV<-=Wgq!ZYbW~e*}>w~vr;L7fwEbtF6Yc;ieT!4 z^g*$&$$L=zpb*#poo(Yj*_aX7rdeWMG&5!L^54|4rO}OK7soW zliNAnKMaLLQ5g7vXu*=?9p=#qK5T^Q;)tQm_cw3#53o_nO;?G&UT_iUVi}^VW)a@BA%~G5CKf zHHZJgX$k&Mv+Upntdtp)GK=%%=PBwf0AgQpx1e}b~yogp!-VK^L^EoHeYVz*<|S?)@Nlcx|1 zF_H`LAn5#Q`Pk-C{DFSxD{cY-5`P8(fj)#ey=>u3ckdAx`=oU>!pC<*LA||y_zxGq zOAO1xNM$j|8LIcMDNS?b@}Hu|Hl?Qpd%+xb=v{;Q|p;Wi4mem^ABq zy%%lr){0*5qp1in^Lpo_*L!Db*z0}lE4DAr((`)X_%Om2@p{j~E&<}zS~oX4)3Ns(c$eY`%sUd3Gi(pEQ6{Z(c?YU?hoE{sMncr{B{nvGPlg4 z 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 {-&4v=*3u@2NiBIsQ(S@s+yTCGo*N^#CY1q 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

    MVhEU#KjsT=u9N_{FdaTEW`pHPT>g2XnU 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�ek1jvviU^ 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\?kWw6MmPL_d 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